Sammoa-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- 446 discussions
r495 - in trunk/sammoa-ui-swing/src/main: java/fr/ulr/sammoa/ui/swing resources/i18n
by fdesbois@users.forge.codelutin.com 30 Aug '12
by fdesbois@users.forge.codelutin.com 30 Aug '12
30 Aug '12
Author: fdesbois
Date: 2012-08-30 15:27:33 +0200 (Thu, 30 Aug 2012)
New Revision: 495
Url: http://forge.codelutin.com/repositories/revision/sammoa/495
Log:
refs #1422: little improvements
Modified:
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/SammoaColors.java
trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/SammoaColors.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/SammoaColors.java 2012-08-30 13:27:15 UTC (rev 494)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/SammoaColors.java 2012-08-30 13:27:33 UTC (rev 495)
@@ -51,7 +51,7 @@
// public static final Color NEXT_TRANSECT_ROW_COLOR = new Color(233, 255, 235);
- public static final Color NEXT_TRANSECT_ROW_COLOR = new Color(152, 106, 255);
+ public static final Color NEXT_TRANSECT_ROW_COLOR = new Color(200, 0, 255);
public static final Color OBSERVATION_FOR_ROUTE_ROW_COLOR = new Color(171, 214, 255);
Modified: trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties
===================================================================
--- trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2012-08-30 13:27:15 UTC (rev 494)
+++ trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2012-08-30 13:27:33 UTC (rev 495)
@@ -36,8 +36,8 @@
sammoa.action.quitExportMaps=Quit
sammoa.action.quitImportApplication=Quit
sammoa.action.reload.actions=Reload actions
-sammoa.action.reload.campaign=Reload home screen
sammoa.action.reload.gps=Reload GPS
+sammoa.action.reload.home=Reload home screen
sammoa.action.reload.ui=Reload sammoa ui
sammoa.action.right.tip=RIGHT \: create a new Observation for the observer on the right side
sammoa.action.save=Save
1
0
r494 - in trunk: sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight
by fdesbois@users.forge.codelutin.com 30 Aug '12
by fdesbois@users.forge.codelutin.com 30 Aug '12
30 Aug '12
Author: fdesbois
Date: 2012-08-30 15:27:15 +0200 (Thu, 30 Aug 2012)
New Revision: 494
Url: http://forge.codelutin.com/repositories/revision/sammoa/494
Log:
fixes #1432 : change strate order
Modified:
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/StrateDAOImpl.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Strates.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/StrateModel.java
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/StrateDAOImpl.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/StrateDAOImpl.java 2012-08-29 15:37:14 UTC (rev 493)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/StrateDAOImpl.java 2012-08-30 13:27:15 UTC (rev 494)
@@ -32,14 +32,10 @@
public List<E> findAllByCampaignOrderedByCode(Campaign campaign) {
+ String ql = "FROM StrateImpl " +
+ "WHERE sector.campaign = :campaign " +
+ "ORDER BY sector.sectorNumber, code";
- String ql = String.format("FROM %1$s WHERE %2$s.%3$s = :campaign ORDER BY %4$s",
- StrateImpl.class.getSimpleName(),
- Strate.PROPERTY_SECTOR,
- Sector.PROPERTY_CAMPAIGN,
- Strate.PROPERTY_CODE
- );
-
try {
List<E> result = findAllByQuery(ql, "campaign", campaign);
return result;
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Strates.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Strates.java 2012-08-29 15:37:14 UTC (rev 493)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Strates.java 2012-08-30 13:27:15 UTC (rev 494)
@@ -25,8 +25,7 @@
import com.google.common.base.Function;
import com.google.common.base.Preconditions;
-import com.google.common.base.Predicate;
-import com.google.common.collect.Ordering;
+import com.google.common.collect.ComparisonChain;
import java.util.Comparator;
@@ -42,19 +41,19 @@
}
public static String getCode(Strate strate) {
- Preconditions.checkArgument(strate != null,
- "Can't retrieve code from null strate");
+ Preconditions.checkNotNull(strate,
+ "Can't retrieve code from null strate");
String result;
if (strate.getCode() == null) {
StrateType strateType = strate.getStrateType();
- Preconditions.checkArgument(strateType != null,
- "Can't retrieve code if strateType is null");
+ Preconditions.checkNotNull(strateType,
+ "Can't retrieve code if strateType is null");
Sector sector = strate.getSector();
- Preconditions.checkArgument(sector != null,
- "Can't retrieve code if sector is null");
+ Preconditions.checkNotNull(sector,
+ "Can't retrieve code if sector is null");
result = "" + strateType.getCode() + sector.getSectorNumber();
} else {
@@ -67,15 +66,19 @@
public static Function<Strate, String> toCode() {
return TO_CODE_FUNCTION;
}
+//
+// public static Predicate<Strate> withCode(String code) {
+// return new StrateWithCodePredicate(code);
+// }
+//
+// public static Comparator<Strate> orderByCode() {
+// return ORDER_BY_CODE_COMPARATOR;
+// }
- public static Predicate<Strate> withCode(String code) {
- return new StrateWithCodePredicate(code);
+ public static Comparator<Strate> orderBySector() {
+ return ORDER_BY_SECTOR_COMPARATOR;
}
- public static Comparator<Strate> onCode() {
- return ON_CODE_COMPARATOR;
- }
-
protected static Function<Strate, String> TO_CODE_FUNCTION =
new Function<Strate, String>() {
@@ -84,32 +87,46 @@
return input.getCode();
}
};
+//
+// protected static Comparator<Strate> ORDER_BY_CODE_COMPARATOR =
+// new Comparator<Strate>() {
+//
+// @Override
+// public int compare(Strate o1, Strate o2) {
+// int result = Ordering.natural()
+// .nullsFirst()
+// .compare(o1.getCode(), o2.getCode());
+// return result;
+// }
+// };
- protected static Comparator<Strate> ON_CODE_COMPARATOR =
+ protected static Comparator<Strate> ORDER_BY_SECTOR_COMPARATOR =
new Comparator<Strate>() {
@Override
public int compare(Strate o1, Strate o2) {
- int result = Ordering.natural()
- .nullsFirst()
- .compare(o1.getCode(), o2.getCode());
+ int result = ComparisonChain
+ .start()
+ .compare(o1.getSector().getSectorNumber(), o2.getSector().getSectorNumber())
+ .compare(o1.getStrateType(), o2.getStrateType())
+ .result();
return result;
}
};
+//
+// protected static class StrateWithCodePredicate
+// implements Predicate<Strate> {
+//
+// protected String code;
+//
+// public StrateWithCodePredicate(String code) {
+// this.code = code;
+// }
+//
+// @Override
+// public boolean apply(Strate input) {
+// return code.equals(input.getCode());
+// }
+// }
- protected static class StrateWithCodePredicate
- implements Predicate<Strate> {
-
- protected String code;
-
- public StrateWithCodePredicate(String code) {
- this.code = code;
- }
-
- @Override
- public boolean apply(Strate input) {
- return code.equals(input.getCode());
- }
- }
-
}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java 2012-08-29 15:37:14 UTC (rev 493)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java 2012-08-30 13:27:15 UTC (rev 494)
@@ -630,19 +630,15 @@
public void showNewTransect() {
- // The first strate contains all transect and doesn't have any strate, we remove it because we don't need it
- // in TransectUI
+ // The first strate contains all transect and doesn't have any strate,
+ // we remove it because we don't need it in TransectUI
StrateModel allStrate = getModel().getStrates().get(0);
List<StrateModel> referential = Lists.newArrayList(getModel().getStrates());
referential.remove(allStrate);
- // We keep currentStrate only if there is a defined source strate
- StrateModel currentStrate;
- if (getModel().getCurrentStrate().getSource() != null) {
- currentStrate = getModel().getCurrentStrate();
-
- } else {
+ StrateModel currentStrate = getModel().getCurrentStrate();
+ if (allStrate.equals(currentStrate)) {
currentStrate = null;
}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/StrateModel.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/StrateModel.java 2012-08-29 15:37:14 UTC (rev 493)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/StrateModel.java 2012-08-30 13:27:15 UTC (rev 494)
@@ -25,6 +25,7 @@
import com.google.common.base.Predicate;
import com.google.common.collect.Lists;
+import com.google.common.collect.Ordering;
import fr.ulr.sammoa.persistence.Strate;
import fr.ulr.sammoa.persistence.Strates;
import org.jdesktop.beans.AbstractSerializableBean;
@@ -77,7 +78,10 @@
@Override
public int compareTo(StrateModel o) {
- int result = Strates.onCode().compare(getSource(), o.getSource());
+ int result = Ordering
+ .from(Strates.orderBySector())
+ .nullsFirst()
+ .compare(getSource(), o.getSource());
return result;
}
1
0
r493 - in trunk/sammoa-ui-swing/src/main: java/fr/ulr/sammoa/ui/swing java/fr/ulr/sammoa/ui/swing/home resources/i18n
by fdesbois@users.forge.codelutin.com 29 Aug '12
by fdesbois@users.forge.codelutin.com 29 Aug '12
29 Aug '12
Author: fdesbois
Date: 2012-08-29 17:37:14 +0200 (Wed, 29 Aug 2012)
New Revision: 493
Url: http://forge.codelutin.com/repositories/revision/sammoa/493
Log:
fixes #1433 : resolve issue with new campaign + problem with systemId change
Modified:
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/home/HomeUIHandler.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/home/HomeUIModel.java
trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java 2012-08-29 14:52:48 UTC (rev 492)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java 2012-08-29 15:37:14 UTC (rev 493)
@@ -265,12 +265,27 @@
reloadSammoa();
}
});
+ helper.registerCallBack(
+ "home",
+ n_("sammoa.action.reload.home"),
+ SwingUtil.createActionIcon("config"),
+ new Runnable() {
+ @Override
+ public void run() {
+ if (SammoaScreen.HOME == ui.getScreen()) {
+ HomeUI homeUI = (HomeUI) currentBody;
+ homeUI.getHandler().selectCampaign();
+ }
+ }
+ });
+
// categorie applications
helper.addCategory(n_("sammoa.config.category.applications"),
n_("sammoa.config.category.applications.description"));
helper.addOption(SammoaConfig.SammoaConfigOption.SYSTEM_ID);
+ helper.setOptionCallBack("home");
helper.addOption(SammoaConfig.SammoaConfigOption.DATA_DIRECTORY);
helper.setOptionCallBack("ui");
// helper.addOption(SammoaConfig.SammoaConfigOption.CAMPAIGN_DIRECTORY);
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/home/HomeUIHandler.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/home/HomeUIHandler.java 2012-08-29 14:52:48 UTC (rev 492)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/home/HomeUIHandler.java 2012-08-29 15:37:14 UTC (rev 493)
@@ -154,6 +154,7 @@
}
List<Flight> flights = flightService.getFlights(campaign);
+ ui.getModel().setFlights(flights);
Set<String> systemIds =
Sets.newTreeSet(Iterables.transform(flights, Flights.toSystemId()));
@@ -163,17 +164,6 @@
if (logger.isDebugEnabled()) {
- String flightsString = "[" + Joiner.on(";").join(
- Iterables.transform(flights, Flights.toFlightNumber())
- ) + "]";
-
- logger.debug("Init flights combobox = {}", flightsString);
- }
-
- ui.getFlightListModel().setElements(flights);
-
- if (logger.isDebugEnabled()) {
-
String systemsIdString = "[" + Joiner.on(";").join(
systemIds
) + "]";
@@ -211,7 +201,7 @@
getModel().setSystemId(systemId);
- Collection<Flight> flights = ui.getFlightListModel().getElements();
+ Collection<Flight> flights = ui.getModel().getFlights();
List<Flight> filteredFlights =
Lists.newArrayList(Iterables.filter(flights, Flights.withSystemId(systemId)));
@@ -260,6 +250,7 @@
}
public void showNewCampaign() {
+ context.setCampaignId(null);
context.changeScreen(SammoaScreen.CAMPAIGN);
}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/home/HomeUIModel.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/home/HomeUIModel.java 2012-08-29 14:52:48 UTC (rev 492)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/home/HomeUIModel.java 2012-08-29 15:37:14 UTC (rev 493)
@@ -23,10 +23,14 @@
* #L%
*/
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
import fr.ulr.sammoa.persistence.Campaign;
import fr.ulr.sammoa.persistence.Flight;
import org.jdesktop.beans.AbstractSerializableBean;
+import java.util.List;
+
/**
* Created: 19/07/12
*
@@ -38,6 +42,8 @@
public static final String PROPERTY_CAMPAIGN = "campaign";
+ public static final String PROPERTY_FLIGHTS = "flights";
+
public static final String PROPERTY_CAMPAIGN_FOUND = "campaignFound";
public static final String PROPERTY_SYSTEM_ID = "systemId";
@@ -48,6 +54,8 @@
protected Campaign campaign;
+ protected List<Flight> flights;
+
protected String systemId;
protected Flight flight;
@@ -65,6 +73,19 @@
firePropertyChange(PROPERTY_CAMPAIGN_FOUND, oldValue != null, campaign != null);
}
+ public List<Flight> getFlights() {
+ if (flights == null) {
+ flights = Lists.newArrayList();
+ }
+ return flights;
+ }
+
+ public void setFlights(List<Flight> flights) {
+ List<Flight> oldValue = ImmutableList.copyOf(getFlights());
+ this.flights = flights;
+ firePropertyChange(PROPERTY_FLIGHTS, oldValue, flights);
+ }
+
public boolean isCampaignFound() {
return campaign != null;
}
Modified: trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties
===================================================================
--- trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2012-08-29 14:52:48 UTC (rev 492)
+++ trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2012-08-29 15:37:14 UTC (rev 493)
@@ -36,6 +36,7 @@
sammoa.action.quitExportMaps=Quit
sammoa.action.quitImportApplication=Quit
sammoa.action.reload.actions=Reload actions
+sammoa.action.reload.campaign=Reload home screen
sammoa.action.reload.gps=Reload GPS
sammoa.action.reload.ui=Reload sammoa ui
sammoa.action.right.tip=RIGHT \: create a new Observation for the observer on the right side
1
0
r492 - trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map
by fdesbois@users.forge.codelutin.com 29 Aug '12
by fdesbois@users.forge.codelutin.com 29 Aug '12
29 Aug '12
Author: fdesbois
Date: 2012-08-29 16:52:48 +0200 (Wed, 29 Aug 2012)
New Revision: 492
Url: http://forge.codelutin.com/repositories/revision/sammoa/492
Log:
fixes #1427 : set END date properly
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.java
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.java 2012-08-29 14:43:17 UTC (rev 491)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.java 2012-08-29 14:52:48 UTC (rev 492)
@@ -222,6 +222,9 @@
LegStatus.END,
record);
+ // add date using the current route one
+ fillDateRecord(route.getBeginTime(), record);
+
// add geoPoint data and flush
fillGeoPointRecordAndFlush(geoPoint,
record,
1
0
29 Aug '12
Author: fdesbois
Date: 2012-08-29 16:43:17 +0200 (Wed, 29 Aug 2012)
New Revision: 491
Url: http://forge.codelutin.com/repositories/revision/sammoa/491
Log:
fixes #1418 : change link between observation and position
Added:
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Position.java
Removed:
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/ForceSelectionSelectionModel.java
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/DecoratorService.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/BaseFlightController.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.java
trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java
trunk/sammoa-persistence/src/main/xmi/sammoa.zargo
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightBar.css
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/EffortPanel.css
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/EffortPanel.jaxx
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/EffortPanelHandler.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/ObservationTableModel.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/RouteTableModel.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TableDataChangeListener.java
trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/DecoratorService.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/DecoratorService.java 2012-08-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/DecoratorService.java 2012-08-29 14:43:17 UTC (rev 491)
@@ -27,6 +27,7 @@
import fr.ulr.sammoa.persistence.Flight;
import fr.ulr.sammoa.persistence.Observation;
import fr.ulr.sammoa.persistence.Observer;
+import fr.ulr.sammoa.persistence.Position;
import fr.ulr.sammoa.persistence.Region;
import fr.ulr.sammoa.persistence.Route;
import fr.ulr.sammoa.persistence.RouteType;
@@ -124,6 +125,15 @@
return result;
}
});
+
+ registerDecorator(new Decorator<Position>(Position.class) {
+
+ @Override
+ public String toString(Object bean) {
+ Position position = (Position) bean;
+ return _(position.getLabel());
+ }
+ });
}
};
}
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java 2012-08-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java 2012-08-29 14:43:17 UTC (rev 491)
@@ -42,7 +42,6 @@
import fr.ulr.sammoa.persistence.Observation;
import fr.ulr.sammoa.persistence.ObservationDAO;
import fr.ulr.sammoa.persistence.ObservationStatus;
-import fr.ulr.sammoa.persistence.Observations;
import fr.ulr.sammoa.persistence.Observer;
import fr.ulr.sammoa.persistence.ObserverPosition;
import fr.ulr.sammoa.persistence.ObserverPositionDAO;
@@ -352,7 +351,7 @@
// delete observations
List<Observation> observations = getObservations(tx, flight);
// keep observerPositions to delete
- positions.addAll(Observations.toObserverPositions(observations));
+// positions.addAll(Observations.toObserverPositions(observations));
ObservationDAO observationDAO = SammoaDAOHelper.getObservationDAO(tx);
observationDAO.deleteAll(observations);
@@ -750,7 +749,7 @@
public Observation createObservation(TopiaContext transaction,
Flight flight,
Date beginTime,
- ObserverPosition observer)
+ Position position)
throws TopiaException {
Observation result;
@@ -761,7 +760,7 @@
result = dao.createByNaturalId(number, flight);
result.setObservationTime(beginTime);
- result.setObserverPosition(observer);
+ result.setPosition(position);
result.setObservationStatus(ObservationStatus.NEW);
return result;
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/BaseFlightController.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/BaseFlightController.java 2012-08-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/BaseFlightController.java 2012-08-29 14:43:17 UTC (rev 491)
@@ -39,7 +39,6 @@
import fr.ulr.sammoa.persistence.Observation;
import fr.ulr.sammoa.persistence.ObservationDAO;
import fr.ulr.sammoa.persistence.ObservationStatus;
-import fr.ulr.sammoa.persistence.ObserverPosition;
import fr.ulr.sammoa.persistence.Position;
import fr.ulr.sammoa.persistence.Route;
import fr.ulr.sammoa.persistence.RouteType;
@@ -488,48 +487,6 @@
}
}
- public void insert(RouteType routeType) {
-
- switch (routeType) {
- case LEG:
-
- if (currentRoute != null) {
-
- switch (currentRoute.getRouteType()) {
- case LEG:
- add();
- break;
-
- case CIRCLE_BACK:
- case TRANSIT:
- begin();
- break;
-
- default:
- }
- }
- break;
-
- case TRANSIT:
-
- if (currentRoute != null) {
-
- switch (currentRoute.getRouteType()) {
- case LEG:
- end();
- break;
-
- case CIRCLE_BACK:
- case TRANSIT:
- default:
- }
- }
- break;
-
- default:
- }
- }
-
@Override
public void next() {
@@ -562,25 +519,23 @@
Date currentDate = geoPoint.getRecordTime();
- ObserverPosition observer;
- if (currentRoute == null) {
+// ObserverPosition observer;
+// if (currentRoute == null) {
+//
+// // problem we don't have any observerPosition
+// observer = null;
+//
+// } else {
+// observer = currentRoute.getObserverPositionByPosition(position);
+// }
- // problem we don't have any observerPosition
- observer = null;
-
- } else {
- observer = currentRoute.getObserverPositionByPosition(position);
- }
-
if (logger.isInfoEnabled()) {
- logger.info(String.format("Create Observation %2$s at %1$tH:%1$tM:%1$tS.%1$tL (observer = %3$s)",
+ logger.info(String.format("Create Observation %2$s at %1$tH:%1$tM:%1$tS.%1$tL",
currentDate,
- position,
- observer != null && observer.getObserver() != null
- ? observer.getObserver().getInitials() : "")
+ position)
);
}
- Observation observation = service.createObservation(transaction, flight, currentDate, observer);
+ Observation observation = service.createObservation(transaction, flight, currentDate, position);
transaction.commitTransaction();
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.java 2012-08-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.java 2012-08-29 14:43:17 UTC (rev 491)
@@ -39,6 +39,7 @@
import fr.ulr.sammoa.persistence.GeoPoints;
import fr.ulr.sammoa.persistence.Observation;
import fr.ulr.sammoa.persistence.Observations;
+import fr.ulr.sammoa.persistence.Observer;
import fr.ulr.sammoa.persistence.ObserverPosition;
import fr.ulr.sammoa.persistence.Position;
import fr.ulr.sammoa.persistence.Region;
@@ -521,13 +522,17 @@
record.put("SWIM_DIR", observation.getSwimDir());
record.put("CALVES", observation.getCalves());
record.put("PHOTO", observation.isPhoto());
- ObserverPosition observerPosition = observation.getObserverPosition();
+
+ ObserverPosition observerPosition =
+ route.getObserverPositionByPosition(observation.getPosition());
if (observerPosition != null) {
- if (observerPosition.getObserver() == null) {
- record.put("OBSERVER", observerPosition.getObserver().getInitials());
+ Observer observer = observerPosition.getObserver();
+ if (observer != null) {
+ record.put("OBSERVER", observer.getInitials());
}
- record.put("SIDE", observerPosition.getPosition());
}
+
+ record.put("SIDE", observation.getPosition());
record.put("STATUS", observation.getObservationStatus());
record.put("COMMENT", observation.getComment());
Modified: trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties
===================================================================
--- trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties 2012-08-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties 2012-08-29 14:43:17 UTC (rev 491)
@@ -15,6 +15,7 @@
sammoa.config.gps.handler=GpsHandler class \: fr.ulr.sammoa.application.device.gps.GpsHandlerGpylon or fr.ulr.sammoa.application.device.gps.FakeGpsHandler
sammoa.config.gps.speed=GPS speed for capture
sammoa.config.gps.timeout=Time in seconds before GPS going to timeout (always the same data is received for this laps of time) and return error
+sammoa.config.license.organizationName=
sammoa.config.log.file=Path for application log file
sammoa.config.system.id=Id of the default system to use
sammoa.config.tmp.directory=Temporary directory used for different task (import, export,...)
@@ -38,3 +39,9 @@
sammoa.flight.decorator.newFlight=New flight
sammoa.flight.decorator.notEnded=not ended
sammoa.flight.decorator.notStarted=not started
+sammoa.position.backLeft=LEFT
+sammoa.position.backRight=RIGHT
+sammoa.position.coNavigator=CENTER
+sammoa.position.frontLeft=LEFT
+sammoa.position.frontRight=RIGHT
+sammoa.position.navigator=CENTER
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java 2012-08-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java 2012-08-29 14:43:17 UTC (rev 491)
@@ -26,11 +26,9 @@
import com.google.common.base.Function;
import com.google.common.base.Preconditions;
import com.google.common.base.Predicate;
+import com.google.common.collect.FluentIterable;
import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
import org.apache.commons.collections.CollectionUtils;
-import org.nuiton.util.DateUtil;
import org.nuiton.util.PeriodDates;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -38,7 +36,6 @@
import java.util.Date;
import java.util.Iterator;
import java.util.List;
-import java.util.Set;
/**
* Created: 16/07/12
@@ -58,35 +55,12 @@
return Iterables.transform(observations, TO_DATE_FUNCTION);
}
- public static Set<ObserverPosition> toObserverPositions(Iterable<Observation> observations) {
- return Sets.newHashSet(Iterables.transform(observations, TO_OBSERVER_POSITION_FUNCTION));
- }
-
public static Iterable<Observation> filterInRoute(Iterable<Observation> observations,
Route route,
Iterable<Route> routes,
boolean ignoreDeleted) {
return Iterables.filter(observations, inRoute(route, routes, ignoreDeleted));
}
-//
-// public static Observation findFirstInRoute(Iterable<Observation> observations,
-// Route route,
-// Iterable<Route> routes,
-// boolean ignoreDeleted) {
-//
-// Observation result;
-// if (route == null) {
-// result = null;
-//
-// } else {
-//
-// result = FluentIterable.from(observations)
-// .filter(inRoute(route, routes, ignoreDeleted))
-// .first()
-// .orNull();
-// }
-// return result;
-// }
public static boolean inRoute(Observation observation,
Route route,
@@ -121,13 +95,9 @@
Date begin = previousRoute.getBeginTime();
Date end = nextRoute != null ? nextRoute.getBeginTime() : null;
- boolean result =
- DateUtil.between(observation.getObservationTime(), begin, end);
+ PeriodDates period = new PeriodDates(begin, end);
- // Max bound exclusive
- result &= !observation.getObservationTime().equals(end);
-
- return result;
+ return inPeriod(observation, period);
}
public static Predicate<Observation> inRoute(Route route,
@@ -136,6 +106,24 @@
return new InRoutePredicate(route, routes, ignoreDeleted);
}
+ public static boolean inPeriod(Observation observation, PeriodDates periodDate) {
+
+ Date thruDate = periodDate.getThruDate();
+
+ boolean result;
+ if (thruDate == null) {
+ result = periodDate.afterBegin(observation.getObservationTime());
+ } else {
+ result = periodDate.between(observation.getObservationTime())
+ && !thruDate.equals(observation.getObservationTime());
+ }
+ return result;
+ }
+
+ public static Predicate<Observation> inPeriod(PeriodDates periodDate) {
+ return new InPeriodPredicate(periodDate);
+ }
+
public static void removeOtherSpecies(List<Observation> observations,
List<Species> species) {
if (CollectionUtils.isNotEmpty(species)) {
@@ -154,29 +142,37 @@
public static List<Observation> retainsObservations(List<Observation> observations,
PeriodDates periodDate) {
- List<Observation> result = Lists.newArrayList();
- Iterator<Observation> itr = observations.iterator();
- if (periodDate.getThruDate() == null) {
- Date fromDate = periodDate.getFromDate();
- // no up bound
- while (itr.hasNext()) {
- Observation observation = itr.next();
- Date observationTime = observation.getObservationTime();
- if (fromDate.before(observationTime)) {
- itr.remove();
- result.add(observation);
- }
- }
- } else {
- while (itr.hasNext()) {
- Observation observation = itr.next();
- Date observationTime = observation.getObservationTime();
- if (periodDate.between(observationTime)) {
- itr.remove();
- result.add(observation);
- }
- }
- }
+// List<Observation> result = Lists.newArrayList();
+// Iterator<Observation> itr = observations.iterator();
+// if (periodDate.getThruDate() == null) {
+// Date fromDate = periodDate.getFromDate();
+// // no up bound
+// while (itr.hasNext()) {
+// Observation observation = itr.next();
+// Date observationTime = observation.getObservationTime();
+// if (fromDate.before(observationTime) || fromDate.equals(observationTime)) {
+// itr.remove();
+// result.add(observation);
+// }
+// }
+// } else {
+// while (itr.hasNext()) {
+// Observation observation = itr.next();
+// Date observationTime = observation.getObservationTime();
+// if (periodDate.between(observationTime) && !periodDate.getThruDate().equals(observationTime)) {
+// itr.remove();
+// result.add(observation);
+// }
+// }
+// }
+
+ List<Observation> result = FluentIterable
+ .from(observations)
+ .filter(inPeriod(periodDate))
+ .toImmutableList();
+
+ Iterables.removeAll(observations, result);
+
return result;
}
@@ -188,14 +184,6 @@
}
};
- private static Function<Observation, ObserverPosition> TO_OBSERVER_POSITION_FUNCTION = new Function<Observation, ObserverPosition>() {
-
- @Override
- public ObserverPosition apply(Observation input) {
- return input.getObserverPosition();
- }
- };
-
private static class InRoutePredicate implements Predicate<Observation> {
protected Route route;
@@ -220,4 +208,19 @@
}
}
+ private static class InPeriodPredicate implements Predicate<Observation> {
+
+ protected PeriodDates periodDate;
+
+ public InPeriodPredicate(PeriodDates periodDate) {
+ Preconditions.checkNotNull(periodDate);
+ this.periodDate = periodDate;
+ }
+
+ @Override
+ public boolean apply(Observation input) {
+ return Observations.inPeriod(input, periodDate);
+ }
+ }
+
}
Added: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Position.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Position.java (rev 0)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Position.java 2012-08-29 14:43:17 UTC (rev 491)
@@ -0,0 +1,33 @@
+package fr.ulr.sammoa.persistence;
+
+import static org.nuiton.i18n.I18n.n_;
+
+/**
+ * Created: 29/08/12
+ *
+ * @author fdesbois <florian.desbois(a)codelutin.com>
+ */
+public enum Position {
+
+ NAVIGATOR(n_("sammoa.position.navigator")),
+
+ FRONT_LEFT(n_("sammoa.position.frontLeft")),
+
+ FRONT_RIGHT(n_("sammoa.position.frontRight")),
+
+ BACK_LEFT(n_("sammoa.position.backLeft")),
+
+ BACK_RIGHT(n_("sammoa.position.backRight")),
+
+ CO_NAVIGATOR(n_("sammoa.position.coNavigator"));
+
+ private String label;
+
+ private Position(String label) {
+ this.label = label;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+}
Property changes on: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Position.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Modified: trunk/sammoa-persistence/src/main/xmi/sammoa.zargo
===================================================================
--- trunk/sammoa-persistence/src/main/xmi/sammoa.zargo 2012-08-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-persistence/src/main/xmi/sammoa.zargo 2012-08-29 14:43:17 UTC (rev 491)
@@ -1,90 +1,99 @@
-PK;cAsammoa.argo�TK��0�ﯰr��l�B��.�bϕO���8��zƱ�8}����JQ5��y�̔\7��@T�*{�Uw��Bծ��rK�G�ζJ����,#e��(Ot�#T���weq�'���)c�(��+
+PKhiAsammoa.argo�TK��0�ﯰr��l�B��.�bϕO���8��zƱ�8}����JQ5��y�̔\7��@T�*{�Uw��Bծ��rK�G�ζJ����,#e��(Ot�#T���weq�'���)c�(��+
X�}c��^N�q�������)��V�7J
_���\(�9��@�PJ�= ����j�V�����N���%�C�H�N��I����L<�'9�h���R���Vh��I�Ijì�`O���A4��^�I��*p�����G[N�i�P�=
�V�Ch��(`�5��18��!F��NݹU�'��nP5eq&��/�����<��-�����휈3F��@ o4�|T���jIm�&o�g&���v�e���*�����LJ��OO+FM݆4F
�2j�-J�☆��y��E�uT�Ge�y��g��}䞽~nh:�B�ӝ�7�_���3
-V��M�w��d����o�zm�j�4�s�%�Ts�m�����}I�gi�q{�qi�����Xҳ��^[7L��2���ճ-��wc�UY%�]<�q��d�h�����G<1�hx����7PK��DH�PK;cAsammoa_Diagrammedeclasses.pgml�]��8r�?O���VRe�!@$g��:+�e��dkkkJG�9֮$���3N��y���D�F�IAERɸ�IэF���?����t�5\,'���t���Q4�̟^������b��7���/7�����v���o�������^����/���p9ZL�W�Ӣ���p���E����i1�],W��d��r�X�V�Ex��\��˻��p���\�?{��W���+愈1��\��w��W��8?8��g��w��3���/�Ϛ�|X�Q��p��7������y{������X�)���1��9��?��r����p��/���a�~N���U��շ��/����Ώ�s����rw!z��p�ZL֫P�:�E���[�X����t�"�}M����q�����g>�蟡x���-����Oo��z^L�W��o�K�|�G���i
-o�"}'�~�1����w9����>����K8y���#G���OO��yr������?V���4p$�jG�� ���T�S6�� ����h�J�f=����������d��|��c���������w�X/W���h���p�W���7���|���O��wn�T��"}�(�I��J�����\(Q"�4���lE���U��L/�ཽ�^"�&R[��+|!�[�
-�֨i�f��w���fn�x�z�>��*k�ٚ�w���˟Ysd�(�f9,�D���4]��ǿ��������'I���h�)�ש6��LL�����L�Z���֔��\.�-�:�=��m�a���0wUŐR�<�PR��߿LVaMy��.�T��'�`�h�vy>�R��9�a����IT)F�q ��]��4�?��p�o�5?.�"� =�ň���b�_p�I1�A-��"���%x������
-G�� N�]�q��+�����]��i4N�a��!���p^��_����%���'�p�1��W�x%x����Ûd��LFo������*|
-��)�Y�T&�t����R��~��(؞�1��Q���1j@�`i�/,p�*k&��1��c�s�w�1!��fƄ����1!$ń8������v�5����bB���G��;����=,�!k!��D�#B�Ix:i!a}j+��!�E���M�'"������Qf�7�JDv#B
-����0�uUè!M&9H0���s�!�AH�՟G����x��A:�n�_)���giq!y�{ZJ�Ec�Jl���E�:�:X�]�v���;X�n�T,� B]̍s�db����v��m����po=�X|����6���c��7���ï�/��e6�߂%K���8ʪ¾��ܓ�p��p�#�Y������#��型B��[�į"��� ʬ�]DI:͎5���J�ujZ�M�`���tzNj����`����n��
+V��M�w��d����o�zm�j�4�s�%�Ts�m�����}I�gi�q{�qi�����Xҳ��^[7L��2���ճ-��wc�UY%�]<�q��d�h�����G<1�hx����7PK��DH�PKhiAsammoa_Diagrammedeclasses.pgml�]m��6���_�*{B� &����s�c����m��R�k�����[���w�;��H��lR�D��nR�D���F���t����q6�.��h���p�
+��(O����rw��=����^�������}�<=�>�����σg�.ƫ�3~E��8\�ӧU�h�p1\<Dk~Q��x:|X/���j:�m�Z�G��"�XO/~����l�\^o���������sB�y��\/&s���q���<��A��W϶�z��������w��5/��i{������X�)�~�=��9��S��#��O��N���Y�j2�-���pF�oO�_������p1�����B�����j��ޯW��u:�/�p��[���!��l�"�y͢ūg�q�����g>���P�a������p�{�����O����*���{鏛��h5�?�B�\����W�8��?}�/w��?����uw�| �_V|�(��2���i�3On0�~;�U��J8���Sm�H8A�j�v��=�#6}?��d�̢��w��p6�z������h6V������3���z��N���f9]�s.��_�-��%�/����B�.ˋ�Q��ܬ����Z�?�/J�,J/��?��O�����U��L/�ཽ�^"/(mImU���%K�&�&)���w���fn�x��~�NU]k�ٚ����?�
+�Y��Uh^��+��_f�����շ�<�?����}�4_��T�u�L�����L�Z���֔��\.�-�*z|.V�����������*����.J�a��/�UXs=�kR�]��`�h�vyNV�n���0�����AT)F�q ����.�{�V_8��њJwK��b��ip��o8�q��Kg��
+x��]��
+����J'��Y�8��
+x�%x{��Y��,
+gW�0��E�p8/E�� ���g �����c��O�R����މ������O_����q�'��|>���g����Q�&�t����R��~��(؞�1��Q�+;�cԀ�V���� ��*2��g��P�{�s�9ۘ�N3cB�~����bBSQ�ppz;��~LI1����#m�� }^qq�"B�ZD���dI"�!�$<���� ���6="������#B�D��R�5���X��nDh�av��z]�0j@H[�$ؚ��s�!�AH�՟G����x��A:�n�_)���giq!y�{ZJ�Ec���N���n�~,Ȯ�e�u��,g�u�}!B]̍s�d�h��|���_�po}�X����6���c��7���ï-��A�2�o���%W�CeUa��!�$$\,9\��e��j#�ԑw��rǗB��[�į"Y��Գ�vW�Yhv��]D)���$�M�`���tzNj����`����n��
��>�
-��_b`�A�V�V���V�xv(�g�lT�.�FڙI:�Rr���c"�� \��|_�������8�-�������ץP�eP�s=�"ԟ�}�x[
-4)�D�3�]�և�����X#�CK�F|-=� ֈU����-bɥu�����2H�Tw��ieڣJ�p��F�dͤ�� �҇,��b^G�9��j=�Z��jߧ�d��Å����h��ʄ�x���b��ÿy�C��������؏�Wь����}���IJl.-X�s���~��
-c]��@�/Þ�Gvϵs�s�\��<\XYh�'z.��#
-�6���e�1}!��%����z��<�w��v8̯K1w�`^r�����v>��ϣ��EO?��>i(��Y�7�J�eȑ_s�P̏����Gn�%���?��@0�����PO�#��..�_��i��5�
->�f}
-W��^ž:���QZa��<��i��7pL8
-%�e� ,P���&�t�ӈ�HB�ep�> u2�� %2!]�iPO;��4J�_|G^����lr{FG�BG���i���aW
-��>��臇e����R%�D&�C<���;�10������ >����){X��vT���{�+���^s.UC����w�}.:��袢f�|EMQ��Hl3�_�&[��$�jщ�82c��A14�r� (1���M�r�蜵�Ĉ����z�.����G�qwM��w3�q�\�B��3®��eة!��.���?�����m,y֣-�=G������m�x��-�=|&�4�
-���Y��Բ��W�g�sփ-��~~�D�r�rc��r������j�h˜�h��d8���~�nTx|�u�z�EC�K���Y� ��MϘ{�.%��bL�%^x���z�Ŀ,��å��[feBhk��p�@p�J�k�w�6
-p�Z�t~9�]��f����e1������m+��u��cd����F�8_f���7�䣇����
-��c��/=�)P��g�g�J1|סҸ�.C5��}&A���rR���"��5ĒI-�6_��;_����ڜj!|a}�+�Rf�i�V�mT��ן4���d`"(��J�|Y_{N����D�x�.�9��ZF�櫂�A
-�C`�y�p>�����=��A�ȉ��y�����O��}�E�5�M�z�E��>}x�ۻۻ�r���5�M��z�u�?������&�`����`�`_]^�l]�b�=�u� 5lY�b����P�l밾��qw�ڢgV6��,�$S۪k61�}�,'쟟���fU!4�H�"]?�� U��_(�KO�|��nP�-���p)U��z|��$,�TP:4��[e���t3��9UL��?�ƭ՛�:�n$U}���
->�5g,�<ƅ&}b�[���I�7Ӝ���T��i�6)��i�����3��ɨb�V�Ӂ7�����Cf7�j�]��.8��Su~�E��ji�,�$���!��L��֞Gw�W�����4g��83�+z�%�Մ�I��qy�`��d5ȱ���C^���4Ǭ�8�,�E��`h��CN
-���$Z�yi5��~�,|=�x��U8�C�.^1�A��������o��������ɘ@�VLK��7E�{��ܶp:���u��}������\�L��x� �����+
-S8��_����~�NC���ϢƠ~�x8���~(��'Qcd�\�i:\����I���������o����,ڷ�U�.�1/>���zM=��ï�n/��C�1��G]C�nͪ����o*�ԣ.�>>F�UZ�|��7�m2�a:��<�F��u��T
-�rr@�T����_c
-�d�Ug�fr��V)t������/:������ʩ����#� �D��CM�8T��e�g����q4r�ˁOY��*k�@��'��Tx!ȸ����Mu�n����;&�ΓxvX*^8Z����nS�<\@�=k�;W�b�4���J�r�O��a��E���pOs(w�F��?��r��Γ(w��&Z곮��M���R�6څx[�b+����ʸ��Tx�$����ț�_��ٵI���Qi�����խ������&��#P6�5��o�hzu+�i��WYٲ}�@Cs�t'R����Ko*�#���S�F��ps�+@�>��A�n7�1s��A��9h�m7�����\�`���A��[�
-�7�7��j�I�����:��/\�syPv9��h�S���'}DW|�jK�ff�_g�T���3ޗ;����,�5=�fG�cV!
-$o�/�ս�Y�[UH��l�|��5���M|����_�f�T- 4����4��EvJsj����d�������(j�oP��jڪ�2���h���h[�G�O��NxM"��Ly�⣁��^��f���
-���1,�#���5ȍ}�z���
-ܺ5��5̍��z��'�ِ/��z��
-_��ycK�y����&����F�快��j�K���
-ެoSQ
-��-RZTT`����(gT�^��Q�P��fS��i��!g�rW ��RT�H��-(���^��'#\gF�����Wk_��u&z��3��@���9�\E�q�W��9�f\�E�>����8����N���p�90^���A��_�����S|Oۆ�)]FN���A���p2��ʮ�ys-�i_�F��Z�1aE��ƧncJ7���E�:lc
-kM����ﴉys]
-�}�&f������&�M9��r]��aUP�mL��mc��ۘӦ���mL��>�jcf���l�[�~�[�~����1sݘ���L�\/fzO���0o˽��0q�-��S81qoaV��`������mbޖ;ѬgQq�{��m7��D&'&B,���L�Q��03����F��׳-)�o�1e:ΐ�qu��Q�,���C��7��[0p�u��D)�J�R^�L���)ehJ�y'S�Iw��k�RX�ٍT��A�=���l)��t)�"b��&϶ҥ�Dm}�1�
--��ˋ������� K����]�V�bڔ��}-m������k�M�[�nk��E�{[EC-�=CE�fNi�i��`M
-��"q*�G���Σ�4��O��?��/��'H�B���iE�����۟�Qv�Q6��0���4�뷟����vuy�U7H1�A� Y��Ш
-�j�B�=2�n�G[��p{T�4145�5�a��
-��N����d+�;����L�ڎߥD�ߥ�I�I7I���?/�p�NcVf��E�H�#xw~)����W�������#�� �F��x��U��v�4=��<M#&GȜʆ�1�'^�Il�Y���-�+qN{[���hfQB�� �B�]�0/�5�<� ຟv��,��p��^�{��*�x�q#�<��VW��2+�ʗ��)��1׃ڜ�<mN����}��Z���I������]?e�����+�Tm�b��Ru�o�O�0s�����I���m1�Z�3��3�����iƬ1�P\����L3Q��"\�h�#�D��8y�Zb��;f2di6}{���fLb��ڛ�&2͘m�Y�h�1�<�YE�2�T�$�&�<F���2�j��j����9�n�/?���鶘�4���5�~�]����g9�n1��5�0�~���I1��FS�Zwmj��}�E��G�,�Ծ�=v�}�h���>M(öqԾ�9U����_X�^9Ҝ��^9���h���ͱBs�������ִ��}^�㮢@�n�8�ׇ]+�o���u:�*�y�ۧ�y}е���}^�ì(0q���C�˹�R�Ş]�/��`����U��`]��ܬ�6$TJ3�=J�ԗB�B
-���
-GW=��a��q���7V�K��������u.���K?''���o-B�_C"����ŢA=T���)���B�5j�{�i�v�#�c:U����������]��QUe)2��`̇l���V�h�e,U�8G-��Gu���"OZ�����'R9�t��E�b�l���� �uױ�;�u��x�:�&��%�c`���q��>�F���"��0~��i8�W�EŘ����D�5b����.����jTO�J��۸�^f��,�'t^����6�zYm�a��9ZX/u��a=�&����o�ᰞ��W�캭PPj�������a=R��v���Xj�n�A�0h�����nG�H�̧���"?��T�*o����߆�8_��8��5 M��AN�/�8T)֗�l�����á���1�3-��K�8@+Q���I���dsf,���H�)�C�}���,3�s0ne��:�����x�qp#��S�M����W�í�T_g�ȃ�:���O�M���T6�i46q�ֻ�ƨ.�Zo��2�Ьص��TF��r�'%��䈤2�b�JX4�S���)��Q >I8�S���2>r$��#�9e[���YeYc����%�UVG��"P#���oRi�Ie�t������}He�]��2Ug�������ʶJ��He1���ZF%��b)�`�Xb&��`�%3)S0��t��4�OV�\�8N �t֓�J@�,���`fY��[��d�uu~�
-:)�T�]�o����wl>(�x$��7Ά�i�Y �n��� `����J��;K~�L�UM�0"YX9!���#�d���yDn��H�
-����`�v8iC��j���5��@�������
-��즒��.m�/�l��UP;�7C��w��ᗗ\zE`�
+��_b`�A�V�V���V��v(�g�lT��:��3���OH�Śf��t�'p����]�k��&�\����Oo��^�B�Amb��P�P~���M)ФhU�tw�Z�n.��2
+�FD��f�0-=� ֈU���a�����:C[DuiV!�����2�Q%|�\F�i"3��{ě�!�h��W�|��C<�Zϻ���i����pa���1Z�8�2a+��C��6��o�G�P�G�!��������=r�z�h���������ȟ��?�#�o����L>�;���K��?���i�d����;�b�0�,�x�g��_8n(�?�g���x��o����sQ�U w
+��8o����<Z�Z���蓆���.W2���
+�ӆb~|�/��E^1_��@0�����P�oo�������,��`�d�O��<F_�U��W1S��9;J6���<
+�� G�ĺ�4�J:?�Є�N~a�$�_��C R'��R"�E���3-M�4��9��FG���%
+]��
+�W�])4���LB����k�KQl�Xd��+2��[��
+����p<�1��%��M���w������3\Al��s��=���sщ�E�g�W������6����d+����U-:]Z��1YѰ14�r� (1���M�r�蜵�Ĉ������>\�ω��.��8�=�f����ą��g�]%�˰SC��]��)�7���m,y֣-�=G������m�x��-�=|&�4�
+���Y��Բ��_�o�sփ-�}~~�F�rV���Y�X�����j�h˜�h��d8���~J7*<���:g=�!�%ZE�,���o�=���@cL/<b��g=��_���UD��p�pˬLm
+��p����Y)�Yt�2Wo���L�����5�UϬ��,/C�k�q��lܶ��]�<x��8{��9Η�E!�
+1��!|*��9��������K�j
+�����çR�u�4n��P����a�I�c���E�>
+�ʤ�s�/Uݝ��
+���ڜj!|A>U ���l���h�b��'
+��=����k�R$_���<"j;�9Q2���#B骖Q����� �C`+��|�����z�o���m/����˻�
+��T��kP�
+��P�P�~����w7���T�kX����X�Xz����M��6�����~sy��0���P���"�j�X{�X�3�����a}��7��0�EϬlj�,�$S۪k61�B�����V}��"4�H�"]?�� U���J�ғ�����ܲ��RuY��Ǒ�����
+J�f�`wR�4���Y��̩�$,a�4n��$#긻�T�)Z7��9c�;��c\h�����%�O��=�+�*�&mRB��9c�O�Ϩ�'�ʓ����������mzvS�6�%�[�K9U�^T/��"M�%ӊ��<|/��yakϣ�ԫ��a
+���4g���g:W�Kܫ)?��G1���^���� �JymF��9f5� �`�,�C#�rj<���%�z��V��������'n^��O1p��#�[(��k8�xc̾^~�^�O��
+H��d+
+pS�\�mg3 ب�Pg���hKh�������k\�w��P��n��x��o
+���K������41�A_|5�{�%����?�C/>�#�=�"���"�e>N��@-uT|eN��B`���h��W�C�(Ǽ�<�L��z�5�?�_��^DŇRcJY�����"z�"��Rf*�ԣ.�N&�b��%_| e��M�0Lg�G�h=�������"[N��@e�z���`�5�Mg\u�o&7Jj�B�<l�~��<��DMUN��\
+�;B
+˕(��AS#�v��ٟj����A��\�|�h#k��ɚE4�h�KD;,^2��n�pS�<��c��|�g���偣�=��:�n��6���$�ٷF��q5� �Ms��Q�ވ]W�k�;�������i���(w�'�S������N��DK}�5��)w�]��F��]l�c��vQwڂ44-���c�M��Kwvvm�t[=*m��c��n�d�I�ǚ,�G�l���Xҿ)9%)�of��UNh`�'&����I?e����T�1�?1���N�)(�v����,�m�هY;���}Sr������J�y٢L;�0��� F�S��ig����k?�s�a��GQ���Ǡ��l2�g��vI�>�v�U���ԋz��V���iE����ҍ�ϣ�UD�߸���vc�1-�H��X?��\�|�XT��YLK8�07���10�>>�x�ֳ�W���b䍥�{��|��
+��4��iyG*��|�q��2W��+�۔�h»�š��F�貕�r�j�r<�m�k6��zrv,wձ�-W5���������zj�Kf�T9�-��h��Uz�ғ��h�Ź(s�r���z���`��Ӳ����w7���b�L��)��8�_R���Ŀy�C�M�/�M/�o�������C���C��Ŏ�ͥ"�?�-�G>�0�(��3�|dw\�'����E�ÅQ�>�.x����L&�p�}� '��qC�y=[M����5��@������0���P��y3_���JV�'��XG�`�u@�Rđ�W���=wL������/�w XQ��rͨ�p����K�G~��h�
+`~xS��'�T`���*J�X_ۂ�ZA�f���r"�J��s<8%ƥ��}2����]���J�Ӿ������K&H��lv�֥t���,VC��y)Ț��*�;�?G�����U)���K�yo_��m_r�;m`
+�F�/���W��Ą��&&r�nc�6ݭ��hc�/g�����'�1o,{0o�z0o��%R�13��LL����5�:laޔ;0`a�n[�7'p`r�{�?��Icu�ļ)��al_�{��m5��D&'&B^���k ���L���')�&k+���p̕�S�p�N��=�C��w�x��-����50C
+a)E���W�Q�R�]�#��qR��r����`2p-G
+ky��#�td���(M��i+O���xu�]�jKyR���>�D�Q��1e!-�#z�D�d6��l�L)qש�.�߇�/�hm��K��w'q̈́�x��m�"s�h��U4�R��3T4jʔ�4�Mt)��~���d%*:�����>]������r�4.D�3U ��~w�S9�n1ʦ��}sk����OW�n~���W� ��y���L�Fm�V����#����g�=�y �24u�:����DN����d+�[��ξ��L�ڎߥ���R��𤛤^zS����p�VcVf��E��nG�nY)���˪`�G���[爹�� �F��xn����������k19Bz���o������w�8��yi��|#�io3����,�Bȵ0�Y���e��@�9\������.�@v�_��Ƅ���
+%�t��,��@���U@��
+/�r�?#=��P�����ɡ4ۜ�iG��WNb��Vf(�����a�zMf��j�6�����S*��-� Af�'�qZ�#i�T�-�YKz%������B���4Cq1n��2���tbD�� �%����%�A�f��#ڟiF%���� n"ӌ�f�%�����ǝU4*�L]��T�Ӵ4�Q�@ŨL����n�O7W��~�tŜ��L�J��.��o��e�e
+�u��UjR��Q�ۍ�6��J�>�" R��Q�Uj�� �Ծs�GTj��(öqԾl��
+��q���o�G����7N�=�xM5�F�K�K�J7IԾ������(k��p�>��qWqA�n�8�ׇ]+�o���u:�*�y�ۧ�y}е���}^�ì(0q���C�˹㦒5�g����#0��]�⽊r�]��6}$TJ�u{�P�/�J�,q���z�5��U���o�ԗb����#���kY�?�3 �~NN<�R�Z����dUv����)��xtO���H �d�R�b���0|-F��t�IkO�H�����㣪�Rd�Ӻ��j�⭖ �V�X��q�ZF����2��<i)_�֟H�x�9��}q�Ճ{�&��b�]�v��֡� k�����-�+��Z�,
+gW�p�>�f�p^ucz�.��fԈ]�jPo������zg���Q=}Uh��ƅ���� � -W��������^V��zX/}��+�*�$���X��zb{_���BA�e>���Y��z�@�v�3X,ި�����*��zV!��u;�G
+�|�.�SM��S�
+�q>�۰�c���9X[�IQ� ȉ���G����֪�Nܡ;�\ |g��?<�@\��^���Z��v�N�� ���Y�$�����צ���i����Z٥��Z���u|P��
+F~�������x�*T�ke��:;F��id�oSo~~�"��}@���w�w]�Q]Ե�|92����GHe;��qRR#G$���1+a�DNv$N��P|�p�,��19e|�H9�G�sʶ�S�#,d�a�����dY�Xeu��Y�bD�@�M��6�T�LٚNO*ۇT�߅H*Su6m ���*�l�d�T�;�eTR��,�%X�,�[��`�%3)S0��t��4�OW�/\�8N �t�'���>�.���`fY��[�:2˺�:?V���n�Ѓ.��7��|���
+<- U:{��������^ �n��� `����K��;K~�UM�0"YX9!���#�d����Dn��H�
+�����q�����!TZ�A�`RQ�=IB3࣑62US����T�è��
+V�L)��vo���2m���\zA`�
�
-�=m���C�Gp�*��˴
-�@�:m��
-8�H�W��ej��35��J��9L
-���q��z�5<��aԎLo��(<6���j��t�N��
-m�{J���]c��)�SS�C���8�]6F��p�KQr�{[?٢����e[TE�@n�u{[��5~�-ќ�y�h`�,�^.[�;4S'�C��6��K);oO;�R�:�`��o����S��H��лR�
-Vڇ�EƤ�v�e��CIo�V�䒦�� �t��,Я;-��+�V������DA�3�S�4�%���礯aj*������ٚ�?}�E(�"���ob���m����
-�Êy �^�R��t����ѩ���|y��&����7y�J�knF��i��箙�}&�k?���H)��K���5�Ҟю��5A� �)E�N���Z�+2�r�,���\Sgn'��j�k�gS%qm��4��y��5*%�����-ZW����.3���[K̶Wt��N��aԴ5U&�=�M2��P$k�jYk�'R�i��E�{�-���$��/�b�=Ւ�4̍M�{̥���d�ǐ��5?2����n�!݃.����bN�176��10N+cN�17���1�z[<���pjjka�R�T�
-�c�M8~ӛ�@s1gJ6̩��L5�0��2���E[��R����jƔ&���Q�06.aJJ/�mfɊA_1���e�倁���#����2�w�CV�(�X&�b�.�|�p��1SUSʈ�����2Q�,;�ib5yZL�q���y.�Otƅ1�a�vn�#j�sS���˩����.q͗��^�rq�Y���:������+^���P%b�>�w�X����8a�N1�+1FX��*{P�}7�|���d:Y}Ko��s����#%��4m?vM �ǫ�$����ϲ�<y.�L�m���6q��Wfʿ�\fQl_pqL������wS�b���s��q=QR�1����;��c��]>����:�ד倯��?~�����$η׃�w� �l��d��Mu;~
-�G�,7Q�N*�q?��G����h�,E��r�=�Ga��<rHHqNRإ~���x3���d�hތ����e����BL%I$��9e����ȡ�ȑ6����&ᲐIa��<�T"P�:Rt%h����
-��h�����N_x/2��Z^Uٚ)݄:W�[�o���ª�Y˨t
-],�EOZX�-��L:[�p��eQ���:�}Y�r�g�h^���\^��/�Z
-{̧��:)A�/�Z�z��WD������]�k���5r�=�������[���@�7��V�] F�!�"�ˢ�����s�U2��\�T����"�͢�" (����d:�r����l��B��I��B��ee;���Z����5�P�t�cJo*I�ZW��B�>�k����Ei���~�����.l�+�R �V���c�!n��Z��:6�]q-h:=Q!ҧ4�?i�< �W�gd����/>�I��r�����3^��pXF����8p��/3�!�'���ב�S�P�g5�v'75*w�̇`gd�ۓ��Ǎ�q�Ҹ�:Y��Z�}�gBθ_�K����8Q[
-�6bɌ}.+�hԒ$����]�sĈ*n_�t)�T�Z݃��h��=#��l���TehԞM��U�
-Ei3�܅�����#�J��h�m5e��0*?C�IS�]�LR`��d%�:h4i�y4@��,�E�\N�O�׳�p����ŀ��0=�����k�kƄ54n�&���4\�9hC�J1jW�W
-^�W���7P���8��o�NIJ\3��<�,m�jl�b퉵D'� *F�f��_��s�>� �W�y7��1�
-O��-��e>15ꗹ���|��K�C��E���Zk��`Q?�x�~�2�W��@���ᠷ<�g���q�[���m�An=�碶G���o9�碦��|_�n����4_���%�݃u�gC��@��W������İ$>r�� ���la�f'-�d`�zw��n���U�m_W�:M�ξleW�:Ҙ��uV�����6�j���_���u��<��[���*o~��e�{�'��usQl�)���~N�%�Y�9�_�x=\z����&�m����5��`=������?�p=�sS"
-z��fD{л-�A_c�i�Ù���A_C�0�o����E���E�ق��~���}õ�-�-�o�pm|zs#O�gX��[�r��s
-LՓ��aVkŎ������oFv�0)>b5�W��p4rh�����@�ox_���t��n�eMB��q��[jd�8�,��)��c�<r-㢫�0����!�x
-s-��\�"���z����,j2Đ*�-a�j���1�� [��b�nA�tEi���oq��/.��o��2��m���wV˨ �X���b&�<=�@���'��^�z� �p�WL+|�����HK�&�u.��n�9)��B���b�Ǖ�%�{�ʣݭ
-�� 1�L#�L g�㛉V���fb@A�[m&�ID�T@=ظ��TN�j�|Eܥ)J?I�ir҅�OS}���(�*jD<s��!q�.)�(��$~B[��ڴ��ⴍQ�Z"��+�.�xn�7�� �շa=JN�%����An?LN�&��?
-�S)�{а9mz�<�L�j~�ωlX[����ж���Ih���6v1�3.�����жp�mbh[���f]�XU��ݝu�V�eG棆���v}*���FNԑw#��)|�_����6
-�T�\D��E��Y���V��FM��Q�m����N��+�ͤ����=�ciP��
-ۮǒ�
-lo��GwZ�!�U3jd[�K��4ʥC`�y��6�B�{̤�A�
-�m���u�C��fh�i�m
-p#y�\i���$����5?��CNJ 7�7z�UȇT���@n"p��ˡ��S�e�J078L�w�N�1�Y��\�(V��>�FY�Vy�����Un�Gp�F��#������(���d��xT���E�*<�pU�����#HE�Pw47�>��$��u�G�NR��8������9P����́ST��z�@���V�9�1�8�5�8 ��w��y��d���.�zq@�{t"�S(�d�漴js^��������sW�6��e�Plž��w��,ݾ���6g��ۜ~�mΫr=c���{�����:�M�215�Sc����4V#�|}Lv�f�f{��RX&��
-��O;\��/^%�J��VFU�e��$-���[����[�Ao�V�ߺUt�*-��
-a�hH�{��lۥA��RjN�B2ۙ9�� �[��]�٥Dʊ��f�Z��!�X�b�^�I��5nѐ27$8Y����c44�A���
-2�d��1r��#�L�����M����Q�}��95ni���F��cF�ҵ�<-&�X�.�ᒿ�D�\E�DK�؉��T�Ss+
-�GmJn��P���/�;F�*� �!|ӫ���j��r���7��)Z�J�'o���8Q�8����uTh uN�5��w��B��Qʾ��~�S�"mp�v��q�t_��)5��(��粛IE����,k5#��W�p=�#\
-����6�3\���Y��.Κ,�|ͅ��p��"_��8��5=�8�?��#K�����#����D��No1^l���7B��������YՇk�:~{��m>&�ΐ�L����?N>'�B?�pųX�x�r��� ���@Z���2�>��%`��P^É��-j
-��}>�x_��E���"��]���]Qkly�c�A+>��y��6�G�_�lA@�/i|�T⛼�>�q��d�V�<pHE#�b�Ӽ��|=�f��
-9{9�8�cSk�~��0{�;�b�f���md��ʢr[�$�Gq���8��
-���R3��JGA�-}~{��"�Tn��ܓF����>oH����7�q!�����1Z��,�"���[�ˈE%=�ʊn����[�8?�6FTs�y���j��[��[���Lٚ�����i@Vnͭt�Ux��R�-Uy3�V�Ay��n�)�ĭ[x+6v;����5���R�h��Qo����eL�I�p��V2�2-��^K��T;���_>��-�Ғ �K�6��0!
-���:�o>�z%#
-Q�bmEq3-���m�6�Fm3g���k��Ym��Y4� e�i�YH���QP>�q�t���������2z�J�I
-�7��/Iw�T���t;,u�LB��~�Q)���T9�zv,!}P
-��$B��B1š�\�rq`�B��E��>��6�6lK*���-�P��X�eQ�k�m �s%��Xg�i��ٖ�lXG�0�o[��S�M��ۖ�lXg��Cܾm��>�6�m[6�/`�m�H^��klX�z�+����+Tj�<<Y���|�������pa���$�WN���2Ul�RV��h�
-�H7-�U�Zg��Zk��p,k�[K �@�o���[�V�n²6���v�<��۰��6�U�m���F���a$��4�+^N�y�������w�PK��-�^*�PK;cA&sammoa_Diagrammedecasdutilisation.pgmlMN=o�0��+�7�ٵAuM 0�1Q�d`���aY"qd'U~|������ݻw��Os'���m�q ���P�G��l7��eޕ���l:�\/��D`$���c�:����|�L�d�8m�n�����Xu��"����1���4TrR*�����M��9U�����o�� �n��gV��I�������л��z�Y��:��d�PKǒV9�PK;cAsammoa_Diagrammedeclasses2.pgml��o�8��_���t'�)�1/]өחӤ�VݺI�4�(qRn$D@��t����@Jwi�N�8���<��1��1��;F^0髠��
+�=m��� �#8E���e�4�M�����
+0���"�9@�����25<S������r��|=����0jG�W��(<6���j��t�N�_�
+`zO����5F��b;5�8��?��1�ׅ�^��C�ۢ`� ���
+9�]�E�PT��mQ�ۢp�-'�a�tK4��t�%-˪�˖<���x2;4��a���H�{ڡ���y;4U�������v��-UQ/`���-2��v�e��C���?�%M�8�]�C/��N� �ʹb/no��_� �=�S�m�)J�͡=������P�W���Pna��5���4���X��.o�g�e�m8V�Kp����8��?�4�Nm����d��M^���o����܌��<�Q�]3��Lr�~
+���RU_��r��{H{F;�Rׄ5�M)���)����"s/�ɲpO��5u�vK���V6U���M�H\#R⚬�Mݢuu]���23�ݼ�D�l{E'�뤫FM[Sפ�DziM:�(��F�����´?w�"ѽ��D���4���"Ṯ'ZҚ���it����0�����q��G�r��bЍ=�{Х��UU�I1��F�=���Ye�i1��=�Ro��0W�+���Z���0�*�Gç��tΆ��f"�\̙�
+s�j)S�0̭�L%�9u��0��1u�v��1�-FS�q16.a*Cv/�m��H
+��`ƅ����*>����H���Yԣ�b����r��0)*�c��O)# ��2wb�D9hvr�b5}XL�q���i.�Otƅ1�a�vn�#j�sS���˩����.q͗��^�rq�Y���:������+^���P%b�>�w�X����8a�N1�7b��p�U��J�n�����l����de?�+�1GJڏ9h�~���W�I67s�f'Zy6�\���ۄ#�V{���B^�)��r=x�b��/��l8-��7(�>E���p%�����M��(���.�6��q���.\�~����.���8�^
+2O�Ev�(������6���!|Y�XL�D�:�@O�L�~b ����1ђY�6h��b+z��foy�$�✤�KYȂ�$ތ�wOƠQ�U6���Z^��$ɀD�4���Z9T9�F��2�����4\2)�����!Y�T��*:�4zkyAB5m|`������E��[˫*[3��P��rk���a.�
+p���J�З%���I�����IgK��1�,��V^�/�Z��c4�P�Vo.���E-�=�STE����F-C=��+�NKP��D�.�����B�����'����[i�K ��jw+Ǯ#��s��eQ�E�i��*�es.����c��fі" �Gg�ʓ�,t�̖*(t�D�1��?,[Q��I鬵�����CI�MR�)��$%����EA�>k��oa��:�1s��.X�K]Vܥ�-�tQg��C�~�5��:6�]q�5������(��O/O������t~����1I�e�AP�����*=��w�e��x8��q���/�3���drx~F �38�¡�euIv'7=��/����f�/;#��,� ��[�s���E���}&䌻�p���vϺ��X�h����W�ze�Z+ �&pt������`b�KYRM��E���FP��Q6U�g������P�����Е����]��F�x�V�P��F�ghk��e״&)0
+svF��3jϣr4�u��XD��t��~�x.�l]3�v'��]��+�7
+4z����cB�r�5���Y�
+s0��bO�=���Վ�=��^�[��؞�|������y�Y�c�`��d�+I"V� �X\�P{���!��0��`��JR��kqN� `��e����G
+f>=�L�I�%���a�:��֒5�s�0 G��a�Z2���o��Aoy ��� ��0Xk�ȃ�z(�u�
+����X��4=Ș6��A�4_���5�:�e���=�����Cb���\`b�'U�7[������6�L�Gp�y��m������#h��p�e+���Y�y�[�����2o���J�*��м��g�anߺl}�y���6.�d>�����b�M�if�>`9
+�<����qXE��pM��$�F��H�>c�"t������A�҃v����9M�sS$�M��6��!f��p�k;���X�y��7]�ߔ�"������I_c��Cܾ������m�6�'���'�3,�~ޭq9���r���0��b����cq.�Gv�1)>by���p4rh"�؟���5
+��o4z����+�_�Y��$���0E��c���#G��y�Z
+FW�c^
+��|�)J��`�J��/"Y�T ��::�"
+1�
+oK�QMJ�^!3��5��B�>��]����v-���`���&`l����[-�Xg�����-K��f̴,�A-�/j
+F��t���@f8.�@,�����&��%��}E���Ç�<�i��`NJ0�P������q%�i �>�iw��bB�D1�H5����f�դ���PP��V��j��*�l\�@W">ZM�K�m���t!����.��C����jD<s��!q�.�쮒� i]P���i��E�I�ⵖd�/<�"�>�7�Vy-�[}֣䤍Q�Z�H�����ar��#��
+��>�2��
+��������g���v�5iU����-�`OB�.�������(.`�F����lC�r�v7k�Ī\��Bz����|��6�B�.���]m�Dy7B۟��ea`�Zl�א�ʘk������:_�ۂ�j2j��F����c:}`{��6�۪��5��Ae�+l�Kj7���2>�i�tVͨ�m}]���q]:�0ڦZh{��t6U!�M�жx`�A���mS-��n$o�+]��Ѿq���r�I �&�F�
+���
+���M�r9�=�&�^ �&� �.� 8�9r��E�b��~�#i�Un�G���]?�Z�xgh��<}9����c�x�̜�G�@5�*<P���W*s�h<��=��令_һJL^�y�$�����NQ�����:�8Ee(�gT���m��C�^Ӊ;z�ٜ罜z�ڥ^#d0����%Y�9/�ڜofs�|�j�͉�P���� (�b���;ns^��n���{����mN��6�r=c���{�����:�M�215�Sc����4V#�|}Lv�f�J�8Od��0��i��0�BΨ�歹Qźl����UZ�ȾU�z���֭R�q�����Hѐ*��v)�
+ضKY��RjN�B2ۙ9�� �[��]��٥��h�4��1�u .1�:�7���q �V��-R�
+ Nd���p��F��٨ sJ&>%g*�r�bdv�&�qK����IS����[�t��yu�٪ �j���.��u����'��¸�L�$��(M��05���zԦ�l�U��/���9s�|�0�l�^->�W{�7��7T�!xM�JV�>ys��ĉ��1o�4���BK�s
+�1��c�2]�R��7����i�;��p�C����Af�+�Qf��e7���g{9Y�jF�}=\�� ��G�<E�l4�=\��w��p�]�57X�̅���|�D�n�q�m�{G7��}d��02���\W�
+u�_Y��b#�4�j��5@Fo�x=ȪΒŭ�Bߏ}�m>&g�h&m��g�'/��V����x�����u��-���b_ia#�b�}R�K�U&By�N��mQk���7������/�������%��Zc��C���
+�-w���9�r�>���_��&�������8s]�d�V�<pHE#�b�Ӽ��|�����9��|@q��lSk�~��0{�;�b�f���md�IeQ��M����c��E�f��aq�����K ĩ��t����g�-��r[|�4r��\�yC�m�������V�h�x��BQ�-��݊_F�DQ�S���V��T�wkXN�ϻ��\���DT��֨�e����8�t���@kn�=�d����J��Z���
+o����j%�w�궚�Op��[� �ۡ�$����ܭ�!���6���8=Ce��$lq��V2�2-��^K��T;��۟?��)�Ғ �K�6��0!
+���:��?��FF����,����p[3���,��9;�]\���j[-͢�Ap
+6�4��:�!*�G�?����R}���2����n�n*�_��
+R�S�"��a�d"��J���r��*g�[ώ%n���o9 ��MC!���Pq�A�80e!���"Kk�͢
+ےJ��=mK*T$<�mY��k[B�\I�:�4�s8۲����<��ۖ��h~�e+��1��o[��O�M�mۖ���c[z$/�56�z=r������ZH�ƃ*��>
+�^���1:��(0
+\.�����ͩ�Z���Wj!�ԯ����P�t�Ѳ-Qu�u�k-Y�>�3`i
+�Z2t�,m�k�&,m� [k�ȃܾ
+K�n�Z�߶K�nĚ���䘘F�}��ie������ #�O�c�G�!2
+�3H�σ��� ͵G�Y皣�b֤�
+TjH��9�9��*5�c����4P���us��
+Tj�y��7G;�@�"���Ѣ�)�j_�����}�cd�N��#���8{���PK+����*֡PKhiA&sammoa_Diagrammedecasdutilisation.pgmlMN=o�0��+�7�ٵAuM 0�1Q�d`���aY"qd'U~|������ݻw��Os'���m�q ���P�G��l7��eޕ���l:�\/��D`$���c�:����|�L�d�8m�n�����Xu��"����1���4TrR*�����M��9U�����o�� �n��gV��I�������л��z�Y��:��d�PKǒV9�PKhiAsammoa_Diagrammedeclasses2.pgml��o�8��_���t'�)�1/]өחӤ�VݺI�4�(qRn$D@��t����@Jwi�N�8���<��1��1��;F^0髠��
����������KUޜ��r�����Յ2�/|����⽢��� ��Frc@"7��q�Z�zN8
f��x�(tƽ(vb��;�Ù�Bқy�O�ߝ�N�����y�����0d{hX�G��iG����)�g�I_M��-�e��H��� �u<
��4�x鍴��M��$&|EP�W2�����oS'���EލO�CǏ��(&! �)�����:���a�4*Vt�8�nf1)����
@@ -103,74 +112,66 @@
j���z!�%;����joƋ�j��`AO�"�(�P^"��nEPIY�Ƭ��ST�U�
q{��a���
U
-=�3)��3�������P�h�3)��hS��1���bC�%_�t��t+��N�Z
-*�>�)�WS�d �T['�L�Ty�>�SM���?tL��dዙ�YO��P�X
-�B���aT��Ϯ�ΉOb��n��BݝJ��c 2�/["���"��B�(��8��rL9�ϥZ���B���VZ
-Ϧ����[b<�ض�f���ʦ��{N,3
-'hÉp�T�ЪHhTq��N�e�dU3 ܼ��wd��ċ�e�~�M9��>q&5��a��@s�|�
-'�eU���^t���u�Y蒫 �i�OTQ�b�������Jűo�7r�;NG�) �Uc�g�Ũ�]�$o5ͫ6�m�-m���LX�o����ڤ=����l���'$�d:�O�(���G0��aD�X]�Ƣva��9qa���xD����)��߸
-�������`����٠%���Eq���&iu���:�?t����϶�m�m�%��#��;̶�@��Ʋ���*Xkٮ��6ۆlÍ�
-[�
-ɶ��l~��l�mCv��C����6֫��Ͷ�������Wt�`�7C���!��Df饌�h����t��S��N����B���ţ�����L�8K�f������������l�$2+^o�:_t�*ה#nV����x��Yz9��� ����f� pN0��p�U�9����"�U<&T��6ঘok�n&����q����ۓѧ��
-)2�U�,_��e���2����LF��*2Z�W�і�2�&EfZ�Ș�ZKF��}�1���ٮ=�Z�m{��>[�6�WJ�х}5�m�ٮ9ڪc�ۮs��fh���s��w#ܵ����.ӽ��hp%�����x�d������7-�����PK�M���VPK;cAsammoa.todoeO�j�0<�_��.YnkW6�M��{��Xk#P�ERL?�5%Ѕeg��aV�/�,`�ƙ�H�3��Tz���ٝ�HɾI����Н?�ģBҞ���J�H��*%a%�u�|��
+=�3)��3�������P�h�3)˒�1�Њ�So�*6t\�H7p�N�r��t����퓚�z5�N��0O�u�j�DN��^�s9�*�J>�CǴ,N��{��)T<���a,t�;����s�ء��$�Pw�R1�X���˖�6�H.��x,��0�-�S!��s��f촐��Bų�b<����7�m��!����&瞄�L� ��p";�9�*U���}Y8Y�7o����y0�d'�_S�h��O�IM i�j/�\'�qC��qY�.6���gi�`��*c���UԼ���mk�ߣe��Cq�[�������9bJ�z��h1��g�?�[M�
+�|E�}K۽�6����y�6iϮ�$۲��� ;�N�D2ʫ��L��p�5V���]بsN\��j/�!5�wJ/�7����&�2�ǻqpG�E6h �gQ\x��IZ�A �����%l���mhc[kɶ�H���m4P�!���l�
+�Z����Ͷ!�pclÖl�G�m�2ۂ_.>bې�m�P&�4�����k�m�����7���6X�͐5�mH�0�Yz)#?Ba/v9�l����f��v�����D`��殤�?�f��������m(;y%C�.n<�'�̊�۹���5�H�����5�%�:n�^��#2F��DbD~���q����4�t�N�D|w��!F� Uq���)&�ۚ�� �d!\�{�@��d���dtC��l�"�W�fm���>�o:�Ѻ�����e�%���I���:)2&�֒Ѷl�m�톣�F�k��Vd��e�ϖ�
+��Rdta_�m[v�k������\����po�ܺ!��wm�{E����t/?�\�nkE��&;�5�:�1D��M�Fc�d�PKe����VPKhiAsammoa.todoeO�j�0<�_��.YnkW6�M��{��Xk#P�ERL?�5%Ѕeg��aV�/�,`�ƙ�H�3��Tz���ٝ�HɾI����Н?�ģBҞ���J�H��*%a%�u�|��
���,���\�l�v�
-l�:�L�A;��Nx�{�i7�����D�7��=�l5�^8�0�@h�@���h^PZ���ˢ����CYV�j*8�5���ӓ��LB�l�)�?�~�$?PKP����KPK;cAsammoa_profile.profile�����Q(K-*���S�UP2�3PRH�K�O��K ����Z()��qq��e��qqr�䔦g恘���>
+l�:�L�A;��Nx�{�i7�����D�7��=�l5�^8�0�@h�@���h^PZ���ˢ����CYV�j*8�5���ӓ��LB�l�)�?�~�$?PKP����KPKhiAsammoa_profile.profile�����Q(K-*���S�UP2�3PRH�K�O��K ����Z()��qq��e��qqr�䔦g恘���>
�z& Q}�0�
-�����������b<��SR�S�R�K�����+�,EȂ9PK8��7y�PK;cA
-sammoa.xmi�]ݖ�8r�ߧ���cϜl��CR�=�9�klj������\�HH�5Ej��c�U^#w���*��I�$%�I ��T��[@��
-�B��?|^���|�u�?)/[��K;�kZΜ~����U��Û�}���)�V#ռ��|g;���|O�q�y�]�����_"7ȏ/��"�X�v��2�J���گ��+MSF����l�_������512��FQ֟M�� P@(��6���K�Hہ7w)1߆>}�8�b��
-%�/�E�l^���w�_�z�n��U�7�FG�V�N���cS!w���%�y�l]�ZJ��M�UKU��|�T���u�����9Q��?(�gƷ�����EL���Vb�����$��Oߴ�7�oVwZ30��:������7���hH�ݫ�y��+��[��k�jutܟ�j���5��W���ӵ�k�Q��]��bᢗ���/�a�,#z���>��|t� ��{�f�_��h���x�H�}�)su�9��b�F#wA�=�=����mλM]��H�m����W�Ӣ
-}�|����ڝ��{�:�/~�j�~�&q�$�
-�8.���=7���_�óC�q�{y�"�Z��T��pp�M�q��F�x{w��PY�E&V��(�0�o�:���0|���Z�9V\o5
-�y�����X|V�3gFc�)�`�%�Ę̀$�(K>Q2��6G+��xX���lˏ�v�Dyt=_�`������Q^������/��k���W<��!�N1H���i�{��8&"�^�z�8�p��!���!��="�gbә�iL���-B����U?���r�t|�5���<^L�����DRq��D�?YsBn�)8�&�dc�7(����������dUL�'�ae-z������<��bR��Ƥ��X6�f��'����#y&O��w��( e����{?�Ho�ѽ�.!�xD����ߦa@��,*�
-�CY��s��Td�����o�J���|�=���������Gr;��]#9��
-��ْ��#r�8VR1B&�3���0s6�I�r���$��L|/?��_���도ex���ÉX��Nf>����?;
-�\*_X�>���&KL����;[�B��C�y�:F��kdV8�[�rO�蒻P��PI;�O!C�c:���$�n�
-YP,p�Z���ْ�f�A�K�6Ͷ�E}�E�xؓ�A�\D�Au�j6�'��WcD~'���ꢼ��k��~k�ehQ����w+
-��߃-�<l�~(���B�C�'�h��u�}�@tt�f����4��u]� �y���~�.m,�R���Y���&�Z�S7�o��i8q���[�s��I�n�%��vO�*��X�?��֛6l�A�v�ݖ�W
-�e�p��${>NF����?N8l�>�#�&)�c.��;K;Z��ƌ�D[�j=՜1ab��ѻ�����
-���u�m{Ez��)`0hf!���,d�Gj�<{�&���gs����=MG�~��8ִn����F�����T�,ߚZd�"ݿ��e�D�ܻ7�et� U+�G�I��oa��ț�`�>�LY��>�B��
-�7+�5�XKB.�=�[��M4;��C&}�G5<��Y�>���������_�J����.���Z�x-�R���cy}�`f�@�e�E�0Fz M�ǵ���W��D��pa7\o~M�3�,���-���3Dh��;zBt[���m;��X֛�I\���u6��nj���ׁ�?�{;x��Xu=�x��|��������R���O��wo���vx�R��<|U��zb�
-lC��n�v��*��v�i�En:
-��V�pu��P�u���N�~�Dꗲ��w���}䋽Ĺ���tp_��ԟ�}�=���P������]|H�~�G��h2� ��'|b+�ط����ox�4�؉W��V6vߙ��y��Wg.ve���!����8���L�cC'��M���|���榎�p�\�H�7ʹ�yY&/Ѷ'=��D�Z�g\�R��q)a�P����/�����;�'�"�1ɑ<"v��c�G����6��g��I��pl.F��k��q^@+�ћ����1�m|m`���٫��ltz`�@��b7�!�<�s��<t��hkr'��; ��&�7�hM�UH����K�$F;���$FL�r�-�<&�6m�-�mP-m�Y{ff���UG�ӧ_w$>��~0�{]?3!�*np�".Z�N^�"fG�����&:�S�W�������t���-�mJi�������)�-�t��bY����\�Sdr�N��c�Wr����%/���c]���a����8 ����&3̸����VZ{E|��vR��3*��7̘s@����n��DŽ;����cfb�����|�͒/�n��9��KVǧ��*�:>��䦘�T �S/"�?-�"w�/�b�
-�L�d��0����S8O.Gw�S4#xLḥ�p���a��aq������X�<�"4 &h㡚�V���Xe溪�6>�SDU˽����\�N��l�$���n��SH���Z��U��'��u����WH
-��/&r^�<��yP��>�t
-|�ȸ��5��̑Y��z����)����O`O�K���$&O,h��ȽSlc�D#seD��*��qv�溫bvV^X�&�_̚X�>Xou�y���d@���e�ʪ�w
/E�VȣW�u0����p�e�g�x��O#�q��ƭ%[NxϪ�I7�ۤc-�/��>J��y^m-^�n�?��2�������O,dV����S ��8LF�9\�s�G82��m��C�PӚy��Bz�~I����n��+f�U�a4�* 'B�.�~@f��QK����4�"^tw��R�Az6E�bw|�{M�a��vս&j���{�q�-��!�.ޙP�^��Ť��o�d���<���U�~��9���zs*u/!��j��H]}S�H�#��2�������{�tn|O)a0b��Ā`-�<��h�����@��a�`T�\���3�B�u��-�`����E���g��IJ�\7j9���\A�P��@����A[l���
-@p�L���vO�Q��������ecf���,| ��c#X���_�ϧ\0X�O!��$��p#�<�ѷ>�%�N`!{�C�^m~oX=ď��r�DaP�=�t��m������A�0!����'�1-�0���3}6�O�D/zε(U[-�16�����ٲt���ѥ!r�U�����S%�(%2�4P<�i
-f�)<��9�(V2�?%���|v�<����c��5��g1ȕJ����(L�����E�N��[*6Q�yu����Z�x���qRxx2�J�@�Um2�=6�~Ւ�����$�]��S���)#zmS�5��a�ۨ\���R�vq��ӗi��|���?�K���fG2�v�F�L����8�LW��r�Õ���d�5*��T���8eV���AÓ���y_{����\ܒ�3�;+�XB�b�ε��
-;zq�g�G���z�n���k 2LS�P�>f����R�9�����:s+M�)��<}�n���uy8p��B��\��2� dY�� 27��HP/$_N�937�76@�<-&O��b��.
-�!�cHv �ЂN0�'�R�w��5���T3[����q�-)�cl�/\-�,&��T���:8�6�T��}�۩���Ò#��˶�c�ĎI�� x�4^�����Y;�����h�����6a L��a &+��0�v��h�A&��<C܃�Ⱦ
-�ט��5B�$rW#�3��z�q�Y�m1q�`]��PYc$ߍ�̐���"j�JѠADC�D44�:sw;F��k�[���)�j�F�yZ$�.�m[����Ll��
-H ��b�-�ӗy|�^����L�h �͒��@z�T�J%�kQ�M�l��R�,&�8}��9���7za�:�B�)�������5�q됻Y��j-���Ԯ\1����&A�C���ʁH` � ��2-&z@�>�Hu��5 ,]nY����2�,�&�8}P�!���@�[¸�0�wB�Ay���E�a�C���so�������-8�(�P��'G�E�uy0Po{�Joiz�m4����6��y�m<�����z�di1Q�Ba�Ce��$5{;�>�xH]xȨY�=f��R;M
-e)��˽��1C
-���F�אZ���u�Ȉ0ZmdtM��^fn6�00�<?�� ��O����0}L�A|\$p��A�,-��0}�~Luh�GܨS��X�80��C����Sa� �4����7�/�e��p3a� �,ա� Q��[��v
-d�<�<c��o)A �Lu���"���w�ڎ���-v��7�li�.ĝI3q� �,ա�0P�|�Ý���.��[;���g�m>�v�x�?�D.+CPD�d�1�'y#�p�R%3S�ǘ)6{BE9>ٓ�`n����֟S*�$N x�Sj��T\(n�A#��$��i1A#B�H�C��, �Ű��a g�a�M��`�bC���Â:���G�[p��eFA�Ce��k�o� ����Y.�d\u:��9�R��i�.�m�]�L�mg��K^n_ze<���B�}I���:F�yԷE���/!1W,d��;�K���)]�U���-�GX`�#bwq�#�H����0y�����嘉�\���͙C��IG�1^4_�s�E��jy���L�\$�-�G��sd&N�Hc��3`z�O0>�&Rn�e��L�w� ����<l�2�`r[�cl2���jt��0�##s8��H�[H"7$��gh19�$�$x�U_d�t@��u<��L&{�͏��Q�-a$U�9[��Y��"��Sj�~�Y�u�����@���r�A�yN-�������S�$L�u�O�)�'N��Ku��+���`��6c��g1��s���Xh\g�N����!#�1���ԇu\$�� ��p-��:�"��,ӭ���O_��D�ʱ�SnИY����`����ȭ��ct�CN�^0��T��
-i�:� �:SdM���ΦZ�Ô��ƍ.����?;�!���\-(�@�@1Hu�y�����-���ܔ�h�k$��p��� G�V=��D(p���;��|-(�@�>�,Hu��A\,�K��x��@��zɡ���2�.
-�l'��Bų�����rl-��0}�5ա�P �Mf?�������Ь!3u\n�@e�����Ae�%I�<��$͈���w˟NU55C���g3��Y�mE����x��(��bj��5�R*�3Ķ�����Á�7e�Y�?I�@p(�:�8 U<��#T�::�Ũ������Lu�l��iג��{}cF婭O��j��)Sv"Z7KI
-X�t�%Ͻ�l�F�A(m!��b6 ��
-�T����2�MI���XEJ2���<��Am�T������{��&�p@��%O�6��ͩ�D&��8�.dyZL5q��G�C�q@"y.�l3��gl1'�%�#Ω��)!��Ѧ]��Qj����){*M��²��C�q��n�T���2�<ڶI�J�a���,�_Հ���)��������;(QRa{����`;Z�ztY�ag"���A
-l����q�\���g1F��`�:TS��Pɭί�[L1 �@�C��_��o���r��,��Hu��QP�u���8��3����m!M�`����:6[��xja���W8)A���ֽ��,yB�>$�Ou���\��-CouL*C��ִ��1�<���y�( ��b��HgBR�ǁ^q���K��p@�����J����i�P@��U�'�Y�:
-P�������Hq��pa!<�p 3]���g1�%��ة�F��.
-@d��-
-� 8Hu�wd��N-w���>X�C���
-�9Z̦�8}�g��P�\�-����BF��U{:3�Є]��9sZ>Z�;�ğ
-d�Z�h��PͲ6'��=�#Mۡr7�5��ۺ�v��)�l��7�KL��1��B���(�Y��ښ�gmL��W��lu;l��Y2s���O�ÂK�% ���f}O�Q�O��.ִng̔17aQs�S{Oػs}�>o�%����C��L��S��/�9c��z�h��~Z���J/�y���C���,7��K����@�]���!��T���Ä(�g�|�3ђk
-l���M�$Z~Bu0�0T��\�R���c���N��r3[������L�p�ƈ#�g�@���Ϫ�Ԅ[u��i�~�[�%���,�$��Y�3�������T���+D�Be��� ٖ ~
-~��
-*3�5�.t�B��%�?b�Hq��l���A��T����J����)��B��n�M���:T�g�
-8Rrr��M�)'��ǟ7=�WEx�4�{|��Nr|�5ȝ}|��H�s�=��ԙ�=����=�����LK�j����c�� �Rn`�Bʎ�Q�m�r��u����Pٛ����)���wN>���`p����%�s�У�^քd.�+q��L��]�&d����w�g��ϙ�O��Dž^|�5,��`���B#���0��~�[�ؐ��"�G�:��O����Ɯ��$��<{�3�_�N� ��ǡ�����M��lq7�2�H�iEu+f�H��L��f����"�*d�Hr(Y�O�+ ����sӉ�
-� ����P��q�`.K���#��`��1�HƬ�@�L��3B�N�L�c��f����T�hE�^�?�tڈe·Z��g��V���3��`� lW�
-c�n��<�Og=���b2��'�&��̈�S� &���T`��
-Ŕ��O��1DN��u��4m�u�ۉ����^�̈́��\���ߜ���/Ax���x����7崿�%��x�n��F?���L�a4�H����T�w��6i�x�*���_���k-,�ff�ZP�Eq��6�����K��%@��K �x���� F~�� IYq+3)W�13k(���M�qf<2�@oalG��^ߘQc[�j=�d�K�!��L"��s��-f>Ë�õ��u��<��]��!=\�}��`�fzOSg�^��nS5f}��8i��b��ӗyN�^�y��Njr4������!��<]J��f��S�J����4�N����'J^�:�_Ƃ{�����!�{��( ��vA�z� ;�(pI(��fҲQ��.�8�);df�����IR6p0J
-L+1 ���qT/;0��@��Bs��3�@��e�{j3�����b��[K&��$YZL9 ��L�Ce� ��ky�/5w��c��Ys�a��s�v��g1a 2݈�uy
-|˴8%ס;L��,�;��T@�����xn9ļ(�cj1u�%��ĩ�CA]In1��,-&ա�I%@p4�
-��,� ��iz��h��f�@����44��k1q�`}��P��ħu+W�ng&Q���4�k���ͦmN�nK7"�ꬉ��ӯ?7+��l'3�='�g���fq9���Y�3q�u�{�<4+.�C����j%��xg8T�W��*����R떷D��/3mI���BH.2o���L�p�.*�#)�|>k�|�x��3!��l�\oA�-G��K@��� �E��3f_���U�#�������� �%�:
-��0����C92W����;��$�\��īC��3�
-S|C�@���թ�I�NY����Z�rѮ�x+���ߜ�
-j8�M��;E5p�nu��Z2���@W�P;s��n�՟"=���{�l�[}&�̜�U��~�9v9ZX���'P,5#�aɌ߃����%�����%��r��k���ۚ�gmL
-����f��aGQj;[t���T�y������.:~���1�c|i���Û�бj䮈�K�6�>� ���A�;���ypz,@4���0?��I�Y�
-afQ~�A�܄yg��̢�/�ڴ���6%�k�Y{f���jm��K�mJ� 3c�?�6Vg��8��ɼ��t���I�����pR,-�/A�X����-T�4��
-Q��p���&!�S�1X~�d�~B4���B�}I�%KU#�<�M�>�%$j�B�|�����x��!~DO��&�'�X�u��.ns�pd�䋇�Ä(���O�c&ZrqiC7g�l��i��kQ�ZfOB��]u��4��#v.ucٜք߉��E�%�Gu�uG)֣;�{ �,�/�SXa�78W�漜+z湗?#�2Qe�+y-���|Ė� T�YPu3�����v��O���%��A����P���w3>��NJ�9�r'�I=A�s������N[�Ә"��#%�Ů)F+�[E�{�D�����l������r��ѵ'��\�A�h�|�(�_3�CZ�ݜ:�N���M�E/f�YvI�=��Ϋ_E��rK�F�̑��鹝�ST�w1��bbeI�2�GĠ��9!�W�������b�@K��?/]/P��P�!�Ɗ�l#��(K;���XyB6�$�s|ѡ܋�0 ��N��e醞����3}��G��b��f���[��@��(`��禹,�{��ߵ��KG�����Z�1p���<�Gn���R���1
-a�M�Xͮ�X��96����vc��U�On��T��L��"��YwT�G0h'�_w)|~��o��v�}Fnw��g�
-���������r"d�>����PK����"W�PK;cA��DH�sammoa.argoPK;cA��-�^*��sammoa_Diagrammedeclasses.pgmlPK;cAǒV9�&+-sammoa_Diagrammedecasdutilisation.pgmlPK;cA�M���VM.sammoa_Diagrammedeclasses2.pgmlPK;cAP����K�6sammoa.todoPK;cA8��7y��7sammoa_profile.profilePK;cA����"W�
-k8sammoa.xmiPK�}[
\ No newline at end of file
+�����������b<��SR�S�R�K�����+�,EȂ9PK8��7y�PKhiA
+sammoa.xmi�]ݖ�8r�ߧ���cϜl�%��${�s��N'�w���jD�j�)RCR=�^�5r��L����IP�Z�@�(�G��%d�P��P(T}��癫<� t|O����h>W�g���M�?��\u�+?����{{�|�9�Ts�9����?�}C��ißM���f8�#7ȏϕ�!#4��vŖ�_L����/Z���2��+j��>�E��k<`d�����>[���a/B���Z��?�� "m��ԧ�|��;���#/T(�
+�d���m���:՛u˟��_5m�[�;%��NH�'w��E�%�y�l]�Z���P�/Z��O仦��[���B����;S������>~��'�k��0�oaWI���oȻ~�9.���о�~��ӊ� ?Mߋ�}W�$]_�]�α�!U;W�+�*WWF��KƦm��mtۨ���l6_47���?_�D�r�f3=W��n�M�v��U�O6rCL���Q�7�O_����I��h�%���R���ak����
+���~{�{�����*�w�����rۡ�uq���C������? q�w����|�����7�n ��40^響��p���}�~��u��k1:R�N���ܷ|���;����;-��Sda���2C怜�0�
+���]8s4Ŋ,GA��@ М���
+���(�`�e����� ;�/)_��%������_G��s{d�<�A��0e�߿���S����7��Ϧ�K���Wl�dH�SLҀ�����ye9�^�)��ȭW��?������=�E��p@�hď���t�d) C���C�AL�?��l�K�lK�L4ߣ3%R�]��r��H�_��N��p+�����b��b�,9��G�U,j����r�%�ܯ��H��tx �� �����0���.қ̯�^s��b> �l���ED��K���������b:�_������6�� �/e�w1]b>�?����l|�8��-�!> o�POe��p���I��F2��?,�.���^�<Q�z��^~$,��?�NĂ�~2s�T��(��S��R�"@Dd��wȟ.1�1 j�E8l(���[�V���̍f�i�Y�T�c���'w��O��vH�B�>�t N��Z(���F �L�8���m�F�C�4-U렞�"l4�ʍj?e^!Ť�d9� �7�П�cD~'���ꢼ���!w����C�Zs�-5����x`�X�C��$�d~���^�=��&��۳Z�n�֙���u��7h��:�1�K�0�SLfM����ꎻ�[�߾�ݺ��#��`Iϑz'��,y�$awd�a��'����zӆK���n���ͲᱬlS�ɞ��a���O��\���!��w㿖���������m���=Ӧ0���Y6&F���~��2��U��%���f�D�~���V�`!?VC�8hؘ�O�3F�E�C�}�Z�R���z=��8��N�����F�ÿ�=W�Й8d�b�?_L\��1�"ypg���6d
+!�V�2c�=�<��%��P0���}v��b�],L�6��,�ט-�șr��Y��F�cY:`��|T#�/�՜��#m,�L�L.����T魟+��<��A+�e^j�5s,����̳ȡF(B������h��������
+?�^����%�5���][�F�����GD�A��ض�l�e���e��\g#�~�8�M!.p|����u������~��#����w����ܗ�Vu?�o_�s9�m�6Ey���%��l6�\����UJ��&�b��t�/l�ֿ�
+��_�u����$���u)�4.e���dM���{�s���#i��3�7��<>���KA(way����2����.����q��?s���0�M'� ���I��i.>�7^��'y��}gV�g����?� ��[�oz9�����qh:
+�t}S��8�
+�K$s՛fZc���,��hۓ��t�M��3�e)c�8��0W�GJ Y�[Hr�����Xߘ�H�V�1ۣ�s�N�Lճ���x��l�m<d.Ahc}��Z�jR���lն2���^յ�m��6�:����S�k��������8�8�w{�R�n���(b�p����gqne�V\% N �[�\��9ѡ�۔�c�݃-��-vSv[���\`�Ud�VV[l|�N��e:EΏ��n�1v��1�y��CeT�_�O��ۘeU�7��A�W�7�`��+ⳮ��S���Q$�aF��[|�<&\�q�]3�#�����l�|ats�t'Pljh�b'�����Γ�q�1��S�\L��d�������\�6h2���7�Ϊ����Q=<h��yr9z��N�M��q˰q���u����aq�����X�<�"4uhざy���Xcf���6>�SD�ʽ�h̔�N��l�$�yA�n��SH��Z��U��Yc;u����WH
+'�-&r^�<��yP��>�t
+|�ȸ���5���nfB���.7k�|�Z�Ff<�= /A#��C�<���/N#wO��U�̕qk��G��뮊ٹ�`I,����\̚X�>Xou�y���d@���e�ʪ�w
/E�ֵ�W�u0����p�\�N`�x��OC���.)=�[K ���0�UI���.�I�.5�\[}(��7���Z��I�R��9d�8^��3+N�X�,��ˍ��@H�q���s���M�0�о7�3}��BͬM/!=M�$Ly�{T�[���d4a�l�t��Reҏq���ʾ�P�Kv���gT�����
+���e�T`��Mѓ�_�V�ml��6���D�^��e�>n�E��/��٭UjeXZL�IQ��M�+��s��\5j�H�c�Z�{�7��B0 rͭ�f����b6�P�Z��)'��&�.
+*[�:_@��!= 8�"�1n<��pdg�D�0�?,{��aE���pF�ŭ4?�S�#�)��u��A��-��`CZN(P�+�
+�gH��Ur PŶ�����j�jW7P��������e#f���,�'�b3Z��_�ϧ\08�|����E`ό�
+��Er�:��u�������c��( �p���I�chg�{�L��x���\�Z�͙>��'N�?�Z�����f����D�ٲt���ѥ!r�e�����S%�(%��4P<�i
+f�)<��9�(V2�?m���@yNoq��(�k����+�V+��Q�VkuԮ�A�N��[�P�yu����Z����qRxx2�J�@�Um2�=6�~Ւ�����$�]jX��2(#����M����6��_����T���B����eZ��_i��O�ƒntt�X&�N��b� �c�g��*�].g�P:\�Mf^��I�_a��SfX`4<�[N˟��o���a��[�"|�vg�H�k��C�^\���f�������ޙAD�S��-���h!��ƮT<BN@0`ƨ$@���ԉ��OK�>c7���uy8p��B��\��2� dYj� 27��HP/$_N��93ױ7.@�<-&O��b��.
+�!�cHv �ЂN0�'�R�w:�5{M{�[����KйF����v�� �c�FA�Ces�v�I*^�>��I���Ò#���u�#<ǞE�� x�4^�1Uװ�ƻ�=
+��V������,���9,�d����Γm���Ӟg�{Pٷ!�S2�F�x�D�j�S/1n^�4+�-fa"N�KR*k��q�q�6 ᠈��0g��G4�ѐ�
+͑���N�`�[w�?`�B��z�Q�`�I��C�z���"{?+�}o�H���j���eߤ ��"7S3�Hq���k���9ա�G �ZpS3�@)n��Y�>HƜ�@d��0Y�[@�)�������5�q됻Y���F��Ԯ\1����&A�C���ʁH`"���2-&z@�>�Hu��5 ,nY�����2�,�&�8}P�!���@�[¸�0�wB�Ay���E�a�C���so������#r8�(�P��'��E�uy0Po{��h醪��81�DŸm1����� B�8�Sϒ,-&�P�@#Lu�,�$�fwC�'�5˚Q��L`�Tjǡi���,��^�א]fHAr]�¨�R�zݎfKEf����e�fc���;yu�x����1��8p�8�]@H���ch����1�`�9r�N ������7ÂO����T�"�x3<C� �ς�̈́�p�T�c�D�*naK�7�;0�-����P�2ա��KB��B��ƚ�=��Z��mn���q}�;��g1qg��A�Y�Cea�,�t;K��]�~�dP�l.���a��,��1�����PA��
+���9�TÕJ��XLAc��� 1��xOB��sX��ZL-�Ȓ8��Nu�q�Rq����XN�_�@����HQ#��.�$,�&3�%�E<��7�ƂA�y=�.�W$~�o��XZ�Q L ��u��O mx���J�U���Zv��EW�tP�R-v�/n�22����/y�}�U�� \������g.�����!�uA��{����=fJ�`��qc��( ,�p��I�#������0������Y-�X���3�֍7��x 3�|�Ϲ�j��9�&3�S]�d��'ϑ{�Y#��>��}��Y6��p�.k@<5`r��L�<�T&�aC������c��N�U���̀����G��B�)� �<C�Ɂ'A $�Ku��"3�
+=��y���d�G���L��FRU A������O.��9ա��gq�eZ�h��R��z�sj�`P'0���-�G��8a:�dxZL=q���^���X��c�v��?�9�(N�[Lu��B�:����8>2�=+�_�O}X�E�0{����A�,��2��kH����@�K�����.�.�8Xڌ�:!Fw:���#�VL%
+q���F�C���=A����q���=�{m�\�unt��E�ɳI�_?0��jA!�B�A�C�C��En��
+��GK^#���\��;
+��7� F�;���Q��kA���AdA�C���b�\:���&�g2<5J̴��uyPPg�@8a67*�m?��-fpȱ��J���AF�T�:C��7�y�l�����?��f
+�@���r�3�$�.*�<(Ij�A{'iF� w،|(�[�t����:��Pm�kv�mE����x��(��bj��5�R*�3Ķ���������7e�Y�?I�@p(�:�8 U<��#T�::�Ű������Lu�l��iגm���=Ӧ���Y6;e�ND�z)I�˟n���ג��݈0 �-d�Y��8}���Pc�Q\&��#i~�{�HI�S�G�>�͓�Pc ޝp�9�dvH���Іp�9�p����4�s�Y�S�C�>(Ƒ�Pc�H��=�>��[� g �s�Ce}�B�`��I�@]zԵ�Y=M��b��҄�f�ǘ�Z��@�>p�:��,� �Ѷu�TB @�;�%�f9����$N�k�dEXo.G�A��
+�[^�'����ף�*
+�c�}�j`K\��U�k�B@�4?�1r%+7ա�*.�Jnp~��b�H�R���?���eg10 N�@�C5��Ҭ{w�%�qO䀞ټ��o�Fkj�W�k�j!��I��7���pR�7�=�{e�Y��=Hh��PM'��Z��j[T(ڦ�k�I�)#�y{��P@��� � ΄�:��
+�w��̻ ���G��� 6zS��[�{��?�f!N T�Hu�B�/rE����hQ��Bx��@f
+�
+kP@���Ė *b�:���#�(�1�3�(8&� աޑ1�;��Mor���V?(�h1�����A�C�s�4l ԋ�
+��nG�̬Bcv����h������?Ȱ� 4�� ա�emN*'�{`G��C�n\g� 0�u���S̹�o��`�g2Dm�«�Q�����mS6�4l6[�6[E*KfN���i{XpI�z� �
+�o����ףVX�z��3fʈ��������8���}��K�ױ��^�����l����E�q�7��O�{�X�%4/3�{�У�o���Ed,9�!is�en�'�`B�dz|>9��ђk
+����u�M�>��j�a��Ϲ�j��Ɔ���96��l�?:N�#3��4F1>}��d|�M�&ܲ�O�h�3�>�ooz`�$ ���E��Ŝ����:��]!*�W���u,�S��sXnИA��0p��:7�-Y���@���d���ݦ:T�8T:m�jMp,Z�0
+S��
+��P �*�H�ɑ">4ev��Ğf^?��^����R��aZ;���@�����G
+�k�jUww��t�~�����Z;�l̴DK���? >6� )��(�lkmMU-ʉ��n�&Scobs�;����n�|"�u��(>*���K������� �\�m��aB0!;{�vu���Z����E���?g�_<?z�C�t8�+���[��L6�Àn�Ul=l�bC������L;P>1�;"S���X8p�)�j�ş��z�N<]���=�6w�(S���V�Q�bv�$�DPz����[DW��I%k� pE���rz�;�2�ݜ}!�X=��eɑ ���)�,9F*�1�$!�,����&���iy�f ݞh:���m��v[E,��2v<����ߜ�w#L`;�a�����<�M�.��K1 ���LvCf�
+�)�Gfr*����bJt��'v�"�}�:�_�nc��c�B�^��e3�f'�A��/�7gf��K^��<*�@�0}b��^e���M9�/q�`*�_5��ϫ���d�M=4�cO�^�)h�掇��JX��[̽v�¢nfaFke]'��o3�@^Z��zX$��������
+b�7:���U�2�r�_3���"�_ߔ]g�#��ƶ�.��L��Uc�w5��?r4(�~�F03���Q���/N�.6S��!6�Lz�Wv=,V��p���N��yD]]�{ݘ͝�f�=��8i�z1U���<�D/̼D_'5��
+�a}}�S�rG{�.%y}�k�)s%nep�^��t� '�ςJ^�%/S�/c�=�s�bw��=�N���ZСq��
+\
+��LZ.��:P�R�����@f�'z]�$e7��P��7�Au;9�e�fY��(�X(`�C<���`Ȳ��{O*3(�.��db,�@��Ŕ�� �ɤ:T�ȿ���Rsg�:�!�͑3��Z�01��a��`~� A Ӎ�\��0��L�SrJ��$�ϲ����NJu�[�x���G�k�9�S�X�@(L��?TЕ��#��@ ��bRJX�T�G���T�X&t��4
+������f�D�0��44��k1q�`}��P��ħu+W�V3�(M\R��5���fӶ&V�e�1,�n"�k��k���
+�9���fE�ĉ�Y/&�Y\*ba��L�x�n9͊�E�:;>hz��A,���U��
+�fs�����-��L[R�d�����[!&#co1Kޑq>���\�X�ˇÙ���\�~0�ޖ�py�% ���� �E�t3f�F�7ˆG2���zw��Û1�%�:
+��0����rd.o/�w�`+H���[�3�W��gg�,����P}c�S%��$.��de�<�]��V\��93P�p�&%w�������d0�Á���v�ߝN�7AF�atu�ƭ�Ff�Ɋ*a�W?��-,�肎̈(����d��~Y���q
+��E���j9�ᕎ��ê�a[����i�l�:mv���E�)NL5���x �����Gx�={旆�:�9�9
+�F�轄l��@�z��md����lrV��$�'fc'(��E� cA�s�3�r�0듦��UJt�B�j[�&�Z#��҅y��#��X쏰��噫"�k0G2��9�3�i�Se����,�K���K(V���sU>
+gpC��=�~�b���)��0L�^?!8�|��K���"�6�߆��Q�r�c�؏�k��zt��a"kq��_>$m��̚|ɐ���8��\\Z�͙/���<A?�Z�ĭ�ٓPjt�]�3�m���K][6�5�w�/��gQ~��QCd�Q���N�3��K�VG���
+Εb�9/犑y��g�:��{%�%U���� c6���<�Nf:XP�vA������F��^Gm���6�Ɲ�E���:D��:gtQ��� ����N'\re��Y�P ���e
+���{ W�4��D%������DS7�k��O�S���6A���M�O���YO)�#"y�ߧҷާ1A!^f+��d���J�Vq���o��fk��t�m�sr8֮�Y�9�jrFs�SDq�E�g�ۻ)��I�H�f��S�gW�C<_�/F�-Y�3
+0G&���vBL|+�"���$����9�Ȕ-����]b?��/������%�<��H!�C�)D���5��=e�.Bz3GV���&�s|с܋�ED�ӟ�G��_J��'"���!@��i�r���oEy�������bpu
+#-���^:R��T�����kF�������6���(��6��sy��j�O��3rG�_{�����'7�w3��5R�X��=�����~��a�]
+�����i������6p���րۙ����ooo�1��=����PKH.�?�"��PKhiA��DH�sammoa.argoPKhiA+����*֡�sammoa_Diagrammedeclasses.pgmlPKhiAǒV9�&�-sammoa_Diagrammedecasdutilisation.pgmlPKhiAe����V�.sammoa_Diagrammedeclasses2.pgmlPKhiAP����K27sammoa.todoPKhiA8��7y�O8sammoa_profile.profilePKhiAH.�?�"��
+9sammoa.xmiPK�\
\ No newline at end of file
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightBar.css
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightBar.css 2012-08-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightBar.css 2012-08-29 14:43:17 UTC (rev 491)
@@ -66,7 +66,10 @@
}
#lblStatus {
- text: {flightUIModel.getCurrentRoute().getRouteType().name()};
+ text: {flightUIModel.getCurrentRoute().getRouteType().name()
+ + (flightUIModel.getCurrentRoute().getEffortNumber() != null
+ ? " " + flightUIModel.getCurrentRoute().getEffortNumber()
+ : "")};
}
#cbPanel {
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java 2012-08-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java 2012-08-29 14:43:17 UTC (rev 491)
@@ -125,6 +125,7 @@
import javax.swing.AbstractButton;
import javax.swing.Action;
import javax.swing.ActionMap;
+import javax.swing.DefaultCellEditor;
import javax.swing.InputMap;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
@@ -422,13 +423,24 @@
// OBSERVER columns (Left, Right, Nav, Co-Nav positions)
{
+ final JComboBox comboBox = new JComboBox();
+ comboBox.setRenderer(observerListCellRenderer);
+ SwingUtil.fillComboBox(comboBox, getModel().getFlightObserverForPositions(), null);
+
+ getModel().addPropertyChangeListener(
+ FlightUIModel.PROPERTY_FLIGHT_OBSERVER_FOR_POSITIONS,
+ new PropertyChangeListener() {
+
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ SwingUtil.fillComboBox(comboBox, (List<Observer>) evt.getNewValue(), null);
+ }
+ });
+
table.setDefaultEditor(
- Observer.class,
- new ObserverTableCellEditor(tableModel.getReference(), observerListCellRenderer)
- );
-
- table.setDefaultRenderer(Observer.class,
- decoratorService.newTableCellRender(Observer.class));
+ Observer.class, new DefaultCellEditor(comboBox));
+ table.setDefaultRenderer(
+ Observer.class, decoratorService.newTableCellRender(Observer.class));
}
// CROSSING_NUMBER column
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/EffortPanel.css
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/EffortPanel.css 2012-08-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/EffortPanel.css 2012-08-29 14:43:17 UTC (rev 491)
@@ -123,6 +123,11 @@
#routeTable {
model: {routeTableModel};
+ selectionMode: {ListSelectionModel.SINGLE_SELECTION};
+ selectionBackground: {null};
+ selectionForeground: {Color.BLACK};
+ sortable: false;
+ _terminateEditOnFocusLost: {true};
}
#addButton {
@@ -130,13 +135,18 @@
}
#lblObservation2 {
- text:"sammoa.observation.title";
- horizontalTextPosition:"{JLabel.CENTER}";
- horizontalAlignment:"{JLabel.CENTER}";
+ text: "sammoa.observation.title";
+ horizontalTextPosition: {JLabel.CENTER};
+ horizontalAlignment: {JLabel.CENTER};
}
#observationTable {
model:{observationTableModel};
+ selectionMode: {ListSelectionModel.SINGLE_SELECTION};
+ selectionBackground: {null};
+ selectionForeground: {Color.BLACK};
+ sortable: false;
+ _terminateEditOnFocusLost: {true};
}
#leftButton {
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/EffortPanel.jaxx
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/EffortPanel.jaxx 2012-08-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/EffortPanel.jaxx 2012-08-29 14:43:17 UTC (rev 491)
@@ -26,6 +26,8 @@
<import>
java.awt.Dimension
+ java.awt.Color
+ javax.swing.ListSelectionModel
fr.ulr.sammoa.persistence.Position
fr.ulr.sammoa.persistence.Route
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/EffortPanelHandler.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/EffortPanelHandler.java 2012-08-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/EffortPanelHandler.java 2012-08-29 14:43:17 UTC (rev 491)
@@ -24,6 +24,7 @@
*/
import com.google.common.base.Supplier;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import fr.ulr.sammoa.application.FlightService;
import fr.ulr.sammoa.application.device.DeviceState;
@@ -71,6 +72,7 @@
import org.jdesktop.swingx.JXTable;
import org.jdesktop.swingx.decorator.Highlighter;
import org.jdesktop.swingx.table.TableColumnExt;
+import org.nuiton.util.decorator.Decorator;
import org.nuiton.validator.NuitonValidatorScope;
import org.nuiton.validator.bean.list.BeanListValidator;
import org.slf4j.Logger;
@@ -83,17 +85,14 @@
import javax.swing.JTextField;
import javax.swing.ListCellRenderer;
import javax.swing.ListSelectionModel;
-import javax.swing.SwingUtilities;
import javax.swing.border.LineBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
-import javax.swing.event.TableModelEvent;
-import javax.swing.event.TableModelListener;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;
import java.awt.Color;
-import java.awt.Rectangle;
+import java.awt.Component;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
@@ -177,16 +176,15 @@
// init route section
{
+ JXTable table = ui.getRouteTable();
+ RouteTableModel tableModel = ui.getRouteTableModel();
+
BeanListValidator<Route> validator = ui.getRouteValidator();
validator.setContext(validatorContext);
getParentUI().setContextValue(validator, ROUTE_VALIDATOR_CONTEXT_VALUE);
- RouteTableModel tableModel = ui.getRouteTableModel();
-
- JXTable dataTable = ui.getRouteTable();
-
- init(dataTable, new ListSelectionListener() {
+ init(table, new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
@@ -239,7 +237,7 @@
});
SwingUtil.setI18nTableHeaderRenderer(
- dataTable,
+ table,
n_("sammoa.observations.routeTable.column.effortNumber"),
n_("sammoa.observations.routeTable.column.effortNumber.tip"),
n_("sammoa.observations.routeTable.column.beginTime"),
@@ -278,13 +276,14 @@
n_("sammoa.observations.routeTable.column.deleted.tip")
);
+ int columnToEditOnInsert = RouteTableModel.RouteColumn.SEA_STATE.ordinal();
flightUIModel.addPropertyChangeListener(
FlightUIModel.PROPERTY_ROUTES,
- new TableDataChangeListener(dataTable, tableModel)
+ new TableDataChangeListener(table, columnToEditOnInsert)
);
// Highlighter for no modification
- dataTable.addHighlighter(
+ table.addHighlighter(
SammoaUtil.newForegroundColorHighlighter(
new RouteNoModificationHighlightPredicate(tableModel),
SammoaColors.ROUTE_NO_MODIFICATION_ROW_COLOR)
@@ -295,19 +294,19 @@
SwingValidatorUtil.registerListValidator(
validator,
errorTableModel,
- dataTable,
+ table,
errorTable, dataLocator);
addHightLighterOnEditor(
- validator, dataTable, dataLocator,
+ validator, table, dataLocator,
NuitonValidatorScope.ERROR,
NuitonValidatorScope.WARNING);
- dataTable.addHighlighter(SammoaUtil.newForegroundColorHighlighter(
+ table.addHighlighter(SammoaUtil.newForegroundColorHighlighter(
new DeletedRowHighlightPredicate(flightUIModel.getRoutes()),
SammoaColors.DELETED_ROW_COLOR)
);
- dataTable.addHighlighter(SammoaUtil.newForegroundColorHighlighter(
+ table.addHighlighter(SammoaUtil.newForegroundColorHighlighter(
new ValidRowHighlightPredicate(flightUIModel.getRoutes()),
SammoaColors.VALID_ROW_COLOR)
);
@@ -319,6 +318,7 @@
// init observation section
{
+ JXTable table = ui.getObservationTable();
BeanListValidator<Observation> validator = ui.getObservationValidator();
validator.setContext(validatorContext);
@@ -337,10 +337,10 @@
}
+ int columnToEditOnInsert = ObservationTableModel.ObservationColumn.POD_SIZE.ordinal();
flightUIModel.addPropertyChangeListener(
FlightUIModel.PROPERTY_OBSERVATIONS,
- new TableDataChangeListener(ui.getObservationTable(),
- ui.getObservationTableModel())
+ new TableDataChangeListener(table, columnToEditOnInsert)
);
// For CircleBack buttons
@@ -351,25 +351,14 @@
flightUIModel.addPropertyChangeListener(
FlightUIModel.PROPERTY_ROUTE_EDIT_BEAN, observationUpdateListener);
- JXTable dataTable = ui.getObservationTable();
-
- // set combobox renderer for ObservationStatus
- dataTable.setDefaultEditor(ObservationStatus.class, new DefaultCellEditor(new JComboBox(ObservationStatus.values())));
-
- dataTable.addHighlighter(
- SammoaUtil.newBackgroundColorHighlighter(
- new ObservationForSelectedRouteHighlightPredicate(flightUIModel),
- SammoaColors.OBSERVATION_FOR_ROUTE_ROW_COLOR)
- );
-
SwingUtil.setI18nTableHeaderRenderer(
- dataTable,
+ table,
n_("sammoa.observations.observationTable.column.observationNumber"),
n_("sammoa.observations.observationTable.column.observationNumber.tip"),
n_("sammoa.observations.observationTable.column.observationTime"),
n_("sammoa.observations.observationTable.column.observationTime.tip"),
- n_("sammoa.observations.observationTable.column.observer"),
- n_("sammoa.observations.observationTable.column.observer.tip"),
+ n_("sammoa.observations.observationTable.column.position"),
+ n_("sammoa.observations.observationTable.column.position.tip"),
n_("sammoa.observations.observationTable.column.podSize"),
n_("sammoa.observations.observationTable.column.podSize.tip"),
n_("sammoa.observations.observationTable.column.species"),
@@ -399,7 +388,7 @@
);
// init(dataTable, new ObservationTableListSelectionListener(ui.getFlightUIModel()));
- init(dataTable, new ListSelectionListener() {
+ init(table, new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
@@ -457,45 +446,84 @@
}
});
- // set renderer and editor as button for circle back action
- int circleBack = ObservationTableModel.ObservationColumn.CIRCLE_BACK.ordinal();
- ButtonActionTableCellEditorRenderer editorRenderer = new ButtonActionTableCellEditorRenderer(
- CircleBackAction.CLIENT_PROPERTY_OBSERVATION,
- new Supplier<Action>() {
+ TableCellRenderer stringRenderer = table.getDefaultRenderer(String.class);
- @Override
- public Action get() {
- FlightUIHandler flightUIHandler = getParentUI().getHandler();
- return flightUIHandler.getActionMap().get("circleBack");
- }
- },
- null
- );
- TableColumnExt column = dataTable.getColumnExt(circleBack);
+ // ObservationStatus
+ {
+ JComboBox comboBox = new JComboBox(ObservationStatus.values());
+ table.setDefaultEditor(
+ ObservationStatus.class, new DefaultCellEditor(comboBox));
+ }
- column.setSortable(false);
- column.setCellEditor(editorRenderer);
- column.setCellRenderer(editorRenderer);
+ // Position
+ {
+ TableCellRenderer renderer;
+ if (flightUIModel.isValidationMode()) {
+ renderer = new ObservationPositionCellRenderer(
+ stringRenderer, decoratorService, ui.getObservationTableModel());
+ } else {
+ renderer = decoratorService.newTableCellRender(Position.class);
+ }
+
+ JComboBox comboBox = new JComboBox();
+ comboBox.setRenderer(decoratorService.newListCellRender(Position.class));
+ SwingUtil.fillComboBox(comboBox, ImmutableList.of(
+ Position.FRONT_LEFT, Position.NAVIGATOR, Position.FRONT_RIGHT
+ ), null);
+
+ table.setDefaultRenderer(Position.class, renderer);
+ table.setDefaultEditor(
+ Position.class, new DefaultCellEditor(comboBox));
+ }
+
+ // CircleBack action
+ {
+ int circleBack = ObservationTableModel.ObservationColumn.CIRCLE_BACK.ordinal();
+ ButtonActionTableCellEditorRenderer editorRenderer = new ButtonActionTableCellEditorRenderer(
+ CircleBackAction.CLIENT_PROPERTY_OBSERVATION,
+ new Supplier<Action>() {
+
+ @Override
+ public Action get() {
+ FlightUIHandler flightUIHandler = getParentUI().getHandler();
+ return flightUIHandler.getActionMap().get("circleBack");
+ }
+ },
+ null
+ );
+ TableColumnExt column = table.getColumnExt(circleBack);
+
+ column.setSortable(false);
+ column.setCellEditor(editorRenderer);
+ column.setCellRenderer(editorRenderer);
+ }
+
ObservationValidatorDataLocator dataLocator =
new ObservationValidatorDataLocator();
SwingValidatorUtil.registerListValidator(
validator,
errorTableModel,
- dataTable,
+ table,
errorTable, dataLocator);
+ table.addHighlighter(
+ SammoaUtil.newBackgroundColorHighlighter(
+ new ObservationForSelectedRouteHighlightPredicate(flightUIModel),
+ SammoaColors.OBSERVATION_FOR_ROUTE_ROW_COLOR)
+ );
+
addHightLighterOnEditor(
- validator, dataTable, dataLocator,
+ validator, table, dataLocator,
NuitonValidatorScope.ERROR,
NuitonValidatorScope.WARNING);
- dataTable.addHighlighter(SammoaUtil.newForegroundColorHighlighter(
+ table.addHighlighter(SammoaUtil.newForegroundColorHighlighter(
new DeletedRowHighlightPredicate(flightUIModel.getObservations()),
SammoaColors.DELETED_ROW_COLOR)
);
- dataTable.addHighlighter(SammoaUtil.newForegroundColorHighlighter(
+ table.addHighlighter(SammoaUtil.newForegroundColorHighlighter(
new ValidRowHighlightPredicate(flightUIModel.getObservations()),
SammoaColors.VALID_ROW_COLOR)
);
@@ -594,17 +622,16 @@
}
// Fire on TableModel to update the row (highlighting)
- // invokeLater in case of new route, otherwise the size is not updated yet
- // in tableModel and an IndexOutOfBounds appears
- SwingUtilities.invokeLater(new Runnable() {
+ // ensureRowIndex in case of new route, otherwise the size is
+ // not updated yet in tableModel and an IndexOutOfBounds appears
+ int index = flightUIModel.indexOfRoutes(route);
+ SwingUtil.ensureRowIndex(ui.getRouteTableModel(), index);
+ ui.getRouteTableModel().fireTableRowsUpdated(index, index);
- @Override
- public void run() {
- Route route = ui.getFlightUIModel().getRouteEditBean();
- int index = ui.getFlightUIModel().indexOfRoutes(route);
- ui.getRouteTableModel().fireTableRowsUpdated(index, index);
- }
- });
+ // Update observation table to ensure observer's name during validation
+ if (flightUIModel.isValidationMode()) {
+ updateObservationTable(route, false);
+ }
}
}
}
@@ -624,15 +651,15 @@
ListSelectionListener selectionListener) {
// make tab key to focus only next editable cell
- table.setSelectionModel(new ForceSelectionSelectionModel());
- table.setSelectionBackground(null);
- table.setSelectionForeground(Color.BLACK);
+// table.setSelectionModel(new ForceSelectionSelectionModel());
+// table.setSelectionBackground(null);
+// table.setSelectionForeground(Color.BLACK);
+//
+//// table.setSortable(context.isValidationMode());
+// table.setSortable(false);
-// table.setSortable(context.isValidationMode());
- table.setSortable(false);
+// table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
- table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
-
final Action moveToNextEditableCell = new MoveToNextEditableCellAction(table);
final Action moveToPreviousEditableCell = new MoveToPreviousEditableCellAction(table);
final Action moveToPreviousRowEditableCell = new MoveToPreviousRowEditableAction(table);
@@ -704,29 +731,59 @@
SwingUtil.scrollToTableSelection(table);
- table.getModel().addTableModelListener(new TableModelListener() {
- @Override
- public void tableChanged(TableModelEvent e) {
- switch (e.getType()) {
- case TableModelEvent.INSERT:
+// table.getModel().addTableModelListener(new TableModelListener() {
+// @Override
+// public void tableChanged(TableModelEvent e) {
+// switch (e.getType()) {
+// case TableModelEvent.INSERT:
+//
+// // auto select new added line
+// table.getSelectionModel().setSelectionInterval(e.getFirstRow(), e.getFirstRow());
+// Rectangle rect = table.getCellRect(e.getFirstRow(), 0, true);
+// table.scrollRectToVisible(rect);
+// break;
+//
+// case TableModelEvent.DELETE:
+// case TableModelEvent.UPDATE:
+//
+// // auto select first line ?
+// if (table.getSelectedRow() < 0 && table.getRowCount() > 0) {
+// table.getSelectionModel().setSelectionInterval(0, 0);
+// }
+// break;
+// }
+// }
+// });
+ }
- // auto select new added line
- table.getSelectionModel().setSelectionInterval(e.getFirstRow(), e.getFirstRow());
- Rectangle rect = table.getCellRect(e.getFirstRow(), 0, true);
- table.scrollRectToVisible(rect);
- break;
+ protected void updateObservationTable(Route route, boolean scrollToFirst) {
- case TableModelEvent.DELETE:
- case TableModelEvent.UPDATE:
+ FlightUIModel model = ui.getFlightUIModel();
- // auto select first line ?
- if (table.getSelectedRow() < 0 && table.getRowCount() > 0) {
- table.getSelectionModel().setSelectionInterval(0, 0);
- }
- break;
+ Iterable<Observation> observations =
+ Observations.filterInRoute(model.getObservations(), route, model.getRoutes(), true);
+
+ if (Iterables.isEmpty(observations)) {
+ // nothing to do
+
+ } else {
+
+ int firstIndex = -1;
+ int lastIndex = -1;
+ for (Observation observation : observations) {
+ int index = model.indexOfObservations(observation);
+ if (firstIndex == -1 || firstIndex > index) {
+ firstIndex = index;
}
+ if (lastIndex == -1 || lastIndex < index) {
+ lastIndex = index;
+ }
}
- });
+ ui.getObservationTableModel().fireTableRowsUpdated(firstIndex, lastIndex);
+ if (scrollToFirst) {
+ ui.getObservationTable().scrollRowToVisible(firstIndex);
+ }
+ }
}
private PropertyChangeListener observationUpdateListener = new PropertyChangeListener() {
@@ -740,7 +797,6 @@
if (FlightUIModel.PROPERTY_ROUTE_EDIT_BEAN.equals(evt.getPropertyName())) {
-
Route oldValue = (Route) evt.getOldValue();
if (oldValue != null) {
updateObservationTable(oldValue, false);
@@ -750,46 +806,45 @@
updateObservationTable(newValue, true);
}
- } else {
+ } else if (ui.getFlightUIModel().sizeObservations() > 0) {
ui.getObservationTableModel().fireTableRowsUpdated(
0, ui.getFlightUIModel().sizeObservations() - 1);
}
+ }
+ };
+ private static class ObservationPositionCellRenderer implements TableCellRenderer {
-// if (selectedRow != -1) {
-// ui.getObservationTable().scrollRowToVisible(selectedRow);
-// ui.getObservationTable().setRowSelectionInterval(selectedRow, selectedRow);
-// }
+ protected TableCellRenderer delegate;
+
+ protected Decorator<Position> decorator;
+
+ protected ObservationTableModel model;
+
+ public ObservationPositionCellRenderer(TableCellRenderer delegate,
+ UIDecoratorService decoratorService,
+ ObservationTableModel model) {
+ this.delegate = delegate;
+ this.decorator = decoratorService.getDecoratorByType(Position.class);
+ this.model = model;
}
- };
- protected void updateObservationTable(Route route, boolean scrollToFirst) {
+ @Override
+ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
- FlightUIModel model = ui.getFlightUIModel();
+ Observation observation = model.getBean(row);
- Iterable<Observation> observations =
- Observations.filterInRoute(model.getObservations(), route, model.getRoutes(), true);
+ Route route = Routes.findWithObservation(model.getFlightUIModel().getRoutes(), observation, true);
- if (Iterables.isEmpty(observations)) {
- // nothing to do
- } else {
+ ObserverPosition observerPosition = route.getObserverPositionByPosition(observation.getPosition());
- int firstIndex = -1;
- int lastIndex = -1;
- for (Observation observation : observations) {
- int index = model.indexOfObservations(observation);
- if (firstIndex == -1 || firstIndex > index) {
- firstIndex = index;
- }
- if (lastIndex == -1 || lastIndex < index) {
- lastIndex = index;
- }
+ String newValue = decorator.toString(observation.getPosition());
+ if (observerPosition != null && observerPosition.getObserver() != null) {
+ newValue += " (" + observerPosition.getObserver().getInitials() + ")";
}
- ui.getObservationTableModel().fireTableRowsUpdated(firstIndex, lastIndex);
- if (scrollToFirst) {
- ui.getObservationTable().scrollRowToVisible(firstIndex);
- }
+
+ return delegate.getTableCellRendererComponent(table, newValue, isSelected, hasFocus, row, column);
}
}
Deleted: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/ForceSelectionSelectionModel.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/ForceSelectionSelectionModel.java 2012-08-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/ForceSelectionSelectionModel.java 2012-08-29 14:43:17 UTC (rev 491)
@@ -1,59 +0,0 @@
-/*
- * #%L
- * SAMMOA :: UI Swing
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2012 UMS 3462, Code Lutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program. If not, see
- * <http://www.gnu.org/licenses/gpl-3.0.html>.
- * #L%
- */
-
-package fr.ulr.sammoa.ui.swing.observations;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.swing.DefaultListSelectionModel;
-
-/**
- * Surcharge de modele de selection par default pour empecher la deselection
- * de la dernière ligne et pour qu'il y est toujours une ligne selectionnée.
- *
- * @author echatellier
- */
-public class ForceSelectionSelectionModel extends DefaultListSelectionModel {
-
- private static final Logger logger =
- LoggerFactory.getLogger(ForceSelectionSelectionModel.class);
-
- private static final long serialVersionUID = 1L;
-
- @Override
- public int getSelectionMode() {
- return SINGLE_SELECTION;
- }
-
- @Override
- public void removeSelectionInterval(int index0, int index1) {
- // don't do anything
- if (logger.isDebugEnabled()) {
- logger.debug("don't remove selection interval ({}, {})",
- index0, index1);
- }
- }
-}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/ObservationTableModel.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/ObservationTableModel.java 2012-08-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/ObservationTableModel.java 2012-08-29 14:43:17 UTC (rev 491)
@@ -29,8 +29,7 @@
import fr.ulr.sammoa.persistence.Flight;
import fr.ulr.sammoa.persistence.Observation;
import fr.ulr.sammoa.persistence.ObservationStatus;
-import fr.ulr.sammoa.persistence.Observer;
-import fr.ulr.sammoa.persistence.ObserverPosition;
+import fr.ulr.sammoa.persistence.Position;
import fr.ulr.sammoa.persistence.Region;
import fr.ulr.sammoa.persistence.Species;
import fr.ulr.sammoa.persistence.SpeciesImpl;
@@ -127,15 +126,15 @@
return cell;
}
+ public FlightUIModel getFlightUIModel() {
+ return flightUIModel;
+ }
+
public enum ObservationColumn {
OBSERVATION_NUMBER(false, int.class, Observation.PROPERTY_OBSERVATION_NUMBER),
OBSERVATION_TIME(false, Date.class, Observation.PROPERTY_OBSERVATION_TIME),
- OBSERVER(false, String.class,
- Observation.PROPERTY_OBSERVER_POSITION,
- ObserverPosition.PROPERTY_OBSERVER,
- Observer.PROPERTY_INITIALS
- ),
+ POSITION(true, Position.class, Observation.PROPERTY_POSITION),
POD_SIZE(true, int.class, Observation.PROPERTY_POD_SIZE),
SPECIES(true, String.class, Observation.PROPERTY_SPECIES, Species.PROPERTY_CODE) {
@Override
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/RouteTableModel.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/RouteTableModel.java 2012-08-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/RouteTableModel.java 2012-08-29 14:43:17 UTC (rev 491)
@@ -144,10 +144,11 @@
Transect transect = transectFlight.getTransect();
- // retrieve the index of the transectFlight in the flight
- int index = model.getFlight().getTransectFlightIndex(transectFlight);
+// int index = model.getFlight().getTransectFlightIndex(transectFlight);
+// result = transect.getName() + " (" + index + ")";
- result = transect.getName() + " (" + index + ")";
+ int crossingNumber = transectFlight.getCrossingNumber();
+ result = transect.getName() + " (" + crossingNumber + ")";
} else {
result = null;
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TableDataChangeListener.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TableDataChangeListener.java 2012-08-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TableDataChangeListener.java 2012-08-29 14:43:17 UTC (rev 491)
@@ -49,10 +49,13 @@
protected AbstractTableModel tableModel;
+ protected int firstEditableColumn;
+
public TableDataChangeListener(JXTable table,
- AbstractTableModel tableModel) {
+ int firstEditableColumn) {
this.table = table;
- this.tableModel = tableModel;
+ this.tableModel = (AbstractTableModel) table.getModel();
+ this.firstEditableColumn = firstEditableColumn;
}
@Override
@@ -91,10 +94,10 @@
} else {
tableModel.fireTableRowsInserted(rowIndex, rowIndex);
- int columnIndex = getFirstEditableColumn(rowIndex);
- if (columnIndex != NO_COLUMN_INDEX_TO_EDIT_ON_INSERT) {
- table.changeSelection(rowIndex, columnIndex, false, false);
- table.editCellAt(rowIndex, columnIndex);
+// int columnIndex = getFirstEditableColumn(rowIndex);
+ if (firstEditableColumn != NO_COLUMN_INDEX_TO_EDIT_ON_INSERT) {
+ table.changeSelection(rowIndex, firstEditableColumn, false, false);
+ table.editCellAt(rowIndex, firstEditableColumn);
}
}
@@ -123,16 +126,16 @@
}
}
}
-
- protected int getFirstEditableColumn(int rowIndex) {
- for (int columnIndex = 0; columnIndex < tableModel.getColumnCount(); columnIndex++) {
-
- boolean editable = tableModel.isCellEditable(rowIndex, columnIndex);
-
- if (editable) {
- return columnIndex;
- }
- }
- return NO_COLUMN_INDEX_TO_EDIT_ON_INSERT;
- }
+//
+// protected int getFirstEditableColumn(int rowIndex) {
+// for (int columnIndex = 0; columnIndex < tableModel.getColumnCount(); columnIndex++) {
+//
+// boolean editable = tableModel.isCellEditable(rowIndex, columnIndex);
+//
+// if (editable) {
+// return columnIndex;
+// }
+// }
+// return NO_COLUMN_INDEX_TO_EDIT_ON_INSERT;
+// }
}
Modified: trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties
===================================================================
--- trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2012-08-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2012-08-29 14:43:17 UTC (rev 491)
@@ -182,12 +182,12 @@
sammoa.observations.observationTable.column.observationStatus.tip=Status
sammoa.observations.observationTable.column.observationTime=Time
sammoa.observations.observationTable.column.observationTime.tip=Time
-sammoa.observations.observationTable.column.observer=Obs
-sammoa.observations.observationTable.column.observer.tip=Obs
sammoa.observations.observationTable.column.photo=Photo
sammoa.observations.observationTable.column.photo.tip=Photo
sammoa.observations.observationTable.column.podSize=Pod size
sammoa.observations.observationTable.column.podSize.tip=Pod size
+sammoa.observations.observationTable.column.position=Pos
+sammoa.observations.observationTable.column.position.tip=Position
sammoa.observations.observationTable.column.species=Species
sammoa.observations.observationTable.column.species.tip=Species
sammoa.observations.observationTable.column.swimDir=Swim dir
1
0
r490 - trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio
by bpoussin@users.forge.codelutin.com 29 Aug '12
by bpoussin@users.forge.codelutin.com 29 Aug '12
29 Aug '12
Author: bpoussin
Date: 2012-08-29 16:38:16 +0200 (Wed, 29 Aug 2012)
New Revision: 490
Url: http://forge.codelutin.com/repositories/revision/sammoa/490
Log:
Ajout d'un nouveau recorder qui fonctionne :)
Il reste a mettre en configuration quelques variables pour pouvoir
l'instancier avec les bonnes valeurs (ce que veut l'utilisateur)
Il faut aussi ajouter une meilleur compression
Added:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioRecorder.java
Copied: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioRecorder.java (from rev 479, trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorderDefault.java)
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioRecorder.java (rev 0)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioRecorder.java 2012-08-29 14:38:16 UTC (rev 490)
@@ -0,0 +1,228 @@
+/*
+ * #%L
+ * SAMMOA :: Application
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2012 UMS 3462, Code Lutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/gpl-3.0.html>.
+ * #L%
+ */
+package fr.ulr.sammoa.application.device.audio;
+
+import com.google.common.base.Preconditions;
+import fr.ulr.sammoa.application.device.DeviceState;
+import fr.ulr.sammoa.application.device.DeviceStateEvent;
+import fr.ulr.sammoa.application.device.DeviceStateListener;
+import fr.ulr.sammoa.application.device.DeviceTechnicalException;
+import java.io.File;
+import java.util.Set;
+import java.util.Timer;
+import java.util.TimerTask;
+import javax.sound.sampled.AudioFileFormat;
+import javax.sound.sampled.AudioFormat;
+import javax.sound.sampled.AudioInputStream;
+import javax.sound.sampled.AudioSystem;
+import javax.sound.sampled.DataLine;
+import javax.sound.sampled.LineUnavailableException;
+import javax.sound.sampled.TargetDataLine;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Created: 16/05/12
+ *
+ * @author fdesbois <desbois(a)codelutin.com>
+ */
+public class SammoaAudioRecorder implements AudioRecorder {
+
+ private static final Logger log = LoggerFactory.getLogger(SammoaAudioRecorder.class);
+
+ protected AudioFormat audioFormat;
+
+ protected AudioFileFormat.Type outputType = AudioFileFormat.Type.WAVE;
+
+ protected DeviceState state;
+
+ protected Set<DeviceStateListener> listeners;
+
+ protected AudioRecorderThread currentRecorder;
+
+ public SammoaAudioRecorder(
+ float sampleRate, // 8000,11025,16000,22050,44100
+ int sampleSizeInBits // 8,16
+ ) {
+ int channels = 1; // 1,2
+ boolean signed = true; //true,false
+ boolean bigEndian = false; //true,false
+
+ audioFormat = new AudioFormat(
+ sampleRate,
+ sampleSizeInBits,
+ channels,
+ signed,
+ bigEndian);
+ }
+
+ @Override
+ public DeviceState getState() {
+ DeviceState result;
+ if (currentRecorder == null) {
+ result = DeviceState.READY;
+ } else {
+ result = DeviceState.RUNNING;
+ }
+ return result;
+ }
+
+ public void setState(DeviceState state, DeviceTechnicalException error) {
+ DeviceState oldValue = getState();
+ this.state = state;
+
+ // Fire on listeners
+ DeviceStateEvent event = new DeviceStateEvent(this, oldValue, state);
+ event.setError(error);
+ for (DeviceStateListener listener : listeners) {
+ listener.stateChanged(event);
+ }
+ }
+
+ @Override
+ public AudioFileFormat.Type getOutputType() {
+ return outputType;
+ }
+
+ @Override
+ public void addDeviceStateListener(DeviceStateListener listener) {
+ listeners.add(listener);
+ }
+
+ @Override
+ public void removeDeviceStateListener(DeviceStateListener listener) {
+ listeners.remove(listener);
+ }
+
+ @Override
+ public Set<DeviceStateListener> getDeviceStateListeners() {
+ return listeners;
+ }
+
+ @Override
+ public void open() throws DeviceTechnicalException {
+ // rien a faire
+ }
+
+ @Override
+ public void start() {
+ // rien a faire
+ }
+
+ @Override
+ public void record(File outputFile, long delaySeconds) {
+ Preconditions.checkArgument(outputFile != null);
+
+ try {
+ // stop last started if necessary
+ stop();
+ // start new recorder thread
+ currentRecorder = new AudioRecorderThread(
+ audioFormat, outputType, outputFile, delaySeconds);
+ currentRecorder.start();
+ } catch (Exception eee) {
+ eee.printStackTrace();
+ log.error("Can't record audio", eee);
+ }
+ }
+
+ @Override
+ public void stopRecord(long delaySeconds) {
+ stop();
+ }
+
+ @Override
+ public void stop() {
+ if (currentRecorder != null) {
+ currentRecorder.stopRecord();
+ currentRecorder = null;
+ }
+ }
+
+ @Override
+ public void close() throws DeviceTechnicalException {
+ stop();
+ }
+
+ static protected class AudioRecorderThread extends Thread{
+ protected TargetDataLine targetDataLine;
+ protected AudioFileFormat.Type fileType;
+ protected File filename;
+ protected long delayToClose;
+ protected AudioInputStream stream;
+
+ public AudioRecorderThread(
+ AudioFormat audioFormat, AudioFileFormat.Type fileType,
+ File filename, long delayToClose) throws LineUnavailableException {
+ this.fileType = fileType;
+ this.filename = filename;
+ this.delayToClose = delayToClose;
+
+
+ DataLine.Info dataLineInfo = new DataLine.Info(
+ TargetDataLine.class, audioFormat);
+
+ targetDataLine = (TargetDataLine)
+ AudioSystem.getLine(dataLineInfo);
+
+ AudioFormat.Encoding targetEncoding = AudioFormat.Encoding.ULAW;
+ targetDataLine.open(audioFormat);
+ targetDataLine.start();
+ stream = new AudioInputStream(targetDataLine);
+ stream = AudioSystem.getAudioInputStream(targetEncoding, stream);
+
+ }
+
+ /**
+ * Arrete l'enregistrement N seconde apres la demande, N etant
+ * le parametre delayToClose passer lors de la construction du thread
+ */
+ public void stopRecord() {
+ System.out.println("Arret demande ...");
+ Timer timer = new Timer();
+ timer.schedule(new TimerTask() {
+ @Override
+ public void run() {
+ targetDataLine.stop();
+ targetDataLine.close();
+ System.out.println("... arret reel");
+ }
+ }, delayToClose * 1000);
+ }
+
+ @Override
+ public void run(){
+ try{
+ System.out.println("Write audio to: " + filename);
+ log.debug("Write audio to: " + filename);
+ AudioSystem.write(stream, fileType, filename);
+ }catch (Exception eee) {
+ eee.printStackTrace();
+ log.error("Can't record audio", eee);
+ }
+
+ }
+ }
+}
1
0
r489 - in trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output: application map
by tchemit@users.forge.codelutin.com 29 Aug '12
by tchemit@users.forge.codelutin.com 29 Aug '12
29 Aug '12
Author: tchemit
Date: 2012-08-29 13:58:57 +0200 (Wed, 29 Aug 2012)
New Revision: 489
Url: http://forge.codelutin.com/repositories/revision/sammoa/489
Log:
fixes #1425: Nom des fichiers ?\195?\160 l'export
Modified:
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUIHandler.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/map/ExportMapUIHandler.java
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUIHandler.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUIHandler.java 2012-08-29 11:58:12 UTC (rev 488)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUIHandler.java 2012-08-29 11:58:57 UTC (rev 489)
@@ -413,7 +413,8 @@
flights = flightService.getFlights(newCampaign);
// add a null value to unselect flights
flights.add(0, null);
- filename = String.format("campaign-%s.sammoa", newCampaign.getCode());
+ filename = String.format("campaign-%1$s_%2$tY_%2$tm_%2$td.sammoa",
+ newCampaign.getCode(), new Date());
}
if (logger.isDebugEnabled()) {
logger.debug("New flights: {}", flights.size());
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/map/ExportMapUIHandler.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/map/ExportMapUIHandler.java 2012-08-29 11:58:12 UTC (rev 488)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/map/ExportMapUIHandler.java 2012-08-29 11:58:57 UTC (rev 489)
@@ -63,6 +63,7 @@
import java.beans.PropertyChangeListener;
import java.io.File;
import java.util.Collections;
+import java.util.Date;
import java.util.List;
import static org.nuiton.i18n.I18n._;
@@ -153,9 +154,10 @@
ExportMapUIModel model = getModel();
- model.setExportEffortsFilename("Efforts");
- model.setExportObservationsFilename("Observations");
- model.setExportGeoPointsFilename("GeoPoints");
+ String suffix = String.format("_%1$tY_%1$tm_%1$td", new Date());
+ model.setExportEffortsFilename("Efforts" + suffix);
+ model.setExportObservationsFilename("Observations" + suffix);
+ model.setExportGeoPointsFilename("GeoPoints" + suffix);
File currentDirectory = FileUtil.getCurrentDirectory();
String absolutePath = currentDirectory.getAbsolutePath();
1
0
Author: tchemit
Date: 2012-08-29 13:58:12 +0200 (Wed, 29 Aug 2012)
New Revision: 488
Url: http://forge.codelutin.com/repositories/revision/sammoa/488
Log:
fix license-m-p config
Modified:
trunk/sammoa-ui-swing/pom.xml
Modified: trunk/sammoa-ui-swing/pom.xml
===================================================================
--- trunk/sammoa-ui-swing/pom.xml 2012-08-29 11:57:44 UTC (rev 487)
+++ trunk/sammoa-ui-swing/pom.xml 2012-08-29 11:58:12 UTC (rev 488)
@@ -294,8 +294,7 @@
<configuration>
<licenseMerges>
<licenseMerge>
- The Apache Software License, Version 2.0|Apache License,
- Version 2.0
+ The Apache Software License, Version 2.0|Apache License, Version 2.0
</licenseMerge>
<licenseMerge>BSD License|BSD</licenseMerge>
</licenseMerges>
1
0
r487 - trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io
by tchemit@users.forge.codelutin.com 29 Aug '12
by tchemit@users.forge.codelutin.com 29 Aug '12
29 Aug '12
Author: tchemit
Date: 2012-08-29 13:57:44 +0200 (Wed, 29 Aug 2012)
New Revision: 487
Url: http://forge.codelutin.com/repositories/revision/sammoa/487
Log:
fix jaxx compil
Modified:
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/AbstractApplicationModelWithBackup.java
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/AbstractApplicationModelWithBackup.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/AbstractApplicationModelWithBackup.java 2012-08-29 11:25:54 UTC (rev 486)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/AbstractApplicationModelWithBackup.java 2012-08-29 11:57:44 UTC (rev 487)
@@ -24,15 +24,14 @@
* #L%
*/
-import org.jdesktop.beans.AbstractSerializableBean;
-
/**
* Abstract model which support backup configuration.
*
+ * <strong>Note:</strong> Do not remove explicit fqn of super-classe otherwise jaxx does not complie :(
* @author tchemit <chemit(a)codelutin.com>
* @since 0.7
*/
-public abstract class AbstractApplicationModelWithBackup extends AbstractSerializableBean {
+public abstract class AbstractApplicationModelWithBackup extends org.jdesktop.beans.AbstractSerializableBean {
private static final long serialVersionUID = 1L;
1
0
29 Aug '12
Author: tchemit
Date: 2012-08-29 13:25:54 +0200 (Wed, 29 Aug 2012)
New Revision: 486
Url: http://forge.codelutin.com/repositories/revision/sammoa/486
Log:
fixes #1413: Backup des donn?\195?\169es avant suppression
reusinage des repertoire (on laisse dans la configuration uniquement ce qui est configurable)
Added:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaDirectories.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/BackupService.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/AbstractApplicationModelWithBackup.java
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/ReferentialService.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaConfig.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaServiceSupport.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/CampaignStorage.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/FlightStorage.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/SammoaStorage.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/input/application/ImportApplicationService.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/application/ExportApplicationService.java
trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties
trunk/sammoa-ui-swing/src/main/filters/sammoa.properties
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/StartApp.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUI.css
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUI.jaxx
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUIHandler.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUIModel.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUI.css
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUI.jaxx
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUIHandler.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUIModel.java
trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/ReferentialService.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/ReferentialService.java 2012-08-29 11:16:30 UTC (rev 485)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/ReferentialService.java 2012-08-29 11:25:54 UTC (rev 486)
@@ -51,6 +51,7 @@
import org.nuiton.topia.TopiaException;
import org.nuiton.topia.TopiaRuntimeException;
+import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
@@ -264,9 +265,12 @@
if (createCampaign) {
+ File dataDirectory = config.getDataDirectory();
+
// creates the campaign storage
SammoaStorages.createCampaignStorage(
- config.getCampaignDirectory(), result);
+ SammoaDirectories.getCampaignDirectory(dataDirectory),
+ result);
}
return result;
@@ -474,7 +478,6 @@
}
-
public void deleteAllData() {
Iterable<String> campaignIds;
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaConfig.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaConfig.java 2012-08-29 11:16:30 UTC (rev 485)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaConfig.java 2012-08-29 11:25:54 UTC (rev 486)
@@ -29,10 +29,10 @@
import com.google.common.base.Throwables;
import fr.ulr.sammoa.application.device.gps.GpsConfig;
import fr.ulr.sammoa.persistence.AutoSaveListener;
+import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.nuiton.util.ApplicationConfig;
import org.nuiton.util.ArgumentsParserException;
-import org.nuiton.util.FileUtil;
import org.nuiton.util.Version;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -105,12 +105,33 @@
gpsConfig = new GpsConfig(applicationConfig);
- // create directory if needed
- getOrCreateDirectory(SammoaConfigOption.DATA_DIRECTORY);
+ try {
+ prepareDirectories();
+ } catch (IOException e) {
+ throw Throwables.propagate(e);
+ }
logger.debug("parsed options in config file {}", applicationConfig.getOptions());
}
+ protected void prepareDirectories() throws IOException {
+
+ getOrCreateDirectory(SammoaConfigOption.DATA_DIRECTORY);
+ File tmpDir = getOrCreateDirectory(SammoaConfigOption.TMP_DIRECTORY);
+ // clean it
+ FileUtils.deleteDirectory(tmpDir);
+
+ FileUtils.forceMkdir(tmpDir);
+
+ FileUtils.forceMkdir(SammoaDirectories.getBackupDirectory(getDataDirectory()));
+ FileUtils.forceMkdir(SammoaDirectories.getCampaignDirectory(getDataDirectory()));
+ File dbDirectory = SammoaDirectories.getDbDirectory(getDataDirectory());
+ FileUtils.forceMkdir(dbDirectory);
+
+ // inject in defaults (we don't want anybody to change this
+ applicationConfig.setDefaultOption("db.directory", dbDirectory.getAbsolutePath());
+ }
+
@Override
public ApplicationConfig get() {
return applicationConfig;
@@ -133,36 +154,6 @@
return ReflectionToStringBuilder.toString(this);
}
-// public Properties getProperties() {
-// Properties result = applicationConfig.getFlatOptions();
-// return result;
-// }
-//
-// public File getDataDirectory() {
-// File file = applicationConfig.getOptionAsFile(SammoaConfigOption.DATA_DIRECTORY.key);
-// Preconditions.checkNotNull(file);
-// return file;
-// }
-//
-// public String getUIConfigFileName() {
-// String filePath = applicationConfig.getOption(SammoaConfigOption.UI_CONFIG_FILE.key);
-// return filePath;
-// }
-
-// public Version getApplicationVersion() {
-// String versionStr = applicationConfig.getOption(SammoaConfigOption.VERSION.key);
-// String s = VersionUtil.removeSnapshot(versionStr);
-// Version v = VersionUtil.valueOf(s);
-// Preconditions.checkNotNull(v);
-// return v;
-// }
-//
-// public URL getApplicationSite() {
-// URL url = applicationConfig.getOptionAsURL(SammoaConfigOption.SITE_URL.key);
-// Preconditions.checkNotNull(url);
-// return url;
-// }
-
/** @return {@link SammoaConfigOption#LOG_FILE} value */
public File getLogFile() {
return applicationConfig.getOptionAsFile(SammoaConfigOption.LOG_FILE.key);
@@ -204,16 +195,22 @@
/** @return {@link SammoaConfigOption#DATA_DIRECTORY} value */
public File getDataDirectory() {
- File result = getOrCreateDirectory(SammoaConfigOption.DATA_DIRECTORY);
+ File result = applicationConfig.getOptionAsFile(SammoaConfigOption.DATA_DIRECTORY.key);
return result;
}
-// /** @return {@link SammoaConfigOption#AUDIO_DIRECTORY} value */
-// public File getAudioDirectory() {
-// File result = getOrCreateDirectory(SammoaConfigOption.AUDIO_DIRECTORY);
-// return result;
-// }
+ public File getTmpDirectory() {
+ File result = applicationConfig.getOptionAsFile(SammoaConfigOption.TMP_DIRECTORY.key);
+ return result;
+ }
+ public char getCsvSeparator() {
+ char csvSeparator = applicationConfig.getOption(
+ char.class, SammoaConfigOption.CSV_SEPARATOR.key);
+ Preconditions.checkNotNull(csvSeparator);
+ return csvSeparator;
+ }
+
/** @return {@link SammoaConfigOption#SYSTEM_ID} value */
public String getSystemId() {
String result = applicationConfig.getOption(SammoaConfigOption.SYSTEM_ID.key);
@@ -229,35 +226,9 @@
/** @return {@link SammoaConfigOption#BACKGROUND_SHAPE_FILE} value */
public File getBackgroundShapeFile() {
File result = applicationConfig.getOptionAsFile(SammoaConfigOption.BACKGROUND_SHAPE_FILE.key);
-// Preconditions.checkArgument(result.exists(), "File " + result.getAbsolutePath() + " doesn't exist");
return result;
}
-// /**
-// * @return {@link SammoaConfigOption#TRANSECT_SHAPE_FILE} value
-// */
-// public File getTransectShapeFile() {
-// File result = applicationConfig.getOptionAsFile(SammoaConfigOption.TRANSECT_SHAPE_FILE.key);
-//// Preconditions.checkArgument(result.exists(), "File " + result.getAbsolutePath() + " doesn't exist");
-// return result;
-// }
-//
-// /**
-// * @return {@link SammoaConfigOption#STRATE_SHAPE_FILE} value
-// */
-// public File getStrateShapeFile() {
-// File result = applicationConfig.getOptionAsFile(SammoaConfigOption.STRATE_SHAPE_FILE.key);
-//// Preconditions.checkArgument(result.exists(), "File " + result.getAbsolutePath() + " doesn't exist");
-// return result;
-// }
-//
-// /**
-// * @param backgroundShapeFile {@link SammoaConfigOption#BACKGROUND_SHAPE_FILE} value
-// */
-// public void setBackgroundShapeFile(File backgroundShapeFile) {
-// applicationConfig.setOption(SammoaConfigOption.BACKGROUND_SHAPE_FILE.key, String.valueOf(mapBaseShapeFile));
-// }
-
/** @return {@link SammoaConfigOption#AUTO_COMMIT_DELAY} value */
public Long getAutoCommitDelay() {
long result = applicationConfig.getOptionAsLong(SammoaConfigOption.AUTO_COMMIT_DELAY.key);
@@ -294,7 +265,7 @@
* the directory to create
* @return the created directory
*/
- protected File getOrCreateDirectory(SammoaConfigOption option) {
+ protected File getOrCreateDirectory(SammoaConfigOption option) throws IOException {
File directory = applicationConfig.getOptionAsFile(option.getKey());
@@ -307,32 +278,11 @@
logger.debug("{} = {}", option, directory);
- try {
- FileUtil.createDirectoryIfNecessary(directory);
+ FileUtils.forceMkdir(directory);
- } catch (IOException e) {
- throw Throwables.propagate(e);
- }
return directory;
}
- public File getCampaignDirectory() {
- File result = getOrCreateDirectory(SammoaConfigOption.CAMPAIGN_DIRECTORY);
- return result;
- }
-
- public File getTmpDirectory() {
- File result = getOrCreateDirectory(SammoaConfigOption.TMP_DIRECTORY);
- return result;
- }
-
- public char getCsvSeparator() {
- char csvSeparator = applicationConfig.getOption(
- char.class, SammoaConfigOption.CSV_SEPARATOR.key);
- Preconditions.checkNotNull(csvSeparator);
- return csvSeparator;
- }
-
/**
* All Sammoa configuration options.
*
@@ -347,11 +297,6 @@
"${user.home}/.sammoa",
File.class
),
- CAMPAIGN_DIRECTORY("campaign.directory",
- n_("sammoa.config.campaign.directory"),
- "${data.directory}/campaign",
- File.class
- ),
TMP_DIRECTORY("tmp.directory",
n_("sammoa.config.tmp.directory"),
"${java.io.tmpdir}/sammoa",
Added: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaDirectories.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaDirectories.java (rev 0)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaDirectories.java 2012-08-29 11:25:54 UTC (rev 486)
@@ -0,0 +1,74 @@
+package fr.ulr.sammoa.application;
+
+/*
+ * #%L
+ * SAMMOA :: Application
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2012 UMS 3462, Code Lutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/gpl-3.0.html>.
+ * #L%
+ */
+
+import java.io.File;
+
+/**
+ * Helper about directories used in Sammoa.
+ *
+ * @author tchemit <chemit(a)codelutin.com>
+ * @since 0.7
+ */
+public class SammoaDirectories {
+
+ protected SammoaDirectories() {
+ // no constructor
+ }
+
+ public static File getBackupFile(File container, String filename) {
+ return new File(getBackupDirectory(container), filename);
+ }
+
+ public static File getBackupDirectory(File container) {
+ return new File(container, "backup");
+ }
+
+ public static File getCampaignDirectory(File container) {
+ return new File(container, "campaign");
+ }
+
+ public static File getDbDirectory(File container) {
+ return new File(container, "db");
+ }
+
+ public static File getCsvDirectory(File container) {
+ return new File(container, "csv");
+ }
+
+ public static File getAudioDirectory(File container) {
+ return new File(container, "audio");
+ }
+
+ public static File getFlightDirectory(File container) {
+ return new File(container, "flight");
+ }
+
+ public static File getMapDirectory(File container) {
+ return new File(container, "map");
+ }
+
+}
+
Property changes on: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaDirectories.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaServiceSupport.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaServiceSupport.java 2012-08-29 11:16:30 UTC (rev 485)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaServiceSupport.java 2012-08-29 11:25:54 UTC (rev 486)
@@ -26,7 +26,9 @@
import fr.ulr.sammoa.application.io.CampaignStorage;
import fr.ulr.sammoa.application.io.SammoaStorages;
import fr.ulr.sammoa.persistence.SammoaPersistence;
+import org.apache.commons.io.FileUtils;
import org.nuiton.topia.TopiaContext;
+import org.nuiton.util.ZipUtil;
import java.io.File;
import java.io.IOException;
@@ -63,7 +65,8 @@
}
public CampaignStorage getCampaignStorage(String campaignId) {
- File directory = config.getCampaignDirectory();
+ File dataDirectory = config.getDataDirectory();
+ File directory = SammoaDirectories.getCampaignDirectory(dataDirectory);
CampaignStorage campaignStorage = SammoaStorages.getCampaignStorage(
directory, campaignId);
return campaignStorage;
@@ -82,4 +85,20 @@
public void close() throws IOException {
// by default nothing to close
}
+
+ protected void compressZipFile(File zipFile, File directory) {
+
+ try {
+ FileUtils.forceMkdir(zipFile.getParentFile());
+
+ try {
+ ZipUtil.compress(zipFile, directory);
+ } finally {
+ FileUtils.deleteDirectory(directory);
+
+ }
+ } catch (IOException e) {
+ throw new SammoaTechnicalException("Could not compress directory", e);
+ }
+ }
}
Added: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/BackupService.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/BackupService.java (rev 0)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/BackupService.java 2012-08-29 11:25:54 UTC (rev 486)
@@ -0,0 +1,101 @@
+package fr.ulr.sammoa.application.io;
+
+/*
+ * #%L
+ * SAMMOA :: Application
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2012 UMS 3462, Code Lutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/gpl-3.0.html>.
+ * #L%
+ */
+
+import com.google.common.base.Preconditions;
+import fr.ulr.sammoa.application.SammoaDirectories;
+import fr.ulr.sammoa.application.SammoaServiceSupport;
+import fr.ulr.sammoa.application.SammoaTechnicalException;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.filefilter.DirectoryFileFilter;
+import org.apache.commons.io.filefilter.OrFileFilter;
+import org.apache.commons.io.filefilter.SuffixFileFilter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * Service to backup (or/and later restore) sammoa.
+ *
+ * @author tchemit <chemit(a)codelutin.com>
+ * @since 0.7
+ */
+public class BackupService extends SammoaServiceSupport {
+
+ /** Logger. */
+ private static final Logger logger =
+ LoggerFactory.getLogger(BackupService.class);
+
+ protected static final OrFileFilter DB_FILTER =
+ new OrFileFilter(DirectoryFileFilter.INSTANCE,
+ new SuffixFileFilter(".h2.db"));
+
+ /**
+ * Export all the application data to the backup directory.
+ *
+ * @param backupFilename filename of the backup file
+ * @since 0.7
+ */
+ public void backupApplication(String backupFilename) {
+ Preconditions.checkNotNull(backupFilename);
+
+ // sammoa data directory to use
+ File sourceDirectory = config.getDataDirectory();
+
+ // create export directory
+ File targetDirectory = new File(new File(config.getTmpDirectory(),
+ "backupSammoa-" + System.nanoTime()), "sammoa");
+
+ try {
+ // copy in it all the campaign directory
+ File campaignDirectory = SammoaDirectories.getCampaignDirectory(targetDirectory);
+ FileUtils.copyDirectory(SammoaDirectories.getCampaignDirectory(sourceDirectory),
+ campaignDirectory);
+
+ // copy in it the db
+ File dbDirectory = SammoaDirectories.getDbDirectory(targetDirectory);
+ FileUtils.copyDirectory(SammoaDirectories.getDbDirectory(sourceDirectory),
+ dbDirectory, DB_FILTER);
+
+ // final zip file
+ File zipFile = SammoaDirectories.getBackupFile(sourceDirectory,
+ backupFilename);
+
+ if (logger.isInfoEnabled()) {
+ logger.info("Compress backup to {}", zipFile);
+ }
+ // zip it and clean target directory
+ compressZipFile(zipFile, targetDirectory);
+
+ FileUtils.deleteDirectory(targetDirectory.getParentFile());
+
+ } catch (IOException e) {
+ throw new SammoaTechnicalException("could not backup data", e);
+ }
+
+ }
+}
Property changes on: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/BackupService.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/CampaignStorage.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/CampaignStorage.java 2012-08-29 11:16:30 UTC (rev 485)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/CampaignStorage.java 2012-08-29 11:25:54 UTC (rev 486)
@@ -29,6 +29,7 @@
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import fr.ulr.sammoa.application.DecoratorService;
+import fr.ulr.sammoa.application.SammoaDirectories;
import fr.ulr.sammoa.application.SammoaTechnicalException;
import fr.ulr.sammoa.persistence.Campaign;
import fr.ulr.sammoa.persistence.Region;
@@ -68,7 +69,7 @@
}
public File getMapDirectory() {
- return new File(getDirectory(), "map");
+ return SammoaDirectories.getMapDirectory(getDirectory());
}
public File getMapFile(String mapFilename) {
@@ -76,7 +77,7 @@
}
public File getFlightDirectory() {
- return new File(getDirectory(), "flight");
+ return SammoaDirectories.getFlightDirectory(getDirectory());
}
public Set<String> getFlightIds() {
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/FlightStorage.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/FlightStorage.java 2012-08-29 11:16:30 UTC (rev 485)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/FlightStorage.java 2012-08-29 11:25:54 UTC (rev 486)
@@ -25,6 +25,7 @@
import com.google.common.collect.Maps;
import fr.ulr.sammoa.application.DecoratorService;
+import fr.ulr.sammoa.application.SammoaDirectories;
import fr.ulr.sammoa.persistence.Campaign;
import fr.ulr.sammoa.persistence.Flight;
import fr.ulr.sammoa.persistence.Region;
@@ -50,7 +51,7 @@
}
public File getAudioDirectory() {
- return new File(getDirectory(), "audio");
+ return SammoaDirectories.getAudioDirectory(getDirectory());
}
public File getAudioFile(Route route, String ext) {
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/SammoaStorage.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/SammoaStorage.java 2012-08-29 11:16:30 UTC (rev 485)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/SammoaStorage.java 2012-08-29 11:25:54 UTC (rev 486)
@@ -26,6 +26,7 @@
import com.google.common.base.Charsets;
import com.google.common.io.Files;
import fr.ulr.sammoa.application.DecoratorService;
+import fr.ulr.sammoa.application.SammoaDirectories;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
@@ -92,7 +93,7 @@
}
public File getCsvDirectory() {
- return new File(getDirectory(), "csv");
+ return SammoaDirectories.getCsvDirectory(getDirectory());
}
public File getPropertiesFile() {
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/input/application/ImportApplicationService.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/input/application/ImportApplicationService.java 2012-08-29 11:16:30 UTC (rev 485)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/input/application/ImportApplicationService.java 2012-08-29 11:25:54 UTC (rev 486)
@@ -29,6 +29,7 @@
import fr.ulr.sammoa.application.FlightService;
import fr.ulr.sammoa.application.ReferentialService;
import fr.ulr.sammoa.application.SammoaContext;
+import fr.ulr.sammoa.application.SammoaDirectories;
import fr.ulr.sammoa.application.SammoaServiceSupport;
import fr.ulr.sammoa.application.SammoaTechnicalException;
import fr.ulr.sammoa.application.io.CampaignStorage;
@@ -320,8 +321,10 @@
Preconditions.checkNotNull(newCampaign);
// create the new empty (or not) campaign storage
+ File dataDirectory = config.getDataDirectory();
CampaignStorage newStorage = SammoaStorages.createCampaignStorage(
- config.getCampaignDirectory(), newCampaign.getTopiaId());
+ SammoaDirectories.getCampaignDirectory(dataDirectory),
+ newCampaign.getTopiaId());
// remove properties files from storage
storageToCopy.deletePropertiesFiles();
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/application/ExportApplicationService.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/application/ExportApplicationService.java 2012-08-29 11:16:30 UTC (rev 485)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/application/ExportApplicationService.java 2012-08-29 11:25:54 UTC (rev 486)
@@ -84,6 +84,7 @@
private static final TimeLog TIME_LOG =
new TimeLog(ExportApplicationService.class);
+
private final ExportModelFactory<SammoaEntityEnum> defaultExportModelFactory = new ExportModelFactory<SammoaEntityEnum>() {
@Override
public <E extends TopiaEntity> ExportModel<E> buildForExport(TableMeta<SammoaEntityEnum> meta) {
@@ -126,6 +127,12 @@
}
};
+ /**
+ * Export some data of a campaign.
+ *
+ * @param model model of data to export
+ * @since 0.6
+ */
public void exportApplication(ExportApplicationModel model) {
Preconditions.checkNotNull(model);
Preconditions.checkNotNull(model.getExportFile());
@@ -315,20 +322,4 @@
}
- protected void compressZipFile(File zipFile, File directory) {
-
- try {
- FileUtils.forceMkdir(zipFile.getParentFile());
-
- try {
- ZipUtil.compress(zipFile, directory);
- } finally {
- FileUtils.deleteDirectory(directory);
-
- }
- } catch (IOException e) {
- throw new SammoaTechnicalException("Could not compress directory", e);
- }
- }
-
}
Modified: trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties
===================================================================
--- trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties 2012-08-29 11:16:30 UTC (rev 485)
+++ trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties 2012-08-29 11:25:54 UTC (rev 486)
@@ -2,10 +2,12 @@
sammoa.config.application.site.url=Website URL of the application
sammoa.config.application.version=Version of the application
sammoa.config.background.shape.file=Location of the Background shape file
+sammoa.config.backup.directory=BAckup directory where to sotre all data backup
sammoa.config.campaign.directory=Directory where are stored campaign data (maps, flight audio files,...)
sammoa.config.campaign.id=Id of the default campaign to use
sammoa.config.csv.separator=Csv separator caracter to use
sammoa.config.data.directory=Main directory where all data are stored. You can use ${data.directory} in other property values (ex\: ${data.directory}/audio).
+sammoa.config.db.directory=
sammoa.config.flight.number=Number of the default flight to use
sammoa.config.fly.mode=Default fly mode
sammoa.config.gps.check.period=Time in seconds between each GPS capture
@@ -30,7 +32,6 @@
sammoa.config.ui.stop=Stop
sammoa.config.ui.validObservation=Validate the selected observation
sammoa.config.ui.validRoute=Validate the selected route
-sammoa.datePattern=dd/MM/yyyy
sammoa.dateTimePattern=dd/MM/yyyy HH\:mm\:ss
sammoa.dbf.import.error.unableToReadField=impossible to read value for column %s at line %s
sammoa.flight.decorator.flight=Flight %1$d
Modified: trunk/sammoa-ui-swing/src/main/filters/sammoa.properties
===================================================================
--- trunk/sammoa-ui-swing/src/main/filters/sammoa.properties 2012-08-29 11:16:30 UTC (rev 485)
+++ trunk/sammoa-ui-swing/src/main/filters/sammoa.properties 2012-08-29 11:25:54 UTC (rev 486)
@@ -27,7 +27,7 @@
hibernate.show_sql=false
hibernate.dialect=org.hibernate.dialect.H2Dialect
-hibernate.connection.url=jdbc:h2:file:${data.directory}/db/sammoa
+hibernate.connection.url=jdbc:h2:file:${db.directory}/sammoa
hibernate.connection.username=sa
hibernate.connection.password=sa
hibernate.connection.driver_class=org.h2.Driver
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/StartApp.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/StartApp.java 2012-08-29 11:16:30 UTC (rev 485)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/StartApp.java 2012-08-29 11:25:54 UTC (rev 486)
@@ -26,10 +26,8 @@
import fr.ulr.sammoa.application.SammoaConfig;
import fr.ulr.sammoa.application.SammoaContext;
-import fr.ulr.sammoa.application.SammoaTechnicalException;
import fr.ulr.sammoa.ui.swing.util.LogFileInitializer;
import jaxx.runtime.SwingUtil;
-import org.apache.commons.io.FileUtils;
import org.nuiton.i18n.I18n;
import org.nuiton.i18n.init.DefaultI18nInitializer;
import org.slf4j.Logger;
@@ -38,7 +36,6 @@
import javax.swing.UIManager;
import java.awt.Color;
import java.io.File;
-import java.io.IOException;
import java.util.Locale;
/**
@@ -55,16 +52,6 @@
// Create sammoa configuration from sammoa.properties file
SammoaConfig config = new SammoaConfig("sammoa.properties", args);
- //clean sammoa temporary directory
- File tmpDirectory = config.getTmpDirectory();
- try {
- // clean tmp dir
- FileUtils.cleanDirectory(tmpDirectory);
- } catch (IOException e) {
- throw new SammoaTechnicalException(
- "Could not clean temp directory " + tmpDirectory, e);
- }
-
// Create application context
SammoaContext appContext = new SammoaContext(config);
@@ -91,7 +78,7 @@
}
}
- UIManager.put("BlockingLayerUI.blockingColor", new Color(50,50,50));
+ UIManager.put("BlockingLayerUI.blockingColor", new Color(50, 50, 50));
MainUI mainUI = new MainUI(context);
mainUI.setVisible(true);
Added: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/AbstractApplicationModelWithBackup.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/AbstractApplicationModelWithBackup.java (rev 0)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/AbstractApplicationModelWithBackup.java 2012-08-29 11:25:54 UTC (rev 486)
@@ -0,0 +1,80 @@
+package fr.ulr.sammoa.ui.swing.io;
+
+/*
+ * #%L
+ * SAMMOA :: UI Swing
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2012 UMS 3462, Code Lutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/gpl-3.0.html>.
+ * #L%
+ */
+
+import org.jdesktop.beans.AbstractSerializableBean;
+
+/**
+ * Abstract model which support backup configuration.
+ *
+ * @author tchemit <chemit(a)codelutin.com>
+ * @since 0.7
+ */
+public abstract class AbstractApplicationModelWithBackup extends AbstractSerializableBean {
+
+ private static final long serialVersionUID = 1L;
+
+ public static final String PROPERTY_VALID = "valid";
+
+ public static final String PROPERTY_BACKUP = "backup";
+
+ public static final String PROPERTY_BACKUP_FILENAME = "backupFilename";
+
+ protected boolean backup;
+
+ protected String backupFilename;
+
+ protected boolean valid;
+
+ public boolean isValid() {
+ return valid;
+ }
+
+ public void setValid(boolean valid) {
+ boolean oldValue = this.valid;
+ this.valid = valid;
+ firePropertyChange(PROPERTY_VALID, oldValue, valid);
+ }
+
+ public boolean isBackup() {
+ return backup;
+ }
+
+ public void setBackup(boolean backup) {
+ boolean oldValue = this.backup;
+ this.backup = backup;
+ firePropertyChange(PROPERTY_BACKUP, oldValue, backup);
+ }
+
+ public String getBackupFilename() {
+ return backupFilename;
+ }
+
+ public void setBackupFilename(String backupFilename) {
+ String oldValue = this.backupFilename;
+ this.backupFilename = backupFilename;
+ firePropertyChange(PROPERTY_BACKUP_FILENAME, oldValue, backupFilename);
+ }
+}
Property changes on: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/AbstractApplicationModelWithBackup.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUI.css
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUI.css 2012-08-29 11:16:30 UTC (rev 485)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUI.css 2012-08-29 11:25:54 UTC (rev 486)
@@ -39,6 +39,7 @@
#importButton {
text: "sammoa.action.importApplication";
+ enabled:{model.isValid()};
}
#loadImportFileButton {
@@ -54,4 +55,26 @@
useIcon:false;
blockingColor:{UIManager.getColor("BlockingLayerUI.blockingColor")};
block:{!model.isImportFileLoaded()};
-}
\ No newline at end of file
+}
+
+#backupPanel {
+ border:{new TitledBorder(_("sammoa.label.exportApplication.backup.panel"))};
+}
+
+#backupCheckBox {
+ text:"sammoa.label.exportApplication.backup";
+ selected:{model.isBackup()};
+}
+
+#backupFilenameLbl {
+ text:"sammoa.label.exportApplication.backupFilename";
+}
+
+#backupFilename {
+ text:{model.getBackupFilename()};
+}
+
+#backupInfo {
+ actionIcon:"information";
+ text:{handler.getBackupInfo(model.getBackupFilename())};
+}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUI.jaxx
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUI.jaxx 2012-08-29 11:16:30 UTC (rev 485)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUI.jaxx 2012-08-29 11:25:54 UTC (rev 486)
@@ -98,7 +98,35 @@
</JPanel>
</cell>
</row>
-
+ <!-- backup panel -->
+ <row>
+ <cell columns='3' fill="horizontal">
+ <JPanel id='backupPanel' layout='{new BorderLayout()}'>
+ <Table id='backupTable' fill='both' constraints='BorderLayout.CENTER' decorator='boxed'>
+ <row>
+ <cell fill="horizontal" columns='2'>
+ <JCheckBox id='backupCheckBox'
+ onItemStateChanged='getModel().setBackup(backupCheckBox.isSelected())'/>
+ </cell>
+ </row>
+ <row>
+ <cell anchor='west'>
+ <JLabel id='backupFilenameLbl'/>
+ </cell>
+ <cell weightx='1' fill="horizontal">
+ <JTextField id='backupFilename'
+ onKeyReleased='getModel().setBackupFilename(((JTextField)event.getSource()).getText())'/>
+ </cell>
+ </row>
+ <row>
+ <cell columns='2'>
+ <JLabel id='backupInfo'/>
+ </cell>
+ </row>
+ </Table>
+ </JPanel>
+ </cell>
+ </row>
<!--import actions-->
<row>
<cell columns='3' fill="both">
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUIHandler.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUIHandler.java 2012-08-29 11:16:30 UTC (rev 485)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUIHandler.java 2012-08-29 11:25:54 UTC (rev 486)
@@ -26,6 +26,8 @@
import com.google.common.collect.Lists;
import fr.ulr.sammoa.application.FlightService;
import fr.ulr.sammoa.application.ReferentialService;
+import fr.ulr.sammoa.application.SammoaDirectories;
+import fr.ulr.sammoa.application.io.BackupService;
import fr.ulr.sammoa.application.io.CampaignStorage;
import fr.ulr.sammoa.application.io.FlightStorage;
import fr.ulr.sammoa.application.io.input.application.ImportApplicationModel;
@@ -40,6 +42,7 @@
import jaxx.runtime.SwingUtil;
import jaxx.runtime.swing.ErrorDialogUI;
import jaxx.runtime.swing.editor.FileEditor;
+import org.apache.commons.lang.StringUtils;
import org.nuiton.util.FileUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -53,6 +56,7 @@
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
+import java.util.Date;
import java.util.List;
import java.util.Map;
@@ -82,6 +86,8 @@
protected final UIDecoratorService decoratorService;
+ protected final BackupService backupService;
+
public ImportApplicationUIHandler(SammoaUIContext context,
ImportApplicationUI ui) {
this.context = context;
@@ -90,6 +96,7 @@
this.flightService = context.getService(FlightService.class);
this.referentialService = context.getService(ReferentialService.class);
this.decoratorService = context.getService(UIDecoratorService.class);
+ this.backupService = context.getService(BackupService.class);
}
@Override
@@ -114,7 +121,16 @@
} else if (ImportApplicationUIModel.PROPERTY_IMPORT_FILE_LOADED.equals(propertyName)) {
boolean newValue = (Boolean) evt.getNewValue();
onImportFileLoaded(newValue);
+ } else if (ImportApplicationUIModel.PROPERTY_CAMPAIGN_EXIST.equals(propertyName)) {
+ boolean newValue = (Boolean) evt.getNewValue();
+ onCampaignExistChanged(newValue);
}
+
+ if (!ImportApplicationUIModel.PROPERTY_VALID.equals(propertyName)) {
+
+ // validate model
+ validateModel();
+ }
}
});
}
@@ -122,6 +138,10 @@
@Override
public void afterInitUI() {
+ String backupFilename = String.format(
+ "backup-%1$td-%1$tm-%1$ty-%1$tH_%1$tM_%1$tS.zip", new Date());
+ getModel().setBackupFilename(backupFilename);
+
// Boolean editor/renderer on table
{
JTable table = ui.getLoadImportFileResultFlightsTable();
@@ -162,10 +182,36 @@
public void importApplication() {
+ JFrame frame = ui.getParentContainer(JFrame.class);
+
+ ImportApplicationUIModel model = getModel();
+
+ if (model.isBackup()) {
+
+ String backupFilename = model.getBackupFilename();
+
+ try {
+ SammoaUtil.updateBusyState(frame.getRootPane(), true);
+ ui.getBusyBlockLayerUI().setBlock(true);
+
+ // backup sammoa data
+ backupService.backupApplication(backupFilename);
+ SammoaUtil.showSuccessMessage(
+ frame,
+ _("sammoa.messageDialog.sammoa.backup.success",
+ getBackupFile(backupFilename)));
+ } catch (Exception e) {
+ ErrorDialogUI.showError(e);
+ } finally {
+ ui.getBusyBlockLayerUI().setBlock(false);
+ SammoaUtil.updateBusyState(frame.getRootPane(), false);
+ }
+ }
+
// get service model
- ImportApplicationModel dataModel = getModel().toModel();
- JFrame frame = ui.getParentContainer(JFrame.class);
+ ImportApplicationModel dataModel = model.toModel();
+
SammoaUtil.updateBusyState(frame, true);
try {
importService.importApplication(dataModel);
@@ -173,7 +219,7 @@
SammoaUtil.showSuccessMessage(
frame,
_("sammoa.messageDialog.aplication.import.success",
- getModel().getImportFile()));
+ model.getImportFile()));
} catch (Exception e) {
ErrorDialogUI.showError(e);
@@ -187,6 +233,12 @@
context.changeScreen(SammoaScreen.HOME);
}
+ public String getBackupInfo(String filename) {
+ File backupFile = getBackupFile(filename == null ? "" : filename);
+ String result = _("sammoa.label.exportApplication.backupInfo", backupFile);
+ return result;
+ }
+
protected ImportApplicationUIModel getModel() {
return ui.getModel();
}
@@ -313,4 +365,48 @@
label.setText(infoLabel);
}
+ protected void onCampaignExistChanged(boolean newValue) {
+
+ // always force to backup if data could be lost
+ if (newValue) {
+ getModel().setBackup(true);
+ }
+ }
+
+ protected void validateModel() {
+ boolean valid = true;
+
+ ImportApplicationUIModel model = getModel();
+
+ File importFile = model.getImportFile();
+
+ if (importFile == null) {
+ // no file loaded
+ valid = false;
+ }
+
+ if (model.isBackup()) {
+
+ // validate that backup filename not empty and does not exist
+ // in backup directory
+ String backupFilename = model.getBackupFilename();
+ if (StringUtils.isBlank(backupFilename)) {
+ valid = false;
+ } else {
+ File backupFile = getBackupFile(backupFilename);
+ if (backupFile.exists()) {
+ valid = false;
+ }
+ }
+ }
+
+ model.setValid(valid);
+ }
+
+ protected File getBackupFile(String backupFilename) {
+ File result = SammoaDirectories.getBackupFile(
+ context.getConfig().getDataDirectory(), backupFilename);
+ return result;
+ }
+
}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUIModel.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUIModel.java 2012-08-29 11:16:30 UTC (rev 485)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUIModel.java 2012-08-29 11:25:54 UTC (rev 486)
@@ -27,7 +27,7 @@
import fr.ulr.sammoa.application.io.CampaignStorage;
import fr.ulr.sammoa.application.io.input.application.ImportApplicationModel;
import fr.ulr.sammoa.persistence.Flight;
-import org.jdesktop.beans.AbstractSerializableBean;
+import fr.ulr.sammoa.ui.swing.io.AbstractApplicationModelWithBackup;
import java.io.File;
import java.util.List;
@@ -38,7 +38,7 @@
* @author tchemit <chemit(a)codelutin.com>
* @since 0.6
*/
-public class ImportApplicationUIModel extends AbstractSerializableBean {
+public class ImportApplicationUIModel extends AbstractApplicationModelWithBackup {
private static final long serialVersionUID = 1L;
@@ -138,7 +138,7 @@
flightIds.add(entry.getFlightStorage().getId());
Flight existingFlight = entry.getExistingFlight();
- if (existingFlight!=null) {
+ if (existingFlight != null) {
flightToRemoveIds.add(existingFlight.getTopiaId());
}
}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUI.css
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUI.css 2012-08-29 11:16:30 UTC (rev 485)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUI.css 2012-08-29 11:25:54 UTC (rev 486)
@@ -38,18 +38,10 @@
text: "sammoa.label.campaign";
}
-/*#campaignCombobox {
- renderer: {new DecoratorProviderListCellRenderer(getHandler().getDecoratorProvider())};
-}*/
-
#flightLabel {
text: "sammoa.label.flight";
}
-/*#flightCombobox {
- renderer: {new DecoratorProviderListCellRenderer(getHandler().getDecoratorProvider())};
-}*/
-
#quitButton {
text:"sammoa.action.quitExportMaps";
}
@@ -108,3 +100,27 @@
useIcon:false;
blockingColor:{UIManager.getColor("BlockingLayerUI.blockingColor")};
}
+
+#backupPanel {
+ border:{new TitledBorder(_("sammoa.label.exportApplication.backup.panel"))};
+}
+
+#backupCheckBox {
+ text:"sammoa.label.exportApplication.backup";
+ selected:{model.isBackup()};
+}
+
+#backupFilenameLbl {
+ text:"sammoa.label.exportApplication.backupFilename";
+}
+
+#backupFilename {
+ text:{model.getBackupFilename()};
+}
+
+#backupInfo {
+ actionIcon:"information";
+ text:{handler.getBackupInfo(model.getBackupFilename())};
+}
+
+
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUI.jaxx
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUI.jaxx 2012-08-29 11:16:30 UTC (rev 485)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUI.jaxx 2012-08-29 11:25:54 UTC (rev 486)
@@ -119,9 +119,38 @@
</JPanel>
</cell>
</row>
+ <!-- backup panel -->
+ <row>
+ <cell columns='3' fill="horizontal">
+ <JPanel id='backupPanel' layout='{new BorderLayout()}'>
+ <Table id='backupTable' fill='both' constraints='BorderLayout.CENTER' decorator='boxed'>
+ <row>
+ <cell fill="horizontal" columns='2'>
+ <JCheckBox id='backupCheckBox'
+ onItemStateChanged='getModel().setBackup(backupCheckBox.isSelected())'/>
+ </cell>
+ </row>
+ <row>
+ <cell anchor='west'>
+ <JLabel id='backupFilenameLbl'/>
+ </cell>
+ <cell weightx='1' fill="horizontal">
+ <JTextField id='backupFilename'
+ onKeyReleased='getModel().setBackupFilename(((JTextField)event.getSource()).getText())'/>
+ </cell>
+ </row>
+ <row>
+ <cell columns='2'>
+ <JLabel id='backupInfo'/>
+ </cell>
+ </row>
+ </Table>
+ </JPanel>
+ </cell>
+ </row>
<!--export actions-->
<row>
- <cell columns='5' fill="both">
+ <cell columns='3' fill="both">
<JPanel layout='{new GridLayout(1,2,0,0)}'>
<JButton id='quitButton' onActionPerformed='getHandler().close()'/>
<JButton id='exportButton'
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUIHandler.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUIHandler.java 2012-08-29 11:16:30 UTC (rev 485)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUIHandler.java 2012-08-29 11:25:54 UTC (rev 486)
@@ -25,6 +25,9 @@
import fr.ulr.sammoa.application.FlightService;
import fr.ulr.sammoa.application.ReferentialService;
+import fr.ulr.sammoa.application.SammoaConfig;
+import fr.ulr.sammoa.application.SammoaDirectories;
+import fr.ulr.sammoa.application.io.BackupService;
import fr.ulr.sammoa.application.io.output.application.ExportApplicationModel;
import fr.ulr.sammoa.application.io.output.application.ExportApplicationService;
import fr.ulr.sammoa.persistence.Campaign;
@@ -37,6 +40,7 @@
import jaxx.runtime.SwingUtil;
import jaxx.runtime.swing.ErrorDialogUI;
import jaxx.runtime.swing.renderer.DecoratorListCellRenderer;
+import org.apache.commons.lang.StringUtils;
import org.nuiton.util.FileUtil;
import org.nuiton.util.decorator.Decorator;
import org.slf4j.Logger;
@@ -48,6 +52,7 @@
import java.io.File;
import java.util.Collection;
import java.util.Collections;
+import java.util.Date;
import java.util.List;
import static org.nuiton.i18n.I18n._;
@@ -71,10 +76,14 @@
protected final ReferentialService referentialService;
+ protected final BackupService backupService;
+
protected final FlightService flightService;
protected final UIDecoratorService decoratorService;
+ protected final SammoaConfig config;
+
public ExportApplicationUIHandler(SammoaUIContext context,
ExportApplicationUI ui) {
this.context = context;
@@ -83,6 +92,8 @@
this.referentialService = context.getService(ReferentialService.class);
this.exportService = context.getService(ExportApplicationService.class);
this.decoratorService = context.getService(UIDecoratorService.class);
+ this.backupService = context.getService(BackupService.class);
+ this.config = context.getConfig();
}
@Override
@@ -129,9 +140,10 @@
} else if (ExportApplicationUIModel.PROPERTY_FLIGHTS.equals(propertyName)) {
Collection<Flight> newValue = (Collection<Flight>) evt.getNewValue();
onFlightsChanged(newValue);
- } else if (ExportApplicationUIModel.PROPERTY_SELECTED_FLIGHT.equals(propertyName)) {
- Flight newValue = (Flight) evt.getNewValue();
- onSelectedFlightChanged(newValue);
+ } else if (ExportApplicationUIModel.PROPERTY_CALLBACK.equals(propertyName)) {
+ ExportApplicationCallbackMode newValue =
+ (ExportApplicationCallbackMode) evt.getNewValue();
+ onCallbackChanged(newValue);
}
if (!ExportApplicationUIModel.PROPERTY_VALID.equals(propertyName)) {
@@ -158,21 +170,23 @@
File currentDirectory = FileUtil.getCurrentDirectory();
String absolutePath = currentDirectory.getAbsolutePath();
if (absolutePath.endsWith(File.separator + ".")) {
- currentDirectory = new File(absolutePath.substring(0, absolutePath.length() - 2));
+ currentDirectory = new File(
+ absolutePath.substring(0, absolutePath.length() - 2));
}
if (logger.isInfoEnabled()) {
logger.info("Current directory to use: {}", currentDirectory);
}
model.setExportDirectory(currentDirectory);
+ String backupFilename = String.format(
+ "backup-%1$td-%1$tm-%1$ty-%1$tH_%1$tM_%1$tS.zip", new Date());
+ model.setBackupFilename(backupFilename);
+
SwingUtil.fillComboBox(ui.getCampaignCombobox(),
model.getCampaigns(),
model.getSelectedCampaign());
- Flight selectedFlight = model.getSelectedFlight();
-
onSelectedCampaignChanged(model.getSelectedCampaign());
- onSelectedFlightChanged(selectedFlight);
}
@Override
@@ -183,59 +197,84 @@
JFrame frame = ui.getParentContainer(JFrame.class);
+ ExportApplicationUIModel model = getModel();
- try {
- ExportApplicationModel dataModel = getModel().toModel();
+ ExportApplicationModel dataModel = model.toModel();
- boolean doExport = checkFileToExport(dataModel);
+ boolean doExport = checkFileToExport(dataModel);
- if (doExport) {
+ if (!doExport) {
- ui.getBusyBlockLayerUI().setBlock(true);
+ // nothing to do, quit now
+ return;
+ }
+ if (model.isBackup()) {
+
+ String backupFilename = model.getBackupFilename();
+
+ try {
SammoaUtil.updateBusyState(frame.getRootPane(), true);
+ ui.getBusyBlockLayerUI().setBlock(true);
- exportService.exportApplication(dataModel);
-
+ // backup sammoa data
+ backupService.backupApplication(backupFilename);
SammoaUtil.showSuccessMessage(
frame,
- _("sammoa.messageDialog.sammoa.export.success",
- dataModel.getExportFile()));
+ _("sammoa.messageDialog.sammoa.backup.success",
+ getBackupFile(backupFilename)));
+ } catch (Exception e) {
+ ErrorDialogUI.showError(e);
+ } finally {
+ ui.getBusyBlockLayerUI().setBlock(false);
+ SammoaUtil.updateBusyState(frame.getRootPane(), false);
+ }
+ }
+ try {
- boolean removeFlightId = false;
- boolean removeCampaingId = false;
+ ui.getBusyBlockLayerUI().setBlock(true);
+ SammoaUtil.updateBusyState(frame.getRootPane(), true);
- switch (getModel().getCallback()) {
+ exportService.exportApplication(dataModel);
- case NOTHING:
- // nothing to do
- break;
- case REMOVE_FLIGHTS:
- removeFlights(dataModel);
- removeFlightId = true;
- break;
- case REMOVE_CAMPAIGN:
- removeCampaign(dataModel);
- removeCampaingId = true;
- break;
- case REMOVE_ALL:
- removeAllData();
- removeCampaingId = true;
- break;
+ SammoaUtil.showSuccessMessage(
+ frame,
+ _("sammoa.messageDialog.sammoa.export.success",
+ dataModel.getExportFile()));
- }
+ boolean removeFlightId = false;
+ boolean removeCampaingId = false;
- if (removeCampaingId) {
- context.setCampaignId(null);
+ switch (model.getCallback()) {
+
+ case NOTHING:
+ // nothing to do
+ break;
+ case REMOVE_FLIGHTS:
+ removeFlights(dataModel);
removeFlightId = true;
- }
+ break;
+ case REMOVE_CAMPAIGN:
+ removeCampaign(dataModel);
+ removeCampaingId = true;
+ break;
+ case REMOVE_ALL:
+ removeAllData();
+ removeCampaingId = true;
+ break;
- if (removeFlightId) {
- context.setFlightId(null);
- }
- close();
}
+ if (removeCampaingId) {
+ context.setCampaignId(null);
+ removeFlightId = true;
+ }
+
+ if (removeFlightId) {
+ context.setFlightId(null);
+ }
+ close();
+
} catch (Exception e) {
ErrorDialogUI.showError(e);
} finally {
@@ -244,6 +283,12 @@
}
}
+ public String getBackupInfo(String filename) {
+ File backupFile = getBackupFile(filename == null ? "" : filename);
+ String result = _("sammoa.label.exportApplication.backupInfo", backupFile);
+ return result;
+ }
+
protected void removeFlights(ExportApplicationModel model) {
String campaignId = model.getCampaignId();
Iterable<String> flightIds = model.getFlightIds();
@@ -292,9 +337,30 @@
}
}
+ if (model.isBackup()) {
+
+ // validate that backup filename not empty and does not exist
+ // in backup directory
+ String backupFilename = model.getBackupFilename();
+ if (StringUtils.isBlank(backupFilename)) {
+ valid = false;
+ } else {
+ File backupFile = getBackupFile(backupFilename);
+ if (backupFile.exists()) {
+ valid = false;
+ }
+ }
+ }
+
model.setValid(valid);
}
+ protected File getBackupFile(String backupFilename) {
+ File result = SammoaDirectories.getBackupFile(
+ config.getDataDirectory(), backupFilename);
+ return result;
+ }
+
protected boolean checkFileToExport(ExportApplicationModel dataModel) {
boolean doExport = true;
@@ -370,17 +436,10 @@
selectedFlight);
}
- protected void onSelectedFlightChanged(Flight newCampaign) {
+ protected void onCallbackChanged(ExportApplicationCallbackMode callback) {
- // reset flights,...
- if (logger.isInfoEnabled()) {
- Decorator<Flight> decorator =
- decoratorService.getDecoratorByType(Flight.class);
- logger.info("New selected flight: {}",
- decorator.toString(newCampaign));
- }
-
- ExportApplicationUIModel model = getModel();
+ // always force to backup if data could be lost
+ getModel().setBackup(callback != ExportApplicationCallbackMode.NOTHING);
}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUIModel.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUIModel.java 2012-08-29 11:16:30 UTC (rev 485)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUIModel.java 2012-08-29 11:25:54 UTC (rev 486)
@@ -29,7 +29,7 @@
import fr.ulr.sammoa.application.io.output.application.ExportApplicationModel;
import fr.ulr.sammoa.persistence.Campaign;
import fr.ulr.sammoa.persistence.Flight;
-import org.jdesktop.beans.AbstractSerializableBean;
+import fr.ulr.sammoa.ui.swing.io.AbstractApplicationModelWithBackup;
import org.nuiton.topia.persistence.TopiaId;
import java.io.File;
@@ -42,7 +42,7 @@
* @author tchemit <chemit(a)codelutin.com>
* @since 0.6
*/
-public class ExportApplicationUIModel extends AbstractSerializableBean {
+public class ExportApplicationUIModel extends AbstractApplicationModelWithBackup {
private static final long serialVersionUID = 1L;
@@ -60,8 +60,6 @@
public static final String PROPERTY_CALLBACK = "callback";
- public static final String PROPERTY_VALID = "valid";
-
protected List<Campaign> campaigns;
protected Campaign selectedCampaign;
@@ -76,8 +74,6 @@
protected ExportApplicationCallbackMode callback;
- protected boolean valid;
-
public File getExportDirectory() {
return exportDirectory;
}
@@ -154,16 +150,6 @@
firePropertyChange(PROPERTY_CALLBACK, oldValue, callback);
}
- public boolean isValid() {
- return valid;
- }
-
- public void setValid(boolean valid) {
- boolean oldValue = this.valid;
- this.valid = valid;
- firePropertyChange(PROPERTY_VALID, oldValue, valid);
- }
-
public ExportApplicationModel toModel() {
Set<Flight> flightsToExport;
Modified: trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties
===================================================================
--- trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2012-08-29 11:16:30 UTC (rev 485)
+++ trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2012-08-29 11:25:54 UTC (rev 486)
@@ -104,6 +104,10 @@
sammoa.label.campaign.region=Region\:
sammoa.label.campaign.strate=Strates\:
sammoa.label.campaign.transect=Transects\:
+sammoa.label.exportApplication.backup=Do a backup
+sammoa.label.exportApplication.backup.panel=Backup Sammoa data
+sammoa.label.exportApplication.backupFilename=Backup file name
+sammoa.label.exportApplication.backupInfo=Backup file will be stored at %s
sammoa.label.exportApplication.callbackNothing=Do nothing
sammoa.label.exportApplication.callbackRemoveAllData=Remove all data
sammoa.label.exportApplication.callbackRemoveCampaignData=Remove selected campaign data
@@ -145,6 +149,7 @@
sammoa.messageDialog.map.export.success=Map (with %s rows in dbf) was successfully exported in directory\n\n%s
sammoa.messageDialog.mapOrDbf.exportFile.alreadyExists=Export Shape file (%s)\nor dbf file (%s) already exists.\n\nConfirm to override it?
sammoa.messageDialog.observers.import.success=%1$d observers are successfully imported
+sammoa.messageDialog.sammoa.backup.success=Sammoa was successfully backup in file\n\n%s
sammoa.messageDialog.sammoa.export.success=Sammoa was successfully exported in file\n\n%s
sammoa.messageDialog.sammoa.exportFile.alreadyExists=Export File %s already exists.\n\nConfirm to override it?
sammoa.messageDialog.species.import.success=%1$d species are successfully imported
1
0