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
r505 - in trunk: sammoa-application/src/main/java/fr/ulr/sammoa/application/io/input/map src/site/rst
by fdesbois@users.forge.codelutin.com 01 Sep '12
by fdesbois@users.forge.codelutin.com 01 Sep '12
01 Sep '12
Author: fdesbois
Date: 2012-09-01 11:51:38 +0200 (Sat, 01 Sep 2012)
New Revision: 505
Url: http://forge.codelutin.com/repositories/revision/sammoa/505
Log:
fixes #1451 : update import doc
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/input/map/StrateImportModel.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/input/map/TransectImportModel.java
trunk/src/site/rst/import-export.rst
trunk/src/site/rst/index.rst
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/input/map/StrateImportModel.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/input/map/StrateImportModel.java 2012-09-01 09:51:22 UTC (rev 504)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/input/map/StrateImportModel.java 2012-09-01 09:51:38 UTC (rev 505)
@@ -30,39 +30,49 @@
import org.nuiton.util.csv.ext.AbstractImportModel;
/**
+ * <pre>
+ * - colonne 0 : "Nom" : Nom de la strate (strate.name) C,50
+ * - colonne 1 : "type_strat" : Type de la strate (strate.strateType) N,4,0
+ *
+ * * C : COAST (Côte)
+ * * N : NERITIC (Néritique)
+ * * P : SLOPE (Pente)
+ * * O : OCEANIC (Océanique)
+ *
+ * - colonne 2 : "Secteur" : Nom du secteur (strate.sector.name) C,12
+ * - colonne 3 : "ID_Secteur" : Numéro du secteur (strate.sector.sectorNumber) N,4,0
+ * - colonne 4 : "Area" : Surface de la strate (non utilisé pour le moment) N,19,11
+ * - colonne 5 : "Shape_Leng" : Longueur sur le fichier shape (non utilisé pour le moment) N,19,11
+ * - colonne 6 : "Shape_Area" : Surface sur le fichier shape (non utilisé pour le moment) N,19,11
+ * </pre>
+ *
* Created: 25/07/12
*
* @author fdesbois <desbois(a)codelutin.com>
*/
public class StrateImportModel extends AbstractImportModel<Strate> {
- // 0 : Nom
- // 1 : Area (not used)
- // 2 : Shape_Leng (not used)
- // 3 : Shape_Area (not used)
- // 4 : Secteur (name)
- // 5 : type_strat (string) for StrateType (code match)
- // 6 : ID_Secteur (double)
+
public StrateImportModel() {
super(';');
newMandatoryColumn("Nom", Strate.PROPERTY_NAME);
+ newMandatoryColumn("type_strat",
+ Strate.PROPERTY_STRATE_TYPE,
+ new StrateTypeValueParser()
+ );
newMandatoryColumn("Secteur",
Strate.PROPERTY_SECTOR
+ "." + Sector.PROPERTY_NAME
);
- newMandatoryColumn("type_strat",
- Strate.PROPERTY_STRATE_TYPE,
- new StrateTypeValueParser()
- );
newMandatoryColumn("ID_Secteur",
Strate.PROPERTY_SECTOR
+ "." + Sector.PROPERTY_SECTOR_NUMBER,
new DoubleToIntegerValueParser()
);
newIgnoredColumn("Area");
+ newIgnoredColumn("Shape_Leng");
newIgnoredColumn("Shape_Area");
- newIgnoredColumn("Shape_Leng");
}
@Override
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/input/map/TransectImportModel.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/input/map/TransectImportModel.java 2012-09-01 09:51:22 UTC (rev 504)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/input/map/TransectImportModel.java 2012-09-01 09:51:38 UTC (rev 505)
@@ -33,24 +33,30 @@
import org.nuiton.util.csv.ext.AbstractImportModel;
/**
+ * <pre>
+ * - colonne 0 : "TR_ID" : Identifiant et nom du transect (transect.name)
+ * - colonne 1 : "Xstart" : Coordonnée X de début du transect (transect.startX)
+ * - colonne 2 : "Ystart" : Coordonnée Y de début du transect (transect.startY)
+ * - colonne 3 : "Xend" : Coordonnée X de fin du transect (transect.endX)
+ * - colonne 4 : "Yend" : Coordonnée Y de fin du transect (transect.endY)
+ * - colonne 5 : "Length" : longueur du transect (transect.length)
+ * - colonne 6 : "Passage" : Numéro de passage (transect.nbTimes)
+ * - colonne 7 : "SECTEUR" : Numéro du secteur (transect.strate.sector.sectorNumber)
+ * - colonne 8 : "STRATE" : Type de strate (transect.strate.strateType)
+ *
+ * * C : COAST (Côte)
+ * * N : NERITIC (Néritique)
+ * * P : SLOPE (Pente)
+ * * O : OCEANIC (Océanique)
+ *
+ * </pre>
+ *
* Created: 25/07/12
*
* @author fdesbois <desbois(a)codelutin.com>
*/
public class TransectImportModel extends AbstractImportModel<Transect> {
- // 0 : Length
- // 1 : TR_ID used as name
- // 2 : Xstart
- // 3 : Ystart
- // 4 : Xend
- // 5 : Yend
- // 6 : Passage (double) used for nbTimes
- // 7 : SECTEUR (double) use as sectorNumber
- // 8 : STRATE (string) for StrateType (code match)
- // 9 : Shape_Leng (not used)
-
-
public TransectImportModel() {
super(';');
newMandatoryColumn("Length",
@@ -89,7 +95,6 @@
Transect.PROPERTY_NB_TIMES,
new DoubleToIntegerValueParser()
);
- newIgnoredColumn("Shape_Leng");
}
@Override
Modified: trunk/src/site/rst/import-export.rst
===================================================================
--- trunk/src/site/rst/import-export.rst 2012-09-01 09:51:22 UTC (rev 504)
+++ trunk/src/site/rst/import-export.rst 2012-09-01 09:51:38 UTC (rev 505)
@@ -43,6 +43,7 @@
A noter que ce sont des rôles de station de travail, une seule même machine physique peut avoir tous ces différents rôles.
.. image:: ulr-sammoa-echange-data.svg
+ :scale: 20%
TODO explications supplémentaires sur les étapes
@@ -73,28 +74,28 @@
+++++++++++++++++++++++
- colonne 0 : "Nom" : Nom de la strate (strate.name) C,50
-- colonne 1 : "Area" : Surface de la strate (non utilisé pour le moment) N,19,11
-- colonne 2 : "Shape_Leng" : Longueur sur le fichier shape (non utilisé pour le moment) N,19,11
-- colonne 3 : "Shape_Area" : Surface sur le fichier shape (non utilisé pour le moment) N,19,11
-- colonne 4 : "Secteur" : Nom du secteur (strate.sector.name) C,12
-- colonne 5 : "type_strat" : Type de la strate (strate.strateType) N,4,0
+- colonne 1 : "type_strat" : Type de la strate (strate.strateType) N,4,0
* C : COAST (Côte)
* N : NERITIC (Néritique)
* P : SLOPE (Pente)
* O : OCEANIC (Océanique)
-- colonne 6 : "ID_Secteur" : Numéro du secteur (strate.sector.sectorNumber) N,4,0
+- colonne 2 : "Secteur" : Nom du secteur (strate.sector.name) C,12
+- colonne 3 : "ID_Secteur" : Numéro du secteur (strate.sector.sectorNumber) N,4,0
+- colonne 4 : "Area" : Surface de la strate (non utilisé pour le moment) N,19,11
+- colonne 5 : "Shape_Leng" : Longueur sur le fichier shape (non utilisé pour le moment) N,19,11
+- colonne 6 : "Shape_Area" : Surface sur le fichier shape (non utilisé pour le moment) N,19,11
Fichier de transect (dbf)
+++++++++++++++++++++++++
-- colonne 0 : "Length" : longueur du transect (transect.length)
-- colonne 1 : "TR_ID" : Identifiant et nom du transect (transect.name)
-- colonne 2 : "Xstart" : Coordonnée X de début du transect (transect.startX)
-- colonne 3 : "Ystart" : Coordonnée Y de début du transect (transect.startY)
-- colonne 4 : "Xend" : Coordonnée X de fin du transect (transect.endX)
-- colonne 5 : "Yend" : Coordonnée Y de fin du transect (transect.endY)
+- colonne 0 : "TR_ID" : Identifiant et nom du transect (transect.name)
+- colonne 1 : "Xstart" : Coordonnée X de début du transect (transect.startX)
+- colonne 2 : "Ystart" : Coordonnée Y de début du transect (transect.startY)
+- colonne 3 : "Xend" : Coordonnée X de fin du transect (transect.endX)
+- colonne 4 : "Yend" : Coordonnée Y de fin du transect (transect.endY)
+- colonne 5 : "Length" : longueur du transect (transect.length)
- colonne 6 : "Passage" : Numéro de passage (transect.nbTimes)
- colonne 7 : "SECTEUR" : Numéro du secteur (transect.strate.sector.sectorNumber)
- colonne 8 : "STRATE" : Type de strate (transect.strate.strateType)
@@ -104,8 +105,6 @@
* P : SLOPE (Pente)
* O : OCEANIC (Océanique)
-- colonne 9 : "Shape_Leng" : longueur sur le fichier shape (non utilisé pour le moment)
-
Sauvegarde des fichiers
+++++++++++++++++++++++
Modified: trunk/src/site/rst/index.rst
===================================================================
--- trunk/src/site/rst/index.rst 2012-09-01 09:51:22 UTC (rev 504)
+++ trunk/src/site/rst/index.rst 2012-09-01 09:51:38 UTC (rev 505)
@@ -67,7 +67,7 @@
Premiers pas
------------
-Version 0.5
+Version 0.7
~~~~~~~~~~~
1. Une fois l'application démarré, il faut créer une nouvelle campagne via le bouton "New" à côté de la
@@ -91,6 +91,7 @@
<import-export.html#observateurs-csv>`_
5. Une fois la campagne prête, vous pouvez créer un nouveau vol depuis la page d'accueil avec le bouton "On Board".
+ L'application propose un numéro de vol, mais vous pouvez le modifier si vous le souhaitez.
L'écran principal s'affiche, vous pouvez désormais préparer le plan de vol avec les transects et les observateurs.
6. Une fois le plan de vol préparé, vous pouvez lancer le vol via le bouton START
1
0
01 Sep '12
Author: fdesbois
Date: 2012-09-01 11:51:22 +0200 (Sat, 01 Sep 2012)
New Revision: 504
Url: http://forge.codelutin.com/repositories/revision/sammoa/504
Log:
fixes #1417 :
- improve validations
- add validation for transect
- disable delete for the moment
Added:
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Validables.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidTransectAction.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/SelectionModelAdapter.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TableSelectionListener.java
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/ValidationService.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.java
trunk/sammoa-persistence/pom.xml
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/AutoSaveListener.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Routes.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectFlights.java
trunk/sammoa-persistence/src/main/xmi/sammoa.zargo
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidAction.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidObservationAction.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidRouteAction.java
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.jaxx
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightBarHandler.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/FlightUIModel.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/TransectFlightModel.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/TransectTableModel.java
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/util/DeletedRowHighlightPredicate.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/SammoaUtil.java
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/ValidRowHighlightPredicate.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/ValidationService.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/ValidationService.java 2012-09-01 09:51:00 UTC (rev 503)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/ValidationService.java 2012-09-01 09:51:22 UTC (rev 504)
@@ -24,7 +24,6 @@
*/
import fr.ulr.sammoa.persistence.Flight;
-import fr.ulr.sammoa.persistence.FlightDAO;
import fr.ulr.sammoa.persistence.Observation;
import fr.ulr.sammoa.persistence.ObservationDAO;
import fr.ulr.sammoa.persistence.Observations;
@@ -47,46 +46,47 @@
*/
public class ValidationService extends SammoaServiceSupport {
- public void validateTransect(Flight flight,
- TransectFlight transectFlight) {
+ public TransectFlight validateTransectFlight(Flight flight,
+ TransectFlight transectFlight) {
TopiaContext tx = beginTransaction();
try {
TransectFlightDAO transectFlightDAO = SammoaDAOHelper.getTransectFlightDAO(tx);
- TransectFlight transectFlightExists = transectFlightDAO.findByTopiaId(transectFlight.getTopiaId());
+ TransectFlight result = transectFlightDAO.findByTopiaId(transectFlight.getTopiaId());
boolean valid = !transectFlight.isValid();
- if (transectFlightExists.isDeleted()) {
+ if (transectFlight.isDeleted()) {
- ObserverPositionDAO observerPositionDAO = SammoaDAOHelper.getObserverPositionDAO(tx);
- observerPositionDAO.deleteAll(transectFlightExists.getObserverPosition());
+// ObserverPositionDAO observerPositionDAO = SammoaDAOHelper.getObserverPositionDAO(tx);
+// observerPositionDAO.deleteAll(transectFlightExists.getObserverPosition());
+//
+// FlightDAO flightDAO = SammoaDAOHelper.getFlightDAO(tx);
+// Flight flightExists = flightDAO.findByTopiaId(flight.getTopiaId());
+//
+// flightExists.removeTransectFlight(transectFlightExists);
+//
+// // XXX-fdesbois-2012-08-23 : maybe useless with cascade on delete ?
+// transectFlightDAO.delete(transectFlightExists);
- FlightDAO flightDAO = SammoaDAOHelper.getFlightDAO(tx);
- Flight flightExists = flightDAO.findByTopiaId(flight.getTopiaId());
-
- flightExists.removeTransectFlight(transectFlightExists);
-
- // XXX-fdesbois-2012-08-23 : maybe useless with cascade on delete ?
- transectFlightDAO.delete(transectFlightExists);
-
} else {
RouteDAO routeDAO = SammoaDAOHelper.getRouteDAO(tx);
- List<Route> routes = routeDAO.findAllByTransectFlight(transectFlightExists);
+ List<Route> routes = routeDAO.findAllByTransectFlight(result);
for (Route route : routes) {
validateRoute(tx, route, valid);
}
- transectFlightExists.setValid(valid);
- transectFlightDAO.update(transectFlightExists);
+ result.setValid(valid);
+ transectFlightDAO.update(result);
}
tx.commitTransaction();
transectFlight.setValid(valid);
+ return result;
} catch (TopiaException ex) {
throw new TopiaRuntimeException(ex);
@@ -95,21 +95,22 @@
}
}
- public void validateRoute(Route route) {
+ public Route validateRoute(Route route) {
TopiaContext tx = beginTransaction();
try {
RouteDAO routeDAO = SammoaDAOHelper.getRouteDAO(tx);
- Route routeExists = routeDAO.findByTopiaId(route.getTopiaId());
+ Route result = routeDAO.findByTopiaId(route.getTopiaId());
boolean valid = !route.isValid();
- validateRoute(tx, routeExists, valid);
+ validateRoute(tx, result, valid);
tx.commitTransaction();
route.setValid(valid);
+ return result;
} catch (TopiaException ex) {
throw new TopiaRuntimeException(ex);
@@ -118,22 +119,23 @@
}
}
- public void validateObservation(Observation observation) {
+ public Observation validateObservation(Observation observation) {
TopiaContext tx = beginTransaction();
try {
ObservationDAO dao = SammoaDAOHelper.getObservationDAO(tx);
- Observation observationExists =
+ Observation result =
dao.findByTopiaId(observation.getTopiaId());
boolean valid = !observation.isValid();
- validateObservation(tx, observationExists, valid);
+ validateObservation(tx, result, valid);
tx.commitTransaction();
observation.setValid(valid);
+ return result;
} catch (TopiaException ex) {
throw new TopiaRuntimeException(ex);
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-09-01 09:51:00 UTC (rev 503)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.java 2012-09-01 09:51:22 UTC (rev 504)
@@ -238,9 +238,9 @@
effortGroup = null;
}
- boolean routeIsValid = Routes.isRouteAccepted(route,
- routeTypes,
- strates);
+ boolean routeIsValid = Routes.isAccepted(route,
+ routeTypes,
+ strates);
if (routeIsValid) {
@@ -475,7 +475,7 @@
routeObservations.size()}
);
}
- if (!Routes.isRouteAccepted(route, routeTypes, strates)) {
+ if (!Routes.isAccepted(route, routeTypes, strates)) {
// not selected route
continue;
Modified: trunk/sammoa-persistence/pom.xml
===================================================================
--- trunk/sammoa-persistence/pom.xml 2012-09-01 09:51:00 UTC (rev 503)
+++ trunk/sammoa-persistence/pom.xml 2012-09-01 09:51:22 UTC (rev 504)
@@ -47,6 +47,11 @@
</dependency>
<dependency>
+ <groupId>org.nuiton</groupId>
+ <artifactId>nuiton-validator</artifactId>
+ </dependency>
+
+ <dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
</dependency>
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/AutoSaveListener.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/AutoSaveListener.java 2012-09-01 09:51:00 UTC (rev 503)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/AutoSaveListener.java 2012-09-01 09:51:22 UTC (rev 504)
@@ -133,6 +133,11 @@
public synchronized void stop() {
stop = true;
commit();
+ if (logger.isWarnEnabled() && !changedEntities.isEmpty() || !createdEntities.isEmpty()) {
+ logger.warn("Some entities are removed from autoSave but unsaved, check log for errors");
+ }
+ changedEntities.clear();
+ createdEntities.clear();
}
protected class AutoCommit extends TimerTask {
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-09-01 09:51:00 UTC (rev 503)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java 2012-09-01 09:51:22 UTC (rev 504)
@@ -30,6 +30,7 @@
import com.google.common.collect.Iterables;
import org.apache.commons.collections.CollectionUtils;
import org.joda.time.Interval;
+import org.nuiton.validator.bean.list.BeanListValidator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -62,6 +63,11 @@
return Iterables.filter(observations, inRoute(route, routes, ignoreDeleted));
}
+ public static boolean isValid(Observation observation,
+ BeanListValidator<Observation> validator) {
+ return Validables.isValid(observation, validator);
+ }
+
public static boolean inRoute(Observation observation,
Route route,
Iterable<Route> routes,
@@ -104,26 +110,6 @@
return new InRoutePredicate(route, routes, ignoreDeleted);
}
-// public static boolean inDateInterval(Observation observation, Interval interval) {
-//
-// boolean result = Dates.inInterval(observation.getObservationTime(), interval);
-//
-//// 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> inDateInterval(Interval interval) {
- return new InDateIntervalPredicate(interval);
- }
-
public static void removeOtherSpecies(List<Observation> observations,
List<Species> species) {
if (CollectionUtils.isNotEmpty(species)) {
@@ -176,6 +162,14 @@
return result;
}
+ public static Predicate<Observation> inDateInterval(Interval interval) {
+ return new InDateIntervalPredicate(interval);
+ }
+
+ public static Predicate<Observation> isValid(BeanListValidator<Observation> validator) {
+ return new IsValidPredicate(validator);
+ }
+
private static Function<Observation, Date> TO_DATE_FUNCTION = new Function<Observation, Date>() {
@Override
@@ -223,4 +217,19 @@
}
}
+ private static class IsValidPredicate implements Predicate<Observation> {
+
+ protected BeanListValidator<Observation> validator;
+
+ public IsValidPredicate(BeanListValidator<Observation> validator) {
+ Preconditions.checkNotNull(validator);
+ this.validator = validator;
+ }
+
+ @Override
+ public boolean apply(Observation input) {
+ return isValid(input, validator);
+ }
+ }
+
}
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Routes.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Routes.java 2012-09-01 09:51:00 UTC (rev 503)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Routes.java 2012-09-01 09:51:22 UTC (rev 504)
@@ -29,11 +29,13 @@
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.ComparisonChain;
+import com.google.common.collect.FluentIterable;
import com.google.common.collect.Iterables;
import com.google.common.collect.Ordering;
import com.google.common.collect.Sets;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.nuiton.validator.bean.list.BeanListValidator;
import java.util.Comparator;
import java.util.Date;
@@ -71,9 +73,9 @@
return result;
}
- public static boolean isRouteAccepted(Route route,
- List<RouteType> routeTypes,
- List<Strate> strates) {
+ public static boolean isAccepted(Route route,
+ List<RouteType> routeTypes,
+ List<Strate> strates) {
boolean result = false;
if (CollectionUtils.isEmpty(routeTypes) ||
@@ -91,8 +93,45 @@
return result;
}
+ public static boolean isValid(Route route,
+ BeanListValidator<Route> routeValidator,
+ BeanListValidator<Observation> observationValidator) {
+
+ boolean result;
+ if (route.isDeleted()) {
+ result = true;
+
+ } else {
+
+ Set<Route> routes = routeValidator.getBeans();
+
+ result = Validables.isValid(route, routeValidator)
+ && !Routes.equal(route, Routes.findPrevious(routes, route));
+
+ if (result) {
+
+ // Check validity of observations
+ result = FluentIterable
+ .from(observationValidator.getBeans())
+ .filter(Observations.inRoute(route, routes, true))
+ .allMatch(Observations.isValid(observationValidator));
+ }
+ }
+ return result;
+ }
+
public static boolean equal(Route o1, Route o2) {
+ if (o1 == null && o2 != null) {
+ return false;
+ }
+ if (o2 == null && o1 != null) {
+ return false;
+ }
+ if (o1 == null) {
+ return true;
+ }
+
boolean result = Objects.equal(o1.getRouteType(), o2.getRouteType());
// We assume that time equality for a same routeType is an equivalence
@@ -165,18 +204,22 @@
Observation observation,
boolean ignoreDeleted) {
- return Iterables.find(routes, new WithObservationPredicate(observation, routes, ignoreDeleted), null);
+ return Iterables.find(routes, withObservation(routes, observation, ignoreDeleted));
}
-// public static Date getMiddleTime(Route previousRoute, Route nextRoute) {
-// Date previousTime = previousRoute.getBeginTime();
-// Date nextTime = nextRoute.getBeginTime();
-//
-// long diff = nextTime.getTime() - previousTime.getTime();
-// Date result = new Date(nextTime.getTime() - diff / 2);
-// return result;
-// }
+ public static boolean withTransectFlight(Route route, TransectFlight transectFlight) {
+ return transectFlight.equals(route.getTransectFlight());
+ }
+ public static Predicate<Route> withTransectFlight(TransectFlight transectFlight) {
+ return new WithTransectFlightPredicate(transectFlight);
+ }
+
+ public static Predicate<Route> isValid(BeanListValidator<Route> validator,
+ BeanListValidator<Observation> obsValidator) {
+ return new IsValidPredicate(validator, obsValidator);
+ }
+
public static Predicate<Route> isDeleted() {
return IS_DELETED_PREDICATE;
}
@@ -185,6 +228,12 @@
return BY_DATE_COMPARATOR;
}
+ public static Predicate<Route> withObservation(Iterable<Route> routes,
+ Observation observation,
+ boolean ignoreDeleted) {
+ return new WithObservationPredicate(observation, routes, ignoreDeleted);
+ }
+
private static Comparator<Route> BY_DATE_COMPARATOR = new Comparator<Route>() {
@Override
@@ -238,6 +287,41 @@
}
}
+ private static class WithTransectFlightPredicate implements Predicate<Route> {
+
+ protected TransectFlight transectFlight;
+
+ public WithTransectFlightPredicate(TransectFlight transectFlight) {
+ Preconditions.checkNotNull(transectFlight);
+ this.transectFlight = transectFlight;
+ }
+
+ @Override
+ public boolean apply(Route input) {
+ return withTransectFlight(input, transectFlight);
+ }
+ }
+
+ private static class IsValidPredicate implements Predicate<Route> {
+
+ protected BeanListValidator<Route> validator;
+
+ protected BeanListValidator<Observation> obsValidator;
+
+ private IsValidPredicate(BeanListValidator<Route> validator,
+ BeanListValidator<Observation> obsValidator) {
+ Preconditions.checkNotNull(validator);
+ Preconditions.checkNotNull(obsValidator);
+ this.validator = validator;
+ this.obsValidator = obsValidator;
+ }
+
+ @Override
+ public boolean apply(Route input) {
+ return isValid(input, validator, obsValidator);
+ }
+ }
+
private static <T> T getNext(Iterable<T> elements,
final T element,
final Comparator<T> comparator) {
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectFlights.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectFlights.java 2012-09-01 09:51:00 UTC (rev 503)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectFlights.java 2012-09-01 09:51:22 UTC (rev 504)
@@ -26,7 +26,9 @@
import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
+import com.google.common.collect.FluentIterable;
import com.google.common.collect.Sets;
+import org.nuiton.validator.bean.list.BeanListValidator;
import java.util.Set;
@@ -51,6 +53,22 @@
return result;
}
+ public static boolean isValid(TransectFlight transectFlight,
+ BeanListValidator<Route> routeValidator,
+ BeanListValidator<Observation> observationValidator) {
+
+ boolean result = transectFlight.isValid() || transectFlight.isDeleted();
+
+ if (!result) {
+
+ // Check validity of routes
+ result = FluentIterable.from(routeValidator.getBeans())
+ .filter(Routes.withTransectFlight(transectFlight))
+ .allMatch(Routes.isValid(routeValidator, observationValidator));
+ }
+ return result;
+ }
+
public static Predicate<TransectFlight> isNotDeleted() {
return Predicates.not(isDeleted());
}
Added: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Validables.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Validables.java (rev 0)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Validables.java 2012-09-01 09:51:22 UTC (rev 504)
@@ -0,0 +1,41 @@
+package fr.ulr.sammoa.persistence;
+
+import com.google.common.base.Predicate;
+import org.nuiton.validator.bean.list.BeanListValidator;
+
+/**
+ * Created: 31/08/12
+ *
+ * @author fdesbois <florian.desbois(a)codelutin.com>
+ */
+public final class Validables {
+
+ private Validables() {
+ // static class do not have instanciation
+ }
+
+ public static <E extends Validable> boolean isValid(E bean, BeanListValidator<E> validator) {
+ return bean.isValid()
+ || bean.isDeleted()
+ || validator.getContext(bean).isValid();
+ }
+
+ public static <E extends Validable> Predicate<E> isValid(BeanListValidator<E> validator) {
+ return new IsValidPredicate<E>(validator);
+ }
+
+ private static class IsValidPredicate<E extends Validable> implements Predicate<E> {
+
+ protected BeanListValidator<E> validator;
+
+ private IsValidPredicate(BeanListValidator<E> validator) {
+ this.validator = validator;
+ }
+
+ @Override
+ public boolean apply(E input) {
+ return isValid(input, validator);
+ }
+ }
+
+}
Property changes on: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Validables.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-09-01 09:51:00 UTC (rev 503)
+++ trunk/sammoa-persistence/src/main/xmi/sammoa.zargo 2012-09-01 09:51:22 UTC (rev 504)
@@ -1,9 +1,7 @@
-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�(��+
+PK(�Asammoa.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�PKhiAsammoa_Diagrammedeclasses.pgml�]m��6���_�*{B� &����s�c����m��R�k�����[���w�;��H��lR�D��nR�D���F���t����q6�.��h���p�
+�V�Ch��(`�5��18��!F��NݹU�'��nP5eq&��/�����<��-�����휈3F��@ o4�|T���jIm�Q��j��tFh`��ہۖ�����ӷ�~�?=e�5t�7X�g�ʨ �(!��~��Uf(��Q���繟����{�������O�" �I~y"^�(XeJ7�߂����"��/굡~��Ӑ;�i�<�S1�U�!�k���%q#��]`���ǥ��Z��cI��zmQ�0��|Hr�W϶��ލ-oTe�P/t�HǑ*����c��?��(��z���PK/UgH�PK(�Asammoa_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��]��
@@ -93,85 +91,83 @@
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)����
-ɐ����uzj�=ߧ����¾z��$�A-���$�|�;�wv�$�}<
-�;'&��a�r^7v&#�ps��g�G_���]=�+ddW�� ���t���[�n㾪���dW�Y�U�F)�ajIL~�|�A�à�a��a�:��V����ʺZU>&q��2/v|�����e�7�?(�6#�_6b0+�g���s�99gdB]|~�䯀:��!�Z:�e�zy;ʊΉ��s������I���}�߸�;aE���y�����:I���I٩����UtȲKV9��-W&�\or����y��Xf
-�@Gf��7���j�jX�����F�+����쇖z�ë��?
-OqH�@l�D�c�<4�#�<�j�8�(wl5�|jZ>C�u�Eo[N��,O�0ӱ�J����s�,uc�M�їE��2wnZ2���QDs3�V��}�S�k�0L�D��e��hGŇ|��BE3�*T踂
-]�
-��%�Z�ׅ��4�nK���K95(i�f ����%(J(T诠�tS��O��>�D$�K�4�(Н�B�����d���2
-�2
--.��Εɠ�����Z�"�ډ(PQ�
-�X��"�[C=MX��n��J�VI(\*�K(P�P�.+(���^&:UPl��6�.f��2�an&����a\E�D`4Ȩ���x�M#�Q����]������֪����Et�JG������,����E���¦Y谠����Ϯ��Cgщ����Mb
-v&��4dj
-/?�j��j
-
-j���z!�%;����joƋ�j��`AO�"�(�P^"��nEPIY�Ƭ��ST�U�
-q{��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�|��
+Tj�y��7G;�@�"����ƷL�T��>ɱ/]��r�}ɿzx�����PK:�&s�*ѡPK)�A&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)�Asammoa_Diagrammedeclasses2.pgml��o�8��_���t'�)6�������i�v�nݤi�N�ʍ�����$�@RJ[��6U1�����>�'&�on��tE��gC
+Y�3'��3o(�8�3e��h���_�O��7|������$���Md��\��؉�9KZ#o`G^��J�5�m/������w��Y�p�"���?����q`��ɲ�{���=]�H�Mt�T�Z�n�6:�3E9P�yGJ��=�Cy�֔B�$��Nc �;#�u�E�b��x�{Jzk{��Ą�*Vv%U�w%�Ю����6�����8�C�b�:f4�!����>�*��9�l��q���X���ʳ�^Fԅ������̬�h�p�A
+��K���X~���˒U�q`;���Qr�p�W6������,��g^@sc1�F�f(�7ӳ[8S���ڟ�ˡ>NK.��]����iIɮ:��������%�ް|�Q�è�a��a�:��V�����ÒĻZU�3�h$���gv�;C9 ��p�Ro3����i�?������K��������p�߶r`Y~��iK .�1�Q�oć���b�J���k����0NUC�0Z�U��n嬴S�<ȽW1 �!Y��D�2��z�+,����Ʋ��ud���f��Zi5Z�T[����*`��J}v�ʃ3xD���pԐ��D*&b#S�����Rs���y�૭�$]�����l���r��.�eS�q8����/��ܾ���2K�Ϻ�8ڦ�c�d��KnXҀ��^���h����٬
+R�
+��J��H_U��SŇl����fU�T�DP�F*T�)=E��RL����R�Ҭ3�u�O�B%�jF(M$�GF(TD(��_��4C��ONP�1���+M���(5�(���rr�9F!���i~h��>P)��/��P ������E�o�z��R�nҍ�P%�V!�*F�G(TB��&�U&(L�پ'�蔠��K,.�Ћ2277+�&Na�T)�G�h����t�"��r��{Qd�h�`�Ԙ�.v'�R�'���[�8
+8
+��R���E�H�(tX )q���Ed�b賀��S�3��aHi�lޔj#���h*�� Bz�)��jo�O��)\�RF�J�Jz�x�OT=�,u>�&㔁J�jQ��5}0��@�@U���({R�I����(�,U��n�'e�=EL�Y�>0���b��Я*6�,��������}ZS\OS�h�ŔG��QGA�jWE��S�RK�RY�ȳ�4�,!M��LSj��>���2M��gWυ�>C�B� ������V�#�m�6z�9H�O��:_˪��H�O��5�Y���NL�XJ-�M��1Q���-kV�j[l��̝��Z�t�5/�t">�W�!xg;>�CJ��DېN�6�qvϞ<���.˒�'����I�dP��I��q��������9�����Z�oG6ko���1��vx�.8�|���"r�y1�c�K@`�_�Q��>(�3�������_�f�Õw8�ATM!μ�W�|$_"[Vmp�9���=�)�g��wޮM���G�
+�o.��Ѩ���d���&��S>h�Ӌ�Ƚ���0WG�G]0}p�p�yܶd����,�M�+�B��4��]}М���X��m���
+�&=���i��6����s���Fm#M�F۰��Nۤ��Ʀ`n��s|��~gm�=���i��6���������V�V�6�Զ�wm���ңI��w�6y�`��?PKɟ���FAPK)�Asammoa.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����KPKhiAsammoa_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����KPK)�Asammoa_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�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
+�����������b<��SR�S�R�K�����+�,EȂ9PK8��7y�PK)�A
+sammoa.xmi�]ݖ�8r�ߧ���cϜl�E��({�s$�������{f7Ws TsM����*���\fr�g��$O�բB�����ݒ�X(|U(������S�p����Ey�6�/�[���c��O��K�7��o�o����i��$�y~�����7A8n�q�6��GSd�����c�&S��:t��l��TE5_5�WjW���j/��AQ����8|�(��v`�&؏QL(������� �I�^8(1��"��8a�G
+%���K�,_���w�_fz�n����f����N �a[!w����+Jt�^���i���+UW��|�T�}�V�������wʟ��3��'����ẍ́� &�l�))��
+y�oV��/ߨ
+���7�;-���
+���wqK������\;R�sѼ �rq�nb��6�شڸ��R_]��f�Us�2����(I�.�h2 �Kō��r�J^��� /����Ag�x������n�Eq�����Q�/p����7�CO�o�l4&�����\�V��(��Џ��.}��#�|�]�0R�hD��Q�ç�s��j���7+�_���|? ��x���������{����btd����=�o���w����
+�)� ��Ɗ�1e��uY�ap%7_�u�N�+A8e�B%DS
+d,>+���3��1h�u0�$������L�쉒���1���|��8�J��w�Q2g�O&�cFJS�����|��~7|�b�V�M~ŎC��;�"
+�������K�E��ۈ�z���c����!���o}�E#yD��У37"ӘHI����]�
+�~��eu\�֡$п�D�=�c"�P��%y++�E�t�u�)脘�b��+6Z��%6ɜ�Xy
+<Ŧ���I/Oq=����_O�H�G�L�@o����P#�я0я�,$���J�5
+)�#�϶��>�Ŵ��ұTȸ)�� O��q0�,���������sAHn�-C�Rvr�#��c������w��A���
+���c��z�(+��Cd$,%ڐA�\�a.t�����V��_gA��#a����p$����Ǣx(G�O�B%��""�O�K����Q�/�QC��/d�B��'�o�4,��
+ߢz+����
+-�C�2��S"��L!�7J�e���-/�i�BBX�ikzu�,®��ܨ�2�R,�K�1�pxU�y>F�w�>��.�[|\r�om<��!�5��\c����M!!���A?�ax�b�}@�'�h��uZ��a!:�][m�]�`�nVץ8'l̼�%�Ɣ.-��N1�5]Fj��;�n�~��vˆC����9={�讲��Y���P͢C,o���g�M�f o��f�w�����N�*{>�?}r�ry2R<Ro�-�W\"�~9K[��ͮ�P���#��m� W���|����
+�U��9�m�f�D�^����`!?QC�8l8��O�sF�ǡK�}�Z��L���]��86�Nw����F�ǿ��T����d��?��<��1�"yxo��6d
+#�V���=�<��#��Q8���}6��`�}�,�6�]��ט̼؝r��Y�R�J�}Y�g��|T#�/�ל��#m�/�L�L//���T�_*��4��A/e^j�5s,/w���L�ȡ�P�H�qa�=�����%�`6�A8�$k �%K�K�_��A�����'D�A��X��l����y��\g#�v�8�M!.p|����m���c �u���H��xw��˻��C)hն�����?����XjS����VR��Va������/;M�RZl[⦣~fk��5WP�2̨���*��oKAd�\?�N�T�O|��8��]>���K1��C������͠�r����>�����<2��ޭ?8�{QX�A&��_'}ý����^y��ck�Y�����3���7�M�~G^�r�61t3?��m���x���~�s�\�H�7˴��1Y&OѺ'=��H�Z�g\�R��q)a�P����/���7&�w|U�oL�����$Grw�ش:���(6�䪞��G�ƃ�e��h�s!�X@����E}B6r4�����U���J��q�Snmܻb
+Bz-�qsE_�[(N��ݞ:E��p6���\�"��I�[�W�����֥�.{�t���6����{�`���.�-��yH/��*�^+�-6<_���<�"��ءYr�nl̯^����P��n�
+��'V�m̲*�����+�kf0H��IW��G�Ϩ_3#���[|�<&\�p͝3�#��O��l�|at}
+�l'Pǩhc'�����Γ�a�1��S�^L�8g�������o2���7�N���-�Q=�o�yr>z����C�±�v���ى�z�b��8�L�Hz�a,�!�"4uh㾞{���Xgf���6>�SD�˽���̔�N��l$�yA�n��RH���Z�U��Yc;u����WH
+'�-&r^�<��yP��>�t|8˸��z5��637�u������%�����O`O�s��Ť�&O,�h����1��j���2"�aT�U~rź�bv.=X*`q>�&��k�j�'.:l9mƁ����p�s���um�U{0,%$�"�Z�#����KJ���-'<�gUҤ��mұK���V�
+%�
+�<��/bR���o�?��W���̊�'2+�r��1�~�&#����y�{8r����]�Ps+D�KHO�/ S����>���(MX9�,�̬L��}\,Wye_D��$;���r*@����yċR*0Hϧ�Y���Rkn[���l"��1M���[�(�Bȝ��P�V��Ť��o�d��ҫ<��NU�v��,PkpO��@�H�\sk�9����MF*V��#��2�����Ae+VzfHO
+�d��s���L�C8�sP�~���=W�"nj�B8���r+͏��� v��i��y��<�O_�P�3pݨ����L��6�4KՒ�&�M
+@P ��r��k��F�n��F��s�]1�$�@@f��[������~>���~����
+�X�o���V�m��a?v��աN��6�����G��+7E!aP�C�t}H��;@���bB�σ�O�o����Ԓn��Y6>r��9��T��<��0#V�&^Ζ���nd�.
+q�7��j�.K <6Pr�R"��%�㉦`nQ���Q<���b%����@�Q��O����~�r����,�Ri����i5���v%;�:Vul����|��^[\����~Rxxr�J�@�Um2zlr��%7��72G�I���m��ڦ�05[w��h1�mt���eo�G;�8K��˵V���J��%��1���;]��:��:3�&�Uz3_���2�ܼF%������*4���ixo9��ľ�j�u.�I��ڍ�O*!oq�!pw��
+;zq�g�G���z�n+�w 2L�S�P�>f����R��>3F%/��n<��xZ���V��Á��*���%� H ��vɑ w3�^��B��t��3s{����b�J(��������M1�dr-��8�p�)ӡ�H�p��U���m:#�V[:s/���R:����Hp��@�<0
+2*����LR9�r���F�vK�P`�/�%�]�)�m�����i��-�����j��{W�%0��_[Hc��iR��{,�y��g����1%�k�'.��繽cJ$�ͫ��D���,���B�Ce���n(�� �H�)Ҡ�� �Y��Dd:@�A���uN�`���?`KA��F�Q��<ő^��6��E�>S
+6�z��$�bi1U����=VI/@�sEne4��f���� mr�C���jQ�M�l���YL�dq� Ir� � nT�h~�n%�xZ��m*�t�1�[��͂�7wr�
+H���I Nld:��) ����p8 ��b����L�[�2��K�>q ��bj%���2�at���� |� ���h�]�pf:��?��Y�^)<!υ�r�K~q�[�^���.ڪ��4��$�i�l�q��!7�����4�$K��"� �3*�%�tin`H��.��!�eY3]�����%p\���R,�{
+i2C
+���F�אFW�;1",UCV����e�fc
+�F�-�|�r<Պ�a��n��8K�. ��YZ�14a�`���0мp�N ���c�T4g��O����L�"�x3<A� �ς�̈́�p�L�c�D�(n�I/��71�-���Px2ӡ��KB��"��º��#5�6�Uv��7�l�zĝI3q� �,ӡ�0P�<������.� rw2(66��{ϰ�|��m��\V(���ƌ��Ja�X�@~a��l ���pK����[�ZeL-�(�8���t�q&Qq���s�n���@���sH���.J$,�&3�$�܇���Ƃ��<�^�u��?'·
+�l�,-�(&��L�ʺm�ߑAB+�g���q�j�L��P�0�Q��f���q�������9�;�^y�H���������,�o�~�_g�\q���H/!�`�t���W�n�B¢�����s�ڹ:<��|6r}{�%��ts�в�x/aN���9��T��<���f{�בΖ���rd��l�ň=Ƨ�p�e|�M�&ܼ��
+�\�*0w>- �����O��<��亩����l91`rGF��tő�`����t��F���䦓 ��e:T}�y��]��y���d�������FRU A������O��9ӡ��gq�eZ�h�;R�����c�`P'0�|�-lG��6a:�dxZLy;q���]������da���x�?�9P(N�'�tH���:����89�1|;�_�OIX�E�0{��A�,��2��KH����B�K[���}.���8�ی��F�1��D�#�^L�q���E�C���5B��4ZI��32�-�\
+nt��C!�ɷwIQ_?0��jA!�B�A�C�C��En�
+��GK^����^��w�CnhA��� ���(�ׂ"��ȂL�z��ł�t���uL
+dx�.90�Q���AA���D����q�0��MF�,�ckA���L��u�ao2���2���A�Sa��0S��m�̐��:? ���$)�����)��c+�,n�ө�a�RB�� �;-��/�%�
+ƣ<[���'N���t����v�~v8B
+>�Ĕ�g1�$ ����P�T�D��Pk��b���Z2ӡ��'�]K��]ˡ�G���;e�FD�r)I�˟n���ג��݈��-d�Y��8}���Pc�Q\&��#i����U�$S�)�#N���t�1�N���=2��yZ�th8ܜ�8@d�[�c�)��,O���!N��t�1H$��m���-愳�p�9ӡ�>e!Dh��Q��LzԵ��]]s�b��҄�&�ǘ�Z��@�>pd:��,� �Ѷe�TB @�;�%�f9����$N�lodEXn.��N��
+�[^�'�����*�[C�}�j`K\���ɵr!�R��������PMw�Jnp~���b�H�2���?���eg10 N�@�C5��Ҭ{7���@䀞�<�����v�Z�WӴ��V���a�{���pR�.7�=�{e�Y��]Hh��PM'��U���l*-�0tu�a
+��<���q�( ��b��HgB2�fq���K�]�
+p@�����J����i�}P@��U�'�Yd:
+P�������Hq��pa!<�p 7݊5( ��b
+bK�3j���\�Ș�[p��P���Z?zp'�d
+��s��Mq�`� ӡ�U��&g������63�А]��9s�>�֍o�π2l-
+��4�t�fY�#�ʉ�ؐ��P�k�?�̭�u=|�s�K���SL�Ϸ�6G���(�y��4Cǎ�)�:��j��V�m�sc[H;�8�;Nh���7�6�v�u������ ��&R#��n�� ��ȥ��I��W�镣)�=~���ˊ,[�o��{��ǿ�?]�m
+.���|�E�>~DOn��ZS���@뇴;C��ٝS� Q>�"����JK��^����ƫ(����^?ǀL�s)J�Z��
+{�yul��ٲ}t�C��ПM������v��7��p�.K@<�����@���%�$�2a�s�V�>8x��Ps7��X�̣W)<!ϵ� ��A�a@g�����n+�<�d�GL)���V�>�B��Pu ��P�t[�D.t�m�-�f+�C%zv��#�@��)�#�(�4�X�����^�r���Y�`r'�?R����W��u(ufp�3��cj�$�1�-�Z�������&.��������tM�)'�F���F�����C&H������������V.8�҇�<��&$s���� Y���l]��mB�k.>P[ynv���~�d��_Hd/���`�x`��ny*42Yw��Wi���ŋ
+yn<$���3�@����D4�t�fu?(�q��c���O>a��84�x�����m ��Q��2��#h��I����Zn5W��.
+�#�J����I�)b��\v�{d®9�B2��z�$�˒=A"g�kS�Yr��W$�UI B&�� !b�M�ͱ�r3��g��R���:���X&���7<����ߜ�w#L`;z۲M[�y�9&��K1����LvCf�
+�)�Gf�(��
+Ŕ��O�<0ā��`���V��R��d3�z#�@��/�7gf��K^��|UL�a��NM���_��r�_��T�u��jl��V_�FȲ�F"hZ��SІ�
+[ŕ����̽v�¢nfaF�eC'��3�@�^�zX$��������
+b�7:���U��ɲꯈ�YC@^_�]��#��ƶ�]ˡ�F�=2L�f�u��t?B#��D@P��a
��f��:�f�Hwˮ����.���Q0B3����i�N�L��i��5X�U3��.(N_�9%zA`�9�B8)�el���#���!�r`�x���]{K�)q+�[��"�CN8)~T�R�@(E��p��ܣ?'-B'�܃��@~j�'P����9���ͤ���5(�8�*;�f�����QR6p0J
+L+q
+T���h��P�,7�^g�}�����Y��}�IcF�`��b��L�`H���r2B=�L��b�!�b���}��M���S�v���ô3?� K� ��FL��S�[��)�%�a��g��I-p'e:
+l�M<�c�'�5@�S��K,A &�t8<T��#��
+@ ��bRJX�T�{���ԜD&�մ�ӫ14�;́��A��ih ��b���� ӡ�Չ��V�v��&Qy��4�K��oͦm��ڶغ�DD���~s���͊���QL`��T��,ə8�:�f9͊�Y�:9>�F��A,����q����떷D���3mI���CH�2o�����$[TxCR��|��s���M>�΄,��� � ����.A�^y�,�3�VZ��7ܓ)�������
+9,aH�q��_��ԗ#s.x[پ�l[A��u�J�I�:�>;Q�`1�7$��k�*���( q��� �(��1�Ɔg��zX�͙�ڠ��iRr��NѵN�YH3;���j'�����j'�m�p�v�\h�本��x�c̱����.�Ȍ8�b�AKf��u-,.�p���.��v`=��q�zX3t�h�|][M��bGQ�76rʼn�F}6^�rV����+<ž�}�K��\��#�U͉�J�:�� �a�C��O^�A�8�fl/n�&g!���z\a�p.�0�(?b�g� �F�3�r�0���%�c#Gs�n�]�MD.�L��)̜݃����s����"�k0GR8a�ݔ�"Ξ7a�%L:�Y87�q��/+}�qj���6¿Έ�ȓ���?`;�l��G�j V�)�0#fͨe�i�}#7Qz: !&D�<�r}{�%� ���s^l���gƒ�^����2a%5��.�y����P��Uˢ��n�nw[���b���ǿ���T)��]�@ȇ��p�d�ܣ�=��E'�����]a�@h�����p�A+??��ZY�|�r���fc�Z�����h�f9lGC�W}�Q��a�q/KG��E��&6�:�
+��6'��
+�m��sZ�?������9��%3�Mݠ��p�>�KM
+�Z�s9�?�|�+d=g����\�6���>���<�͊��F+�[%��{�����z��q|@�+츾{��Pڐ5����!g47^>CG[��Mk33���?�њ̈́H�b*����[������"�h�&k�`Bf�Q����C�Q`'Z�6��B��X��yA�L�тX� ��9����|�S�hD���i�
+���H!��B�5��+SoћY8���<<W9��˽(���=���q�L�Y�Dq`}"��\��;�ǯ��9��7��1����A.��Ί�b����L;9%�����#����NﮥV6��Q�m��
+���?���ț�Zt�O�UU�?�a�%��F�����AP9�&���0nR����ߎ�m
+�}Bn���'�������{Cq����7�PKa;�v�"��PK(�A/UgH�sammoa.argoPK(�A:�&s�*ѡ�sammoa_Diagrammedeclasses.pgmlPK)�AǒV9�&�-sammoa_Diagrammedecasdutilisation.pgmlPK)�Aɟ���FA�.sammoa_Diagrammedeclasses2.pgmlPK)�AP����K�5sammoa.todoPK)�A8��7y�7sammoa_profile.profilePK)�Aa;�v�"��
+�7sammoa.xmiPK��Z
\ No newline at end of file
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidAction.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidAction.java 2012-09-01 09:51:00 UTC (rev 503)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidAction.java 2012-09-01 09:51:22 UTC (rev 504)
@@ -26,13 +26,19 @@
import com.google.common.base.Preconditions;
import com.google.common.collect.Maps;
import fr.ulr.sammoa.application.ValidationService;
+import fr.ulr.sammoa.persistence.Observation;
+import fr.ulr.sammoa.persistence.Route;
+import fr.ulr.sammoa.persistence.Validable;
import fr.ulr.sammoa.ui.swing.SammoaUIContext;
import jaxx.runtime.JAXXContext;
+import org.nuiton.topia.persistence.TopiaEntity;
import org.nuiton.util.Resource;
import org.nuiton.validator.bean.list.BeanListValidator;
import org.nuiton.validator.bean.list.BeanListValidatorEvent;
import org.nuiton.validator.bean.list.BeanListValidatorListener;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
import java.util.Map;
/**
@@ -69,7 +75,7 @@
* @throws NullPointerException if no validator exists in context for the
* given {@code modelPropertyName}
*/
- private <E> BeanListValidator<E> getValidator(Class<E> beanClass) {
+ private <E extends Validable> BeanListValidator<E> getValidator(Class<E> beanClass) {
BeanListValidator<E> validator = (BeanListValidator<E>) validators.get(beanClass);
if (validator == null) {
String prefix = beanClass.getSimpleName().toLowerCase();
@@ -94,7 +100,33 @@
return validator;
}
- protected <E> boolean isValid(E bean) {
- return getValidator((Class<E>) bean.getClass()).getContext(bean).isValid();
+ protected BeanListValidator<Route> getRouteValidator() {
+ return getValidator(Route.class);
}
+
+ protected BeanListValidator<Observation> getObservationValidator() {
+ return getValidator(Observation.class);
+ }
+
+ protected <E extends TopiaEntity & Validable> void bindValidableModel(String propertyName,
+ Class<E> propertyClass) {
+
+ getModel().addPropertyChangeListener(propertyName, new PropertyChangeListener() {
+
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ TopiaEntity oldValue = (TopiaEntity) evt.getOldValue();
+ if (oldValue != null) {
+ oldValue.removePropertyChangeListener(
+ "deleted", enabledListener);
+ }
+ TopiaEntity newValue = (TopiaEntity) evt.getNewValue();
+ if (newValue != null) {
+ newValue.addPropertyChangeListener(
+ "deleted", enabledListener);
+ }
+ enabledListener.propertyChange(evt);
+ }
+ });
+ }
}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidObservationAction.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidObservationAction.java 2012-09-01 09:51:00 UTC (rev 503)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidObservationAction.java 2012-09-01 09:51:22 UTC (rev 504)
@@ -24,6 +24,7 @@
*/
import fr.ulr.sammoa.persistence.Observation;
+import fr.ulr.sammoa.persistence.Observations;
import fr.ulr.sammoa.ui.swing.flight.FlightUIModel;
import jaxx.runtime.JAXXContext;
import org.slf4j.Logger;
@@ -49,7 +50,7 @@
public ValidObservationAction(JAXXContext context) {
super(_("sammoa.action.validObservation"), context);
putValue(Action.SHORT_DESCRIPTION, _("sammoa.action.validObservation.tip"));
- bindModelProperties(FlightUIModel.PROPERTY_OBSERVATION_EDIT_BEAN);
+ bindValidableModel(FlightUIModel.PROPERTY_OBSERVATION_EDIT_BEAN, Observation.class);
}
@Override
@@ -63,10 +64,13 @@
logger.debug("Validation for observation {}", observation.getObservationNumber());
}
- getValidationService().validateObservation(observation);
+ Observation observationChanged = getValidationService().validateObservation(observation);
- if (observation.isDeleted()) {
- getModel().removeObservation(observation);
+ if (observationChanged.isDeleted()) {
+ getModel().removeObservation(observationChanged);
+ } else {
+ getModel().updateObservation(observationChanged);
+ getModel().setObservationEditBean(observationChanged);
}
}
}
@@ -74,6 +78,7 @@
@Override
protected boolean checkEnabled() {
Observation observation = getModel().getObservationEditBean();
- return observation != null && (observation.isDeleted() || isValid(observation));
+ return observation != null
+ && Observations.isValid(observation, getObservationValidator());
}
}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidRouteAction.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidRouteAction.java 2012-09-01 09:51:00 UTC (rev 503)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidRouteAction.java 2012-09-01 09:51:22 UTC (rev 504)
@@ -23,11 +23,8 @@
* #L%
*/
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
import fr.ulr.sammoa.application.FlightService;
import fr.ulr.sammoa.persistence.Observation;
-import fr.ulr.sammoa.persistence.Observations;
import fr.ulr.sammoa.persistence.Route;
import fr.ulr.sammoa.persistence.Routes;
import fr.ulr.sammoa.ui.swing.SammoaUIContext;
@@ -38,8 +35,6 @@
import javax.swing.Action;
import java.awt.event.ActionEvent;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
import static org.nuiton.i18n.I18n._;
@@ -60,24 +55,8 @@
public ValidRouteAction(JAXXContext context) {
super(_("sammoa.action.validRoute"), context);
putValue(Action.SHORT_DESCRIPTION, _("sammoa.action.validRoute.tip"));
- getModel().addPropertyChangeListener(
- FlightUIModel.PROPERTY_ROUTE_EDIT_BEAN, new PropertyChangeListener() {
-
- @Override
- public void propertyChange(PropertyChangeEvent evt) {
- Route oldValue = (Route) evt.getOldValue();
- if (oldValue != null) {
- oldValue.removePropertyChangeListener(
- Route.PROPERTY_DELETED, enabledListener);
- }
- Route newValue = (Route) evt.getNewValue();
- if (newValue != null) {
- newValue.addPropertyChangeListener(
- Route.PROPERTY_DELETED, enabledListener);
- }
- enabledListener.propertyChange(evt);
- }
- });
+ bindValidableModel(FlightUIModel.PROPERTY_OBSERVATION_EDIT_BEAN, Observation.class);
+ bindValidableModel(FlightUIModel.PROPERTY_ROUTE_EDIT_BEAN, Route.class);
}
@Override
@@ -94,14 +73,18 @@
);
}
- getValidationService().validateRoute(route);
+ Route routeChanged = getValidationService().validateRoute(route);
- if (route.isDeleted()) {
- getModel().removeRoute(route);
+ if (routeChanged.isDeleted()) {
+ getModel().removeRoute(routeChanged);
} else {
+ getModel().updateRoute(routeChanged);
validatorIsAdjusting = true;
+ getModel().setCurrentRoute(routeChanged);
+ getModel().setRouteEditBean(routeChanged);
+
getModel().setObservationEditBean(null);
// Reload all observations
@@ -120,43 +103,9 @@
boolean result = isEnabled();
if (!validatorIsAdjusting) {
Route bean = getModel().getRouteEditBean();
- result = bean != null && (bean.isDeleted() || isRouteValid(bean));
+ result = bean != null
+ && Routes.isValid(bean, getRouteValidator(), getObservationValidator());
}
return result;
}
-
- protected boolean isRouteValid(Route bean) {
- boolean result = isValid(bean)
- && isDifferentFromPreviousRoute(bean)
- && isObservationsValid(bean);
- return result;
- }
-
- protected boolean isDifferentFromPreviousRoute(Route bean) {
- boolean result;
- Route previousRoute = Routes.findPrevious(getModel().getRoutes(), bean);
- result = previousRoute == null || !Routes.equal(bean, previousRoute);
- return result;
- }
-
- protected boolean isObservationsValid(Route bean) {
-
- Iterable<Observation> observations =
- Observations.filterInRoute(
- getModel().getObservations(),
- bean,
- getModel().getRoutes(),
- true
- );
-
- // All observations must be deleted or valid
- boolean result = Iterables.all(observations, new Predicate<Observation>() {
-
- @Override
- public boolean apply(Observation input) {
- return input.isDeleted() || isValid(input);
- }
- });
- return result;
- }
}
Added: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidTransectAction.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidTransectAction.java (rev 0)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidTransectAction.java 2012-09-01 09:51:22 UTC (rev 504)
@@ -0,0 +1,134 @@
+package fr.ulr.sammoa.ui.swing.action;
+/*
+ * #%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 fr.ulr.sammoa.application.FlightService;
+import fr.ulr.sammoa.persistence.Observation;
+import fr.ulr.sammoa.persistence.Route;
+import fr.ulr.sammoa.persistence.TransectFlight;
+import fr.ulr.sammoa.persistence.TransectFlights;
+import fr.ulr.sammoa.ui.swing.SammoaUIContext;
+import fr.ulr.sammoa.ui.swing.flight.FlightUIModel;
+import fr.ulr.sammoa.ui.swing.flight.TransectFlightModel;
+import jaxx.runtime.JAXXContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.swing.Action;
+import java.awt.event.ActionEvent;
+
+import static org.nuiton.i18n.I18n._;
+
+/**
+ * Created: 23/08/12
+ *
+ * @author fdesbois <florian.desbois(a)codelutin.com>
+ */
+public class ValidTransectAction extends ValidAction {
+
+ /** Logger. */
+ private static final Logger logger = LoggerFactory.getLogger(ValidTransectAction.class);
+
+ private static final long serialVersionUID = 1L;
+
+ protected boolean validatorIsAdjusting;
+
+ public ValidTransectAction(JAXXContext context) {
+ super(_("sammoa.action.validTransect"), context);
+ putValue(Action.SHORT_DESCRIPTION, _("sammoa.action.validTransect.tip"));
+ bindValidableModel(FlightUIModel.PROPERTY_OBSERVATION_EDIT_BEAN, Observation.class);
+ bindValidableModel(FlightUIModel.PROPERTY_ROUTE_EDIT_BEAN, Route.class);
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+
+ Route route = getModel().getRouteEditBean();
+
+ if (route != null && route.getTransectFlight() != null) {
+
+ TransectFlight transectFlight = route.getTransectFlight();
+
+ int index = TransectFlightModel.indexOfTransectFlight(
+ getModel().getTransectFlights(), transectFlight);
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("Validation for transectFlight {} : {}",
+ index,
+ transectFlight.getTransect().getName()
+ );
+ }
+
+ TransectFlight transectFlightChanged =
+ getValidationService().validateTransectFlight(getModel().getFlight(), transectFlight);
+
+ if (transectFlightChanged.isDeleted()) {
+ getModel().removeTransectFlight(index);
+
+ } else {
+ getModel().updateTransectFlight(transectFlightChanged);
+
+ validatorIsAdjusting = true;
+
+ getModel().setRouteEditBean(null);
+
+ // Reload all routes
+ FlightService service =
+ context.getContextValue(SammoaUIContext.class).getService(FlightService.class);
+ getModel().clearRoute();
+ getModel().addAllRoute(service.getRoutes(getModel().getFlight()));
+
+ // Keep the route selected
+ if (!route.isDeleted()) {
+ getModel().setCurrentRoute(route);
+ getModel().setRouteEditBean(route);
+ }
+
+ getModel().setObservationEditBean(null);
+
+ // Reload all observations
+ getModel().clearObservation();
+ getModel().addAllObservation(service.getObservations(getModel().getFlight()));
+
+ validatorIsAdjusting = false;
+ }
+ }
+ }
+
+ @Override
+ protected boolean checkEnabled() {
+ boolean result = isEnabled();
+ if (!validatorIsAdjusting) {
+ Route route = getModel().getRouteEditBean();
+ if (route != null) {
+ TransectFlight bean = route.getTransectFlight();
+ result = bean != null
+ && TransectFlights.isValid(bean,
+ getRouteValidator(),
+ getObservationValidator());
+ }
+ }
+ return result;
+ }
+}
Property changes on: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidTransectAction.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/flight/FlightBar.css
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightBar.css 2012-09-01 09:51:00 UTC (rev 503)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightBar.css 2012-09-01 09:51:22 UTC (rev 504)
@@ -72,6 +72,10 @@
: "")};
}
+#lblObservation {
+ text: {flightUIModel.getCurrentRoute().getTransectFlight().getTransect().getName()};
+}
+
#cbPanel {
background: {model.getEffortPanelColor()};
}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightBar.jaxx
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightBar.jaxx 2012-09-01 09:51:00 UTC (rev 503)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightBar.jaxx 2012-09-01 09:51:22 UTC (rev 504)
@@ -64,6 +64,7 @@
layout='{new BoxLayout(validButtonPanel, BoxLayout.X_AXIS)}'>
<JButton id='validRouteButton'/>
<JButton id='validObservationButton'/>
+ <JButton id='validTransectButton'/>
</JPanel>
</cell>
</row>
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightBarHandler.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightBarHandler.java 2012-09-01 09:51:00 UTC (rev 503)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightBarHandler.java 2012-09-01 09:51:22 UTC (rev 504)
@@ -73,6 +73,7 @@
ui.getStopAudioButton().putClientProperty("actionName", "stopAudio");
ui.getValidObservationButton().putClientProperty("actionName", "validObservation");
ui.getValidRouteButton().putClientProperty("actionName", "validRoute");
+ ui.getValidTransectButton().putClientProperty("actionName", "validTransect");
} else {
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-09-01 09:51:00 UTC (rev 503)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java 2012-09-01 09:51:22 UTC (rev 504)
@@ -102,6 +102,7 @@
import fr.ulr.sammoa.ui.swing.action.StopAudioAction;
import fr.ulr.sammoa.ui.swing.action.ValidObservationAction;
import fr.ulr.sammoa.ui.swing.action.ValidRouteAction;
+import fr.ulr.sammoa.ui.swing.action.ValidTransectAction;
import fr.ulr.sammoa.ui.swing.flight.layer.BaseGeoPointLayer;
import fr.ulr.sammoa.ui.swing.flight.layer.LineGeoPointLayer;
import fr.ulr.sammoa.ui.swing.flight.layer.SimpleGeoPointLayer;
@@ -415,6 +416,53 @@
TransectTableModel tableModel = ui.getTransectTableModel();
+// if (getModel().isValidationMode()) {
+//
+// table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+//
+// SammoaUtil.addTableSelectionListener(
+// table, new SelectionModelAdapter<TransectFlightModel>() {
+//
+// @Override
+// public List<TransectFlightModel> getElements() {
+// return getModel().getTransectFlights();
+// }
+//
+// @Override
+// public void setSelectedElement(TransectFlightModel element) {
+// getModel().setTransectFlightEditBean(element);
+// }
+// });
+//
+// getModel().addPropertyChangeListener(
+// FlightUIModel.PROPERTY_ROUTE_EDIT_BEAN, new PropertyChangeListener() {
+//
+// @Override
+// public void propertyChange(PropertyChangeEvent evt) {
+//
+// int index = -1;
+//
+// if (evt.getNewValue() != null) {
+//
+// Route route = (Route) evt.getNewValue();
+//
+// index = TransectFlightModel.indexOfTransectFlight(
+// getModel().getTransectFlights(), route.getTransectFlight());
+// }
+//
+// // Unselect all
+// if (index == -1) {
+//
+//// SammoaUtil.unselectAll(ui.getTransectTable());
+//
+// // Select the corresponding transectFlight
+// } else {
+// ui.getTransectFlightSelectionModel().setSelectionInterval(index, index);
+// }
+// }
+// });
+// }
+
NumberCellEditor<Integer> numberCellEditor = JAXXWidgetUtil.newNumberTableCellEditor(Integer.class, false);
table.setDefaultEditor(Integer.class, numberCellEditor);
table.setDefaultEditor(int.class, numberCellEditor);
@@ -491,6 +539,10 @@
column.setCellRenderer(editorRenderer);
}
+ table.setSortable(false);
+ table.setSelectionBackground(null);
+ table.setSelectionForeground(Color.BLACK);
+
table.addHighlighter(SammoaUtil.newBackgroundColorHighlighter(
new CurrentTransectHighlightPredicate(tableModel),
SammoaColors.CURRENT_TRANSECT_ROW_COLOR)
@@ -507,10 +559,6 @@
new ValidRowHighlightPredicate(getModel().getTransectFlights()),
SammoaColors.VALID_ROW_COLOR)
);
-
- table.setSortable(false);
- table.setSelectionBackground(null);
- table.setSelectionForeground(Color.BLACK);
}
startTime = timeLog.log(startTime, "afterInitUI", "decoration done (editor/renderer)");
@@ -746,6 +794,7 @@
if (getModel().isValidationMode()) {
putAction("validObservation", new ValidObservationAction(ui));
putAction("validRoute", new ValidRouteAction(ui));
+ putAction("validTransect", new ValidTransectAction(ui));
putAction("startAudio", new StartAudioAction(ui));
putAction("stopAudio", new StopAudioAction(ui));
}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIModel.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIModel.java 2012-09-01 09:51:00 UTC (rev 503)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIModel.java 2012-09-01 09:51:22 UTC (rev 504)
@@ -24,6 +24,7 @@
*/
package fr.ulr.sammoa.ui.swing.flight;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import fr.ulr.sammoa.application.flightController.FlightState;
import fr.ulr.sammoa.persistence.Flight;
@@ -69,6 +70,8 @@
public static final String PROPERTY_ROUTE_EDIT_BEAN = "routeEditBean";
+// public static final String PROPERTY_TRANSECT_FLIGHT_EDIT_BEAN = "transectFlightEditBean";
+
public static final String PROPERTY_FLIGHT_OBSERVER_FOR_POSITIONS = "flightObserverForPositions";
public static final String PROPERTY_MAP_FOLLOW = "mapFollow";
@@ -120,6 +123,8 @@
*/
protected Route routeEditBean;
+// protected TransectFlightModel transectFlightEditBean;
+
/**
* La liste des observateurs du vol, sans les pilotes avec l'observateur null
*
@@ -164,7 +169,7 @@
}
public void setObservers(List<Observer> observers) {
- List<Observer> oldValue = Lists.newArrayList(getObservers());
+ List<Observer> oldValue = ImmutableList.copyOf(getObservers());
this.observers = observers;
firePropertyChange(PROPERTY_OBSERVERS, oldValue, observers);
}
@@ -230,27 +235,33 @@
}
public void addObservation(Observation observation) {
- List<Observation> oldValue = Lists.newArrayList(getObservations());
+ List<Observation> oldValue = ImmutableList.copyOf(getObservations());
int index = sizeObservations();
getObservations().add(observation);
fireIndexedPropertyChange(PROPERTY_OBSERVATIONS, index, oldValue, getObservations());
}
public void removeObservation(Observation observation) {
- List<Observation> oldValue = Lists.newArrayList(getObservations());
+ List<Observation> oldValue = ImmutableList.copyOf(getObservations());
int index = indexOfObservations(observation);
getObservations().remove(index);
fireIndexedPropertyChange(PROPERTY_OBSERVATIONS, index, oldValue, getObservations());
}
+ public void updateObservation(Observation observation) {
+ int index = indexOfObservations(observation);
+ getObservations().set(index, observation);
+ fireIndexedPropertyChange(PROPERTY_OBSERVATIONS, index, getObservations(), null);
+ }
+
public void clearObservation() {
- List<Observation> oldValue = Lists.newArrayList(getObservations());
+ List<Observation> oldValue = ImmutableList.copyOf(getObservations());
getObservations().clear();
firePropertyChange(PROPERTY_OBSERVATIONS, oldValue, getObservations());
}
public void addAllObservation(Collection<Observation> observations) {
- List<Observation> oldValue = Lists.newArrayList(getObservations());
+ List<Observation> oldValue = ImmutableList.copyOf(getObservations());
getObservations().addAll(observations);
firePropertyChange(PROPERTY_OBSERVATIONS, oldValue, getObservations());
}
@@ -281,17 +292,35 @@
}
public void addRoute(int index, Route route) {
- List<Route> oldValue = Lists.newArrayList(getRoutes());
+ List<Route> oldValue = ImmutableList.copyOf(getRoutes());
getRoutes().add(index, route);
fireIndexedPropertyChange(PROPERTY_ROUTES, index, oldValue, getRoutes());
}
public void removeRoute(Route route) {
- List<Route> oldValue = Lists.newArrayList(getRoutes());
+ List<Route> oldValue = ImmutableList.copyOf(getRoutes());
int index = getRoutes().indexOf(route);
getRoutes().remove(index);
fireIndexedPropertyChange(PROPERTY_ROUTES, index, oldValue, getRoutes());
}
+
+ public void updateRoute(Route route) {
+ int index = getRoutes().indexOf(route);
+ getRoutes().set(index, route);
+ fireIndexedPropertyChange(PROPERTY_ROUTES, index, getRoutes(), null);
+ }
+
+ public void clearRoute() {
+ List<Route> oldValue = ImmutableList.copyOf(getRoutes());
+ getRoutes().clear();
+ firePropertyChange(PROPERTY_ROUTES, oldValue, getRoutes());
+ }
+
+ public void addAllRoute(Collection<Route> routes) {
+ List<Route> oldValue = ImmutableList.copyOf(getRoutes());
+ getRoutes().addAll(routes);
+ firePropertyChange(PROPERTY_ROUTES, oldValue, getRoutes());
+ }
//
// public SwingValidatorMessageTableModel getValidatorTableModel() {
// return validatorTableModel;
@@ -322,6 +351,16 @@
this.routeEditBean = routeEditBean;
firePropertyChange(PROPERTY_ROUTE_EDIT_BEAN, oldRouteEditBean, routeEditBean);
}
+//
+// public TransectFlightModel getTransectFlightEditBean() {
+// return transectFlightEditBean;
+// }
+//
+// public void setTransectFlightEditBean(TransectFlightModel transectFlightEditBean) {
+// TransectFlightModel oldValue = this.transectFlightEditBean;
+// this.transectFlightEditBean = transectFlightEditBean;
+// firePropertyChange(PROPERTY_TRANSECT_FLIGHT_EDIT_BEAN, oldValue, transectFlightEditBean);
+// }
public List<Observer> getFlightObserverForPositions() {
if (flightObserverForPositions == null) {
@@ -331,7 +370,7 @@
}
public void setFlightObserverForPositions(List<Observer> flightObserverForPositions) {
- List<Observer> oldValue = Lists.newArrayList(getFlightObserverForPositions());
+ List<Observer> oldValue = ImmutableList.copyOf(getFlightObserverForPositions());
this.flightObserverForPositions = flightObserverForPositions;
firePropertyChange(PROPERTY_FLIGHT_OBSERVER_FOR_POSITIONS, oldValue, flightObserverForPositions);
}
@@ -381,7 +420,7 @@
}
public void setStrates(List<StrateModel> strates) {
- List<StrateModel> oldValue = Lists.newArrayList(getStrates());
+ List<StrateModel> oldValue = ImmutableList.copyOf(getStrates());
this.strates = strates;
firePropertyChange(PROPERTY_STRATES, oldValue, strates);
}
@@ -410,11 +449,28 @@
}
public void setTransectFlights(List<TransectFlightModel> transectFlights) {
- List<TransectFlightModel> oldValue = Lists.newArrayList(getTransectFlights());
+ List<TransectFlightModel> oldValue = ImmutableList.copyOf(getTransectFlights());
this.transectFlights = transectFlights;
firePropertyChange(PROPERTY_TRANSECT_FLIGHTS, oldValue, transectFlights);
}
+ public void removeTransectFlight(int index) {
+ List<TransectFlightModel> oldValue = ImmutableList.copyOf(getTransectFlights());
+ getTransectFlights().remove(index);
+ fireIndexedPropertyChange(PROPERTY_TRANSECT_FLIGHTS, index, oldValue, getTransectFlights());
+ }
+
+ public void updateTransectFlight(TransectFlight transectFlight) {
+ int index = TransectFlightModel.indexOfTransectFlight(
+ getTransectFlights(), transectFlight);
+ getTransectFlights().get(index).setSource(transectFlight);
+ fireIndexedPropertyChange(PROPERTY_TRANSECT_FLIGHTS, index, getTransectFlights(), null);
+
+ // Update instance in flight list
+ int flightIndex = getFlight().getTransectFlight().indexOf(transectFlight);
+ flight.getTransectFlight().set(flightIndex, transectFlight);
+ }
+
public List<GeoPoint> getGeoPoints() {
if (geoPoints == null) {
geoPoints = Lists.newArrayList();
@@ -423,7 +479,7 @@
}
public void setGeoPoints(List<GeoPoint> geoPoints) {
- List<GeoPoint> oldValue = Lists.newArrayList(getGeoPoints());
+ List<GeoPoint> oldValue = ImmutableList.copyOf(getGeoPoints());
this.geoPoints = geoPoints;
firePropertyChange(PROPERTY_GEO_POINTS, oldValue, geoPoints);
}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/TransectFlightModel.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/TransectFlightModel.java 2012-09-01 09:51:00 UTC (rev 503)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/TransectFlightModel.java 2012-09-01 09:51:22 UTC (rev 504)
@@ -27,13 +27,12 @@
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
-import fr.ulr.sammoa.persistence.Deletable;
import fr.ulr.sammoa.persistence.Flight;
import fr.ulr.sammoa.persistence.Observer;
import fr.ulr.sammoa.persistence.ObserverPosition;
import fr.ulr.sammoa.persistence.Position;
import fr.ulr.sammoa.persistence.TransectFlight;
-import fr.ulr.sammoa.persistence.Validatable;
+import fr.ulr.sammoa.persistence.Validable;
import org.jdesktop.beans.AbstractSerializableBean;
/**
@@ -41,7 +40,7 @@
*
* @author fdesbois <desbois(a)codelutin.com>
*/
-public class TransectFlightModel extends AbstractSerializableBean implements Deletable, Validatable {
+public class TransectFlightModel extends AbstractSerializableBean implements Validable {
private static final long serialVersionUID = 1L;
@@ -122,7 +121,6 @@
index = getFlight().getTransectFlight().size() - 1;
}
-
getFlight().getTransectFlight().remove(getSource());
// Use add on Flight to fire change
@@ -169,11 +167,13 @@
return flightModel.getFlight();
}
- public static Predicate<TransectFlightModel> withTransectFlight(TransectFlight transectFlight) {
- return new WithTransectFlightPredicate(transectFlight);
+ public static int indexOfTransectFlight(Iterable<TransectFlightModel> transectFlightModels,
+ TransectFlight transectFlight) {
+ return Iterables.indexOf(
+ transectFlightModels, new WithTransectFlightPredicate(transectFlight));
}
- protected static class WithTransectFlightPredicate implements Predicate<TransectFlightModel> {
+ private static class WithTransectFlightPredicate implements Predicate<TransectFlightModel> {
protected TransectFlight transectFlight;
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/TransectTableModel.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/TransectTableModel.java 2012-09-01 09:51:00 UTC (rev 503)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/TransectTableModel.java 2012-09-01 09:51:22 UTC (rev 504)
@@ -24,7 +24,6 @@
*/
package fr.ulr.sammoa.ui.swing.flight;
-import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import fr.ulr.sammoa.persistence.Flight;
import fr.ulr.sammoa.persistence.Observer;
@@ -35,7 +34,7 @@
import fr.ulr.sammoa.persistence.TransectFlight;
import fr.ulr.sammoa.ui.swing.util.SammoaUtil;
-import javax.swing.*;
+import javax.swing.SwingUtilities;
import javax.swing.table.AbstractTableModel;
import java.util.List;
@@ -78,10 +77,8 @@
}
public int getRowIndex(final TransectFlight transectFlight) {
- int result = Iterables.indexOf(
- getTransectFlights(),
- TransectFlightModel.withTransectFlight(transectFlight)
- );
+ int result = TransectFlightModel.indexOfTransectFlight(
+ getTransectFlights(), transectFlight);
return result;
}
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-09-01 09:51:00 UTC (rev 503)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/EffortPanelHandler.java 2012-09-01 09:51:22 UTC (rev 504)
@@ -56,6 +56,7 @@
import fr.ulr.sammoa.ui.swing.util.ButtonActionTableCellEditorRenderer;
import fr.ulr.sammoa.ui.swing.util.DeletedRowHighlightPredicate;
import fr.ulr.sammoa.ui.swing.util.SammoaUtil;
+import fr.ulr.sammoa.ui.swing.util.SelectionModelAdapter;
import fr.ulr.sammoa.ui.swing.util.TableDataChangeListener;
import fr.ulr.sammoa.ui.swing.util.TextCellEditor;
import fr.ulr.sammoa.ui.swing.util.TimeCellEditor;
@@ -86,10 +87,7 @@
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListCellRenderer;
-import javax.swing.ListSelectionModel;
import javax.swing.border.LineBorder;
-import javax.swing.event.ListSelectionEvent;
-import javax.swing.event.ListSelectionListener;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;
@@ -122,10 +120,10 @@
protected static final Color DEVICE_ERROR_BACKGROUND_COLOR = Color.RED;
public static final String ROUTE_VALIDATOR_CONTEXT_VALUE =
- "routeimplValidator";
+ "routeValidator";
public static final String OBSERVATION_VALIDATOR_CONTEXT_VALUE =
- "observationimplValidator";
+ "observationValidator";
protected boolean comboIsAdjusting;
@@ -291,7 +289,7 @@
public void initRouteTable() {
- FlightUIModel flightUIModel = ui.getFlightUIModel();
+ final FlightUIModel flightUIModel = ui.getFlightUIModel();
JXTable table = ui.getRouteTable();
RouteTableModel tableModel = ui.getRouteTableModel();
@@ -336,52 +334,16 @@
n_("sammoa.observations.routeTable.column.deleted.tip")
);
- init(table, new ListSelectionListener() {
+ init(table, new SelectionModelAdapter<Route>() {
@Override
- public void valueChanged(ListSelectionEvent e) {
+ public List<Route> getElements() {
+ return ui.getFlightUIModel().getRoutes();
+ }
- if (!e.getValueIsAdjusting()) {
-
- ListSelectionModel listSelectionModel =
- (ListSelectionModel) e.getSource();
- int firstIndex = e.getFirstIndex();
- int lastIndex = e.getLastIndex();
- Integer newSelectedRow = null;
-
- if (listSelectionModel.isSelectionEmpty()) {
-
- // no selection
- } else if (listSelectionModel.isSelectedIndex(firstIndex)) {
-
- // use first index
- newSelectedRow = firstIndex;
- } else if (listSelectionModel.isSelectedIndex(lastIndex)) {
-
- // use last index
- newSelectedRow = lastIndex;
- }
- FlightUIModel flightUIModel = ui.getFlightUIModel();
- List<Route> routes = flightUIModel.getRoutes();
- Route route = null;
-
- if (newSelectedRow != null &&
- newSelectedRow < routes.size()) {
- route = routes.get(newSelectedRow);
-
- if (logger.isInfoEnabled()) {
- logger.info("Select route from index {}", newSelectedRow);
- }
-
- } else {
- if (logger.isInfoEnabled()) {
- logger.info("No route selected");
- }
- }
-
- // set new route in model to validate
- flightUIModel.setRouteEditBean(route);
- }
+ @Override
+ public void setSelectedElement(Route element) {
+ ui.getFlightUIModel().setRouteEditBean(element);
}
});
@@ -402,6 +364,9 @@
public void propertyChange(PropertyChangeEvent evt) {
Route route = (Route) evt.getNewValue();
getParentUI().getHandler().getFlightController().setCurrentRoute(route);
+
+ // no unselect but ensure valid button (a select will cause a loop)
+ flightUIModel.setObservationEditBean(null);
}
}
);
@@ -500,53 +465,16 @@
n_("sammoa.observations.observationTable.column.circleback.tip")
);
- init(table, new ListSelectionListener() {
+ init(table, new SelectionModelAdapter<Observation>() {
@Override
- public void valueChanged(ListSelectionEvent e) {
+ public List<Observation> getElements() {
+ return ui.getFlightUIModel().getObservations();
+ }
- FlightUIModel flightUIModel = ui.getFlightUIModel();
-
- if (!e.getValueIsAdjusting()) {
-
- ListSelectionModel listSelectionModel =
- (ListSelectionModel) e.getSource();
- int firstIndex = e.getFirstIndex();
- int lastIndex = e.getLastIndex();
- Integer newSelectedRow = null;
-
- if (listSelectionModel.isSelectionEmpty()) {
-
- // no selection
- } else if (listSelectionModel.isSelectedIndex(firstIndex)) {
-
- // use first index
- newSelectedRow = firstIndex;
- } else if (listSelectionModel.isSelectedIndex(lastIndex)) {
-
- // use last index
- newSelectedRow = lastIndex;
- }
- List<Observation> observations = flightUIModel.getObservations();
- Observation observation = null;
-
- if (newSelectedRow != null &&
- newSelectedRow < observations.size()) {
- observation = observations.get(newSelectedRow);
-
- if (logger.isInfoEnabled()) {
- logger.info("Select observation from index {}", newSelectedRow);
- }
-
- } else {
- if (logger.isInfoEnabled()) {
- logger.info("No observation selected");
- }
- }
-
- // set new observation in model to validate
- flightUIModel.setObservationEditBean(observation);
- }
+ @Override
+ public void setSelectedElement(Observation element) {
+ ui.getFlightUIModel().setObservationEditBean(element);
}
});
@@ -622,6 +550,9 @@
selectRouteByObservation(newValue);
}
+// else {
+// SammoaUtil.unselectAll(ui.getObservationTable());
+// }
}
});
@@ -739,8 +670,8 @@
}
}
- public void init(final JXTable table,
- ListSelectionListener selectionListener) {
+ public <T> void init(final JXTable table,
+ SelectionModelAdapter<T> selectionModelAdapter) {
final Action moveToNextEditableCell = new MoveToNextEditableCellAction(table);
final Action moveToPreviousEditableCell = new MoveToPreviousEditableCellAction(table);
@@ -824,7 +755,7 @@
table.setDefaultEditor(Date.class, new TimeCellEditor(datePicker));
}
- table.getSelectionModel().addListSelectionListener(selectionListener);
+ SammoaUtil.addTableSelectionListener(table, selectionModelAdapter);
SwingUtil.scrollToTableSelection(table);
}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/DeletedRowHighlightPredicate.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/DeletedRowHighlightPredicate.java 2012-09-01 09:51:00 UTC (rev 503)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/DeletedRowHighlightPredicate.java 2012-09-01 09:51:22 UTC (rev 504)
@@ -23,7 +23,7 @@
* #L%
*/
-import fr.ulr.sammoa.persistence.Deletable;
+import fr.ulr.sammoa.persistence.Validable;
import java.util.List;
@@ -34,9 +34,9 @@
*/
public class DeletedRowHighlightPredicate extends AbstractRowHighlightPredicate {
- protected List<? extends Deletable> model;
+ protected List<? extends Validable> model;
- public DeletedRowHighlightPredicate(List<? extends Deletable> model) {
+ public DeletedRowHighlightPredicate(List<? extends Validable> model) {
this.model = model;
}
@@ -47,7 +47,7 @@
}
@Override
- protected Deletable getValueAt(int rowIndex) {
+ protected Validable getValueAt(int rowIndex) {
return model.get(rowIndex);
}
}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/SammoaUtil.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/SammoaUtil.java 2012-09-01 09:51:00 UTC (rev 503)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/SammoaUtil.java 2012-09-01 09:51:22 UTC (rev 504)
@@ -67,6 +67,20 @@
// never instanciate util class
}
+ public static void unselectAll(JTable table) {
+ int size = table.getRowCount();
+ if (size > 0) {
+ table.removeRowSelectionInterval(0, size - 1);
+ }
+ }
+
+ public static <T> TableSelectionListener<T> addTableSelectionListener(JTable table,
+ SelectionModelAdapter<T> selectionModelAdapter) {
+ TableSelectionListener<T> result = new TableSelectionListener<T>(selectionModelAdapter);
+ table.getSelectionModel().addListSelectionListener(result);
+ return result;
+ }
+
public static Highlighter newBackgroundColorHighlighter(HighlightPredicate predicate, Color color) {
return new SammoaColorHighlighter(predicate, color, false);
}
Added: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/SelectionModelAdapter.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/SelectionModelAdapter.java (rev 0)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/SelectionModelAdapter.java 2012-09-01 09:51:22 UTC (rev 504)
@@ -0,0 +1,17 @@
+package fr.ulr.sammoa.ui.swing.util;
+
+import java.util.List;
+
+/**
+ * Created: 31/08/12
+ *
+ * @author fdesbois <florian.desbois(a)codelutin.com>
+ * @see TableSelectionListener
+ */
+public interface SelectionModelAdapter<T> {
+
+ List<T> getElements();
+
+ void setSelectedElement(T element);
+
+}
Property changes on: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/SelectionModelAdapter.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/util/TableDataChangeListener.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TableDataChangeListener.java 2012-09-01 09:51:00 UTC (rev 503)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TableDataChangeListener.java 2012-09-01 09:51:22 UTC (rev 504)
@@ -65,6 +65,25 @@
if (evt.getOldValue() == null) {
tableModel.fireTableDataChanged();
+ // UPDATE : we use null newValue to fire update
+ } else if (evt.getNewValue() == null) {
+
+ int oldSize = ((Collection) evt.getOldValue()).size();
+
+ int rowIndex;
+ if (evt instanceof IndexedPropertyChangeEvent) {
+ rowIndex = ((IndexedPropertyChangeEvent) evt).getIndex();
+ } else {
+ rowIndex = -1;
+ }
+
+ if (rowIndex == -1) {
+ tableModel.fireTableRowsUpdated(0, oldSize - 1);
+
+ } else {
+ tableModel.fireTableRowsUpdated(rowIndex, rowIndex);
+ }
+
} else {
int oldSize = ((Collection) evt.getOldValue()).size();
Added: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TableSelectionListener.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TableSelectionListener.java (rev 0)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TableSelectionListener.java 2012-09-01 09:51:22 UTC (rev 504)
@@ -0,0 +1,71 @@
+package fr.ulr.sammoa.ui.swing.util;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.swing.ListSelectionModel;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+import java.util.List;
+
+/**
+ * Created: 31/08/12
+ *
+ * @author fdesbois <florian.desbois(a)codelutin.com>
+ */
+public class TableSelectionListener<T> implements ListSelectionListener {
+
+ private static final Logger logger = LoggerFactory.getLogger(TableSelectionListener.class);
+
+ protected SelectionModelAdapter<T> selectionModelAdapter;
+
+ public TableSelectionListener(SelectionModelAdapter<T> selectionModelAdapter) {
+ this.selectionModelAdapter = selectionModelAdapter;
+ }
+
+ @Override
+ public void valueChanged(ListSelectionEvent e) {
+
+ if (!e.getValueIsAdjusting()) {
+
+ ListSelectionModel listSelectionModel =
+ (ListSelectionModel) e.getSource();
+ int firstIndex = e.getFirstIndex();
+ int lastIndex = e.getLastIndex();
+ Integer newSelectedRow = null;
+
+ if (listSelectionModel.isSelectionEmpty()) {
+
+ // no selection
+ } else if (listSelectionModel.isSelectedIndex(firstIndex)) {
+
+ // use first index
+ newSelectedRow = firstIndex;
+ } else if (listSelectionModel.isSelectedIndex(lastIndex)) {
+
+ // use last index
+ newSelectedRow = lastIndex;
+ }
+ List<T> elements = selectionModelAdapter.getElements();
+ T element = null;
+
+ if (newSelectedRow != null &&
+ newSelectedRow < elements.size()) {
+ element = elements.get(newSelectedRow);
+
+ if (logger.isInfoEnabled()) {
+ logger.info("Select {} from index {}",
+ element.getClass().getSimpleName(), newSelectedRow);
+ }
+
+ } else {
+ if (logger.isInfoEnabled()) {
+ logger.info("No element selected");
+ }
+ }
+
+ // set new element in adapter
+ selectionModelAdapter.setSelectedElement(element);
+ }
+ }
+}
Property changes on: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TableSelectionListener.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/util/ValidRowHighlightPredicate.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/ValidRowHighlightPredicate.java 2012-09-01 09:51:00 UTC (rev 503)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/ValidRowHighlightPredicate.java 2012-09-01 09:51:22 UTC (rev 504)
@@ -23,7 +23,7 @@
* #L%
*/
-import fr.ulr.sammoa.persistence.Validatable;
+import fr.ulr.sammoa.persistence.Validable;
import java.util.List;
@@ -34,9 +34,9 @@
*/
public class ValidRowHighlightPredicate extends AbstractRowHighlightPredicate {
- protected List<? extends Validatable> model;
+ protected List<? extends Validable> model;
- public ValidRowHighlightPredicate(List<? extends Validatable> model) {
+ public ValidRowHighlightPredicate(List<? extends Validable> model) {
this.model = model;
}
@@ -47,7 +47,7 @@
}
@Override
- protected Validatable getValueAt(int rowIndex) {
+ protected Validable getValueAt(int rowIndex) {
return model.get(rowIndex);
}
}
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-09-01 09:51:00 UTC (rev 503)
+++ trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2012-09-01 09:51:22 UTC (rev 504)
@@ -52,6 +52,8 @@
sammoa.action.validObservation.tip=Validate the selected observation
sammoa.action.validRoute=Route
sammoa.action.validRoute.tip=Validate the selected route and all its observations
+sammoa.action.validTransect=Transect
+sammoa.action.validTransect.tip=Validate the selected transect and all its routes and observations
sammoa.action.validation=Validation
sammoa.config.category.applications=Application
sammoa.config.category.applications.description=Application
1
0
r503 - in trunk: sammoa-application/src/main/java/fr/ulr/sammoa/application sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence
by fdesbois@users.forge.codelutin.com 01 Sep '12
by fdesbois@users.forge.codelutin.com 01 Sep '12
01 Sep '12
Author: fdesbois
Date: 2012-09-01 11:51:00 +0200 (Sat, 01 Sep 2012)
New Revision: 503
Url: http://forge.codelutin.com/repositories/revision/sammoa/503
Log:
fixes #1429 : resolve issue on delete flight + improve AutoSave when creation error
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/AutoSaveListener.java
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-09-01 09:50:23 UTC (rev 502)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java 2012-09-01 09:51:00 UTC (rev 503)
@@ -362,9 +362,6 @@
Set<ObserverPosition> positions = Sets.newHashSet();
- // keep observerPositions to delete from transectFlights
- positions.addAll(TransectFlights.toObserverPositions(flight.getTransectFlight()));
-
// delete routes
List<Route> routes = getRoutes(tx, flight);
// keep observerPositions to delete from routes
@@ -374,18 +371,19 @@
// delete observations
List<Observation> observations = getObservations(tx, flight);
- // keep observerPositions to delete
-// positions.addAll(Observations.toObserverPositions(observations));
ObservationDAO observationDAO = SammoaDAOHelper.getObservationDAO(tx);
observationDAO.deleteAll(observations);
- // delete observationPositions
- ObserverPositionDAO observerPositionDAO = SammoaDAOHelper.getObserverPositionDAO(tx);
- observerPositionDAO.deleteAll(positions);
+ // keep observerPositions to delete from transectFlights
+ positions.addAll(TransectFlights.toObserverPositions(flight.getTransectFlight()));
- // delete flight
+ // delete flight (cascade delete on transectFlights)
dao.delete(flight);
+ // delete observerPositions
+ ObserverPositionDAO observerPositionDAO = SammoaDAOHelper.getObserverPositionDAO(tx);
+ observerPositionDAO.deleteAll(positions);
+
} catch (TopiaException e) {
throw new SammoaTechnicalException(e);
}
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/AutoSaveListener.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/AutoSaveListener.java 2012-09-01 09:50:23 UTC (rev 502)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/AutoSaveListener.java 2012-09-01 09:51:00 UTC (rev 503)
@@ -145,10 +145,14 @@
TopiaContext transaction = persistence.openContext();
try {
- saveEntities(transaction, createdEntities, CREATE_ACTION);
+ Set<TopiaEntity> errorSavedEntities =
+ saveEntities(transaction, createdEntities, CREATE_ACTION);
- saveEntities(transaction, changedEntities, UPDATE_ACTION);
+ changedEntities.addAll(
+ saveEntities(transaction, changedEntities, UPDATE_ACTION));
+ changedEntities.addAll(errorSavedEntities);
+
} finally {
persistence.closeContext(transaction);
}
@@ -174,13 +178,15 @@
* @param transaction TopiaContex used to commit
* @param entities synchronized Set of entities to save
* @param action SaveAction to use
+ * @return a Set of entities in error during save
*/
- protected void saveEntities(TopiaContext transaction,
- Set<TopiaEntity> entities,
- SaveAction action) {
+ protected Set<TopiaEntity> saveEntities(TopiaContext transaction,
+ Set<TopiaEntity> entities,
+ SaveAction action) {
+ Set<TopiaEntity> result;
if (entities.isEmpty()) {
- // do nothing
+ result = Collections.emptySet();
} else {
@@ -199,18 +205,21 @@
transaction.commitTransaction();
+ result = Collections.emptySet();
+
} catch (TopiaException e) {
if (logger.isErrorEnabled()) {
logger.error(String.format("Error during %s", action), e);
}
- entities.addAll(entitiesCopy);
+ result = entitiesCopy;
}
if (logger.isDebugEnabled() && !entitiesCopy.isEmpty()) {
logger.debug(String.format("%s %d entities", action, entitiesCopy.size()));
}
}
+ return result;
}
protected interface SaveAction {
1
0
01 Sep '12
Author: fdesbois
Date: 2012-09-01 11:50:23 +0200 (Sat, 01 Sep 2012)
New Revision: 502
Url: http://forge.codelutin.com/repositories/revision/sammoa/502
Log:
refs #1419 : improve time using Joda-Time. PeriodDates is replaced by Joda-Time Interval class.
Added:
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Dates.java
Modified:
trunk/pom.xml
trunk/sammoa-application/pom.xml
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/FakeGpsHandler.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsHandlerGpsylon.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerValidation.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.java
trunk/sammoa-persistence/pom.xml
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Flights.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2012-09-01 09:50:03 UTC (rev 501)
+++ trunk/pom.xml 2012-09-01 09:50:23 UTC (rev 502)
@@ -122,6 +122,8 @@
<swingXVersion>1.6.4</swingXVersion>
<xworkVersion>2.3.4</xworkVersion>
+ <jodaTimeVersion>2.1</jodaTimeVersion>
+
<slf4jVersion>1.6.6</slf4jVersion>
<logbackVersion>1.0.6</logbackVersion>
@@ -166,6 +168,12 @@
</dependency>
<dependency>
+ <groupId>joda-time</groupId>
+ <artifactId>joda-time</artifactId>
+ <version>${jodaTimeVersion}</version>
+ </dependency>
+
+ <dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guavaVersion}</version>
Modified: trunk/sammoa-application/pom.xml
===================================================================
--- trunk/sammoa-application/pom.xml 2012-09-01 09:50:03 UTC (rev 501)
+++ trunk/sammoa-application/pom.xml 2012-09-01 09:50:23 UTC (rev 502)
@@ -50,6 +50,11 @@
</dependency>
<dependency>
+ <groupId>joda-time</groupId>
+ <artifactId>joda-time</artifactId>
+ </dependency>
+
+ <dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
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-09-01 09:50:03 UTC (rev 501)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java 2012-09-01 09:50:23 UTC (rev 502)
@@ -34,6 +34,7 @@
import fr.ulr.sammoa.application.io.SammoaStorages;
import fr.ulr.sammoa.persistence.AutoSaveListener;
import fr.ulr.sammoa.persistence.Campaign;
+import fr.ulr.sammoa.persistence.Dates;
import fr.ulr.sammoa.persistence.Flight;
import fr.ulr.sammoa.persistence.FlightDAO;
import fr.ulr.sammoa.persistence.Flights;
@@ -61,10 +62,10 @@
import fr.ulr.sammoa.persistence.TransectFlights;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
+import org.joda.time.Interval;
import org.nuiton.topia.TopiaContext;
import org.nuiton.topia.TopiaException;
import org.nuiton.topia.TopiaRuntimeException;
-import org.nuiton.util.PeriodDates;
import org.nuiton.util.TimeLog;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -120,7 +121,7 @@
List<Flight> result = dao.findAllByCampaign(campaign);
- Collections.sort(result, Flights.onDate());
+ Collections.sort(result, Flights.orderByDate());
timeLog.log(start, "getFlights(" + campaign.getCode() + ")");
return result;
@@ -165,7 +166,7 @@
FlightDAO dao = SammoaDAOHelper.getFlightDAO(transaction);
campaignFlights = dao.findAllByCampaign(campaign);
- Collections.sort(campaignFlights, Flights.onDate());
+ Collections.sort(campaignFlights, Flights.orderByDate());
} catch (TopiaException e) {
throw new TopiaRuntimeException(e);
@@ -173,13 +174,12 @@
}
// Filter on period
- final PeriodDates period = new PeriodDates(beginDate, endDate);
+ final Interval interval = Dates.toInterval(beginDate, endDate);
Iterable<Flight> result = Iterables.filter(campaignFlights, new Predicate<Flight>() {
@Override
public boolean apply(Flight input) {
- return input.getBeginDate() != null &&
- period.between(input.getBeginDate());
+ return Dates.inInterval(input.getBeginDate(), interval);
}
});
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/FakeGpsHandler.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/FakeGpsHandler.java 2012-09-01 09:50:03 UTC (rev 501)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/FakeGpsHandler.java 2012-09-01 09:50:23 UTC (rev 502)
@@ -26,10 +26,10 @@
import fr.ulr.sammoa.application.device.DeviceState;
import fr.ulr.sammoa.application.device.DeviceTechnicalException;
+import fr.ulr.sammoa.persistence.Dates;
import fr.ulr.sammoa.persistence.GeoPoint;
import fr.ulr.sammoa.persistence.GeoPointImpl;
import fr.ulr.sammoa.persistence.GeoPoints;
-import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -180,8 +180,7 @@
}
protected Date getDate() {
- Date result = new Date();
- result = DateUtils.setMilliseconds(result, 0);
+ Date result = Dates.newDateWithoutMillis();
return result;
}
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsHandlerGpsylon.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsHandlerGpsylon.java 2012-09-01 09:50:03 UTC (rev 501)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsHandlerGpsylon.java 2012-09-01 09:50:23 UTC (rev 502)
@@ -27,11 +27,11 @@
import fr.ulr.sammoa.application.device.DeviceState;
import fr.ulr.sammoa.application.device.DeviceTechnicalException;
+import fr.ulr.sammoa.persistence.Dates;
import fr.ulr.sammoa.persistence.GeoPoint;
import fr.ulr.sammoa.persistence.GeoPointImpl;
import fr.ulr.sammoa.persistence.GeoPoints;
import gnu.io.CommPortIdentifier;
-import org.apache.commons.lang3.time.DateUtils;
import org.dinopolis.gpstool.gpsinput.GPSDataProcessor;
import org.dinopolis.gpstool.gpsinput.GPSDevice;
import org.dinopolis.gpstool.gpsinput.GPSException;
@@ -260,8 +260,7 @@
protected Date getDate() {
// FIXME-fdesbois-2012-07-02 : ensure time with GPS value and not system timestamp
- Date result = new Date();
- result = DateUtils.setMilliseconds(result, 0);
+ Date result = Dates.newDateWithoutMillis();
return result;
}
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerValidation.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerValidation.java 2012-09-01 09:50:03 UTC (rev 501)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerValidation.java 2012-09-01 09:50:23 UTC (rev 502)
@@ -26,6 +26,7 @@
import com.google.common.base.Preconditions;
import fr.ulr.sammoa.application.device.DeviceManager;
import fr.ulr.sammoa.application.device.audio.AudioReader;
+import fr.ulr.sammoa.persistence.Dates;
import fr.ulr.sammoa.persistence.Flight;
import fr.ulr.sammoa.persistence.GeoPoint;
import fr.ulr.sammoa.persistence.GeoPointImpl;
@@ -34,15 +35,13 @@
import fr.ulr.sammoa.persistence.Routes;
import fr.ulr.sammoa.persistence.SammoaDAOHelper;
import fr.ulr.sammoa.persistence.TransectFlight;
-import org.apache.commons.lang3.time.DateUtils;
+import org.joda.time.DateTime;
import org.nuiton.topia.TopiaContext;
import org.nuiton.topia.TopiaException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
-import java.util.Calendar;
-import java.util.Date;
import java.util.List;
/**
@@ -90,25 +89,24 @@
GeoPoint result;
- Date previousTime = currentRoute.getBeginTime();
+ DateTime previousTime = Dates.toDateTime(currentRoute.getBeginTime());
if (logger.isDebugEnabled()) {
logger.debug(String.format("Get location after previousTime %1$tH:%1$tM:%1$tS.%1$tL",
- previousTime)
+ previousTime.toDate())
);
}
long position = audioReader.getPosition();
- Date newTime;
+ DateTime newTime;
if (position > 0) {
- newTime = DateUtils.addSeconds(previousTime, (int) position);
+ newTime = previousTime.plus(position);
} else {
- newTime = new Date();
- newTime.setTime(previousTime.getTime());
+ newTime = new DateTime(previousTime);
// // Arbitrary add 1 second for the newTime
// newTime = DateUtils.addMilliseconds(previousTime, 1000);
@@ -134,28 +132,37 @@
if (logger.isDebugEnabled()) {
logger.debug(String.format("Get location at newTime %1$tH:%1$tM:%1$tS.%1$tL",
- newTime)
+ newTime.toDate())
);
}
// Retrieve the appropriate location
- GeoPoint location = GeoPoints.getClosestPoint(geoPoints, newTime);
+ GeoPoint location = GeoPoints.getClosestPoint(geoPoints, newTime.toDate());
+ DateTime locationTime = Dates.toDateTime(location.getRecordTime());
// Create a new location if no one is available for the newTime
- if (!location.getRecordTime().equals(newTime)) {
+ if (!locationTime.equals(newTime)) {
result = new GeoPointImpl(location.getLatitude(), location.getLongitude());
result.setSpeed(location.getSpeed());
result.setAltitude(location.getAltitude());
- // Ensure captureDelay of the new recording time
- long locationSeconds = DateUtils.getFragmentInSeconds(location.getRecordTime(), Calendar.MINUTE);
- long newSeconds = DateUtils.getFragmentInSeconds(newTime, Calendar.MINUTE);
- int captureDelay = (int) newSeconds - (int) locationSeconds;
+// // Ensure captureDelay of the new recording time
+// long locationSeconds = DateUtils.getFragmentInSeconds(location.getRecordTime(), Calendar.MINUTE);
+// long newSeconds = DateUtils.getFragmentInSeconds(newTime, Calendar.MINUTE);
+// int captureDelay = (int) newSeconds - (int) locationSeconds;
+// result.setCaptureDelay(captureDelay);
+
+ int captureDelay = Dates
+ .toInterval(locationTime, newTime)
+ .toDuration()
+ .toStandardSeconds()
+ .getSeconds();
+
result.setCaptureDelay(captureDelay);
result.setFlight(flight);
- result.setRecordTime(newTime);
+ result.setRecordTime(newTime.toDate());
SammoaDAOHelper.getGeoPointDAO(tx).create(result);
geoPoints.add(result);
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-09-01 09:50:03 UTC (rev 501)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.java 2012-09-01 09:50:23 UTC (rev 502)
@@ -34,6 +34,7 @@
import fr.ulr.sammoa.application.FlightService;
import fr.ulr.sammoa.application.SammoaServiceSupport;
import fr.ulr.sammoa.persistence.Campaign;
+import fr.ulr.sammoa.persistence.Dates;
import fr.ulr.sammoa.persistence.Flight;
import fr.ulr.sammoa.persistence.GeoPoint;
import fr.ulr.sammoa.persistence.GeoPoints;
@@ -50,14 +51,13 @@
import fr.ulr.sammoa.persistence.Strate;
import fr.ulr.sammoa.persistence.Transect;
import fr.ulr.sammoa.persistence.TransectFlight;
+import org.joda.time.DateTime;
+import org.joda.time.Interval;
import org.nuiton.topia.TopiaContext;
-import org.nuiton.util.PeriodDates;
import org.nuiton.util.TimeLog;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
@@ -76,7 +76,7 @@
private static final TimeLog timeLog = new TimeLog(ExportMapService.class);
- protected final DateFormat timeFormat = new SimpleDateFormat("HHmmss");
+// protected final DateFormat timeFormat = new SimpleDateFormat("HHmmss");
public int exportEffortsMap(ExportMapModel dataModel) {
Preconditions.checkNotNull(dataModel);
@@ -435,39 +435,43 @@
effortGroup = null;
}
- // compute route period
- Date beginTime = new Date(route.getBeginTime().getTime());
+ // compute route time interval
+ DateTime beginTime = Dates.toDateTime(route.getBeginTime());
- Date routeEndTime;
+ DateTime endTime;
if (nextRouteIndex < nbRoutes) {
// use next route begin time
Route nextRoute = routes.get(nextRouteIndex);
- routeEndTime = nextRoute.getBeginTime();
+ endTime = Dates.toDateTime(nextRoute.getBeginTime());
} else {
// use flight end date
- routeEndTime = flight.getEndDate();
+ endTime = Dates.toDateTime(flight.getEndDate());
}
- if (routeEndTime != null) {
- routeEndTime = new Date(routeEndTime.getTime());
- Preconditions.checkState(routeEndTime.after(beginTime),
- String.format("Route debut de route %s - fin de route %s", beginTime, routeEndTime));
+
+ if (endTime.equals(beginTime)) {
+
+ // ignore this route, we will use the next one
+ continue;
}
- PeriodDates routePeriod =
- new PeriodDates(beginTime, routeEndTime);
+ Preconditions.checkState(endTime.isAfter(beginTime),
+ String.format("Route debut de route %s - fin de route %s", beginTime, endTime));
+ Interval routeInterval =
+ Dates.toInterval(beginTime, endTime);
+
// Get observations for this route
List<Observation> routeObservations =
Observations.retainsObservations(observations,
- routePeriod);
+ routeInterval);
if (logger.isDebugEnabled()) {
logger.debug("Export Observations from route {} [{}-{}] nb observations {}",
new Object[]{beginTime,
- routeEndTime,
+ endTime,
routeObservations.size()}
);
}
@@ -662,7 +666,7 @@
protected void fillDateRecord(Date date, Map<String, Object> record) {
record.put("DATE", date);
- record.put("HHMMSS", timeFormat.format(date));
+ record.put("HHMMSS", Dates.toDateTime(date).toString("HHmmss"));
}
protected void fillGeoPointRecordAndFlush(GeoPoint geoPoint,
Modified: trunk/sammoa-persistence/pom.xml
===================================================================
--- trunk/sammoa-persistence/pom.xml 2012-09-01 09:50:03 UTC (rev 501)
+++ trunk/sammoa-persistence/pom.xml 2012-09-01 09:50:23 UTC (rev 502)
@@ -27,6 +27,11 @@
</dependency>
<dependency>
+ <groupId>joda-time</groupId>
+ <artifactId>joda-time</artifactId>
+ </dependency>
+
+ <dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
Added: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Dates.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Dates.java (rev 0)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Dates.java 2012-09-01 09:50:23 UTC (rev 502)
@@ -0,0 +1,62 @@
+package fr.ulr.sammoa.persistence;
+
+import org.joda.time.DateTime;
+import org.joda.time.Interval;
+
+import java.util.Date;
+
+/**
+ * Created: 31/08/12
+ *
+ * @author fdesbois <florian.desbois(a)codelutin.com>
+ */
+public final class Dates {
+
+ private Dates() {
+ // static class do not have instanciation
+ }
+
+ public static Interval toInterval(DateTime begin, DateTime end) {
+ return new Interval(begin, end);
+ }
+
+ public static Interval toInterval(Date begin, Date end) {
+ return toInterval(toDateTime(begin), toDateTime(end));
+ }
+
+ public static DateTime toDateTime(Date date) {
+ return new DateTime(date);
+ }
+
+ public static Date newDateWithoutMillis() {
+ return DateTime.now().withMillisOfSecond(0).toDate();
+ }
+
+ public static boolean inInterval(Date date, Date begin, Date end) {
+ return inInterval(date, toInterval(begin, end));
+ }
+
+ public static boolean inInterval(Date date, Interval interval) {
+ return interval.contains(toDateTime(date));
+ }
+
+// public static Predicate<Date> inInterval(Interval interval) {
+// return new InIntervalPredicate(interval);
+// }
+//
+// private static class InIntervalPredicate implements Predicate<Date> {
+//
+// protected Interval interval;
+//
+// public InIntervalPredicate(Interval interval) {
+// Preconditions.checkNotNull(interval);
+// this.interval = interval;
+// }
+//
+// @Override
+// public boolean apply(Date input) {
+// return inInterval(input, interval);
+// }
+// }
+
+}
Property changes on: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Dates.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Flights.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Flights.java 2012-09-01 09:50:03 UTC (rev 501)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Flights.java 2012-09-01 09:50:23 UTC (rev 502)
@@ -41,8 +41,8 @@
// static class do not have instanciation
}
- public static Comparator<Flight> onDate() {
- return ON_DATE_COMPARATOR;
+ public static Comparator<Flight> orderByDate() {
+ return ORDER_BY_DATE_COMPARATOR;
}
public static Function<Flight, String> toSystemId() {
@@ -89,7 +89,7 @@
}
}
- protected static Comparator<Flight> ON_DATE_COMPARATOR =
+ protected static Comparator<Flight> ORDER_BY_DATE_COMPARATOR =
new Comparator<Flight>() {
@Override
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-09-01 09:50:03 UTC (rev 501)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java 2012-09-01 09:50:23 UTC (rev 502)
@@ -29,7 +29,7 @@
import com.google.common.collect.FluentIterable;
import com.google.common.collect.Iterables;
import org.apache.commons.collections.CollectionUtils;
-import org.nuiton.util.PeriodDates;
+import org.joda.time.Interval;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -95,9 +95,7 @@
Date begin = previousRoute.getBeginTime();
Date end = nextRoute != null ? nextRoute.getBeginTime() : null;
- PeriodDates period = new PeriodDates(begin, end);
-
- return inPeriod(observation, period);
+ return Dates.inInterval(observation.getObservationTime(), begin, end);
}
public static Predicate<Observation> inRoute(Route route,
@@ -106,24 +104,26 @@
return new InRoutePredicate(route, routes, ignoreDeleted);
}
- public static boolean inPeriod(Observation observation, PeriodDates periodDate) {
+// public static boolean inDateInterval(Observation observation, Interval interval) {
+//
+// boolean result = Dates.inInterval(observation.getObservationTime(), interval);
+//
+//// 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;
+// }
- 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> inDateInterval(Interval interval) {
+ return new InDateIntervalPredicate(interval);
}
- 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)) {
@@ -140,7 +140,7 @@
}
public static List<Observation> retainsObservations(List<Observation> observations,
- PeriodDates periodDate) {
+ Interval interval) {
// List<Observation> result = Lists.newArrayList();
// Iterator<Observation> itr = observations.iterator();
@@ -168,7 +168,7 @@
List<Observation> result = FluentIterable
.from(observations)
- .filter(inPeriod(periodDate))
+ .filter(inDateInterval(interval))
.toImmutableList();
Iterables.removeAll(observations, result);
@@ -208,18 +208,18 @@
}
}
- private static class InPeriodPredicate implements Predicate<Observation> {
+ private static class InDateIntervalPredicate implements Predicate<Observation> {
- protected PeriodDates periodDate;
+ protected Interval interval;
- public InPeriodPredicate(PeriodDates periodDate) {
- Preconditions.checkNotNull(periodDate);
- this.periodDate = periodDate;
+ public InDateIntervalPredicate(Interval interval) {
+ Preconditions.checkNotNull(interval);
+ this.interval = interval;
}
@Override
public boolean apply(Observation input) {
- return Observations.inPeriod(input, periodDate);
+ return Dates.inInterval(input.getObservationTime(), interval);
}
}
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-09-01 09:50:03 UTC (rev 501)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java 2012-09-01 09:50:23 UTC (rev 502)
@@ -542,6 +542,7 @@
@Override
public void onCloseUI() {
transectUi.removeComponentListener(transectUIListener);
+ flightController.close();
try {
context.closeService(flightController);
1
0
r501 - trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/home
by fdesbois@users.forge.codelutin.com 01 Sep '12
by fdesbois@users.forge.codelutin.com 01 Sep '12
01 Sep '12
Author: fdesbois
Date: 2012-09-01 11:50:03 +0200 (Sat, 01 Sep 2012)
New Revision: 501
Url: http://forge.codelutin.com/repositories/revision/sammoa/501
Log:
refs #1434 : missing changeScreen when flight exists
Modified:
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/home/HomeUIHandler.java
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-30 15:58:32 UTC (rev 500)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/home/HomeUIHandler.java 2012-09-01 09:50:03 UTC (rev 501)
@@ -314,6 +314,10 @@
ui, _("sammoa.inputDialog.flightNumber.error.notANumber"));
}
}
+
+ } else {
+
+ context.changeScreen(SammoaScreen.FLIGHT, campaign, flight);
}
}
1
0
30 Aug '12
Author: fdesbois
Date: 2012-08-30 17:58:32 +0200 (Thu, 30 Aug 2012)
New Revision: 500
Url: http://forge.codelutin.com/repositories/revision/sammoa/500
Log:
fixes #1434 : resolve issue with flightNumber
Added:
trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/SammoaConfigMock.java
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaConfig.java
trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/FlightServiceTest.java
trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/io/input/csv/ImportCsvServiceTest.java
trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/output/map/ExportMapServiceTest.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/FlightDAOImpl.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/campaign/CampaignUIHandler.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/io/input/UIImporter.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/region/RegionUIHandler.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/FlightService.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java 2012-08-30 14:42:03 UTC (rev 499)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java 2012-08-30 15:58:32 UTC (rev 500)
@@ -232,26 +232,26 @@
}
/**
- * Create a new flight using the last flight number. The flight number is
- * calculated from the last existing flight or from
- * configuration {@link SammoaConfig#getFlightNumber()}.
+ * Create a new flight using the {@code flightNumber}. The flight number
+ * could be calculated using {@link #getNextFlightNumber()}.
*
+ * @param flightNumber the number of the new flight
* @param campaign The campaign of the flight
* @return a new flight
- * @see FlightDAO#findLastFlightNumber(int)
+ * @see #getNextFlightNumber()
* @since 0.4
*/
- public Flight createFlight(Campaign campaign) {
+ public Flight createFlight(Campaign campaign, int flightNumber) {
- TopiaContext transaction = beginTransaction();
+ TopiaContext tx = beginTransaction();
try {
- FlightDAO dao = SammoaDAOHelper.getFlightDAO(transaction);
+ FlightDAO dao = SammoaDAOHelper.getFlightDAO(tx);
+ int nextFlightNumber = getNextFlightNumber(tx);
+ Preconditions.checkArgument(flightNumber >= nextFlightNumber);
+
String systemId = config.getSystemId();
- int startNumber = config.getFlightNumber();
- int flightNumber = dao.findLastFlightNumber(startNumber);
-
Flight result = dao.createByNaturalId(systemId,
flightNumber,
campaign);
@@ -264,8 +264,12 @@
);
}
- transaction.commitTransaction();
+ tx.commitTransaction();
+ // Update flightNumber in config
+ config.setFlightNumber(flightNumber);
+ config.save();
+
// create flight storage
CampaignStorage campaignStorage =
getCampaignStorage(campaign.getTopiaId());
@@ -277,11 +281,31 @@
} catch (TopiaException e) {
throw new TopiaRuntimeException(e);
} finally {
- endTransaction(transaction);
+ endTransaction(tx);
}
}
/**
+ * Retrieve the next flight number to use. It is the maximum value available
+ * between the database maximum flightNumber and the configuration one.
+ *
+ * @return the next available flight number
+ */
+ public int getNextFlightNumber() {
+
+ TopiaContext tx = persistence.beginTransaction();
+ try {
+ int result = getNextFlightNumber(tx);
+ return result;
+
+ } catch (TopiaException e) {
+ throw new TopiaRuntimeException(e);
+ } finally {
+ endTransaction(tx);
+ }
+ }
+
+ /**
* Remove the given flight from db and storage.
*
* @param flightId the flight id to remove
@@ -994,6 +1018,19 @@
}
}
+ protected int getNextFlightNumber(TopiaContext tx) throws TopiaException {
+
+ FlightDAO dao = SammoaDAOHelper.getFlightDAO(tx);
+
+ int confNumber = config.getFlightNumber();
+ Integer dbNumber = dao.findLastFlightNumber();
+
+ int result = dbNumber == null
+ ? confNumber : Math.max(confNumber, dbNumber);
+ result++;
+ return result;
+ }
+
public Flight getFlightByNaturalId(Map<String, Object> naturalId) {
TopiaContext tx = beginTransaction();
try {
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-30 14:42:03 UTC (rev 499)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaConfig.java 2012-08-30 15:58:32 UTC (rev 500)
@@ -223,6 +223,10 @@
return result;
}
+ public void setFlightNumber(int flightNumber) {
+ applicationConfig.setOption(SammoaConfigOption.FLIGHT_NUMBER.key, String.valueOf(flightNumber));
+ }
+
/** @return {@link SammoaConfigOption#BACKGROUND_SHAPE_FILE} value */
public File getBackgroundShapeFile() {
File result = applicationConfig.getOptionAsFile(SammoaConfigOption.BACKGROUND_SHAPE_FILE.key);
@@ -359,7 +363,7 @@
/** The starting value to increment flight number */
FLIGHT_NUMBER("flight.number",
n_("sammoa.config.flight.number"),
- "1",
+ "0",
Integer.class
),
/** The backgroud shape file to display the world */
Modified: trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/FlightServiceTest.java
===================================================================
--- trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/FlightServiceTest.java 2012-08-30 14:42:03 UTC (rev 499)
+++ trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/FlightServiceTest.java 2012-08-30 15:58:32 UTC (rev 500)
@@ -39,6 +39,7 @@
import fr.ulr.sammoa.persistence.Transect;
import fr.ulr.sammoa.persistence.TransectDAO;
import fr.ulr.sammoa.persistence.TransectFlight;
+import org.junit.After;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
@@ -47,21 +48,24 @@
/**
* Created: 08/06/12
- * <p/>
- * FIXME-fdesbois-2012-07-03 : This test is ignored, waiting for a more stable AutoCommitSaver
*
* @author fdesbois <desbois(a)codelutin.com>
*/
public class FlightServiceTest {
public SammoaConfig config =
- new SammoaConfig("sammoa-test.properties");
+ new SammoaConfigMock("sammoa-test.properties");
@Rule
public SammoaDatabase database = new SammoaDatabase(
"/" + config.getApplicationConfig().getConfigFileName(),
config.getAutoCommitDelay());
+ @After
+ public void tearDown() {
+ config.setFlightNumber(0);
+ }
+
@Test
public void testCreateFlight() throws Exception {
@@ -71,15 +75,57 @@
Campaign campaign = database.createCampaign("PACOMM", "FRANCE");
- context.getConfig().applicationConfig.setOption(
- SammoaConfig.SammoaConfigOption.FLIGHT_NUMBER.getKey(), "18");
+ context.getConfig().setFlightNumber(17);
- Flight flight1 = service.createFlight(campaign);
+ Flight flight = service.createFlight(campaign, 18);
- Assert.assertEquals(18, flight1.getFlightNumber());
+ Assert.assertEquals(18, flight.getFlightNumber());
+ Assert.assertEquals(18, (int) config.getFlightNumber());
}
+ @Test(expected = IllegalArgumentException.class)
+ public void testCreateFlightError() throws Exception {
+
+ SammoaContext context = new SammoaContext(config, database.getPersistence());
+
+ FlightService service = context.getService(FlightService.class);
+
+ Campaign campaign = database.createCampaign("PACOMM", "FRANCE");
+
+ context.getConfig().setFlightNumber(18);
+
+ service.createFlight(campaign, 1);
+ }
+
@Test
+ public void testGetNextFlightNumber() throws Exception {
+
+ SammoaContext context = new SammoaContext(config, database.getPersistence());
+
+ FlightService service = context.getService(FlightService.class);
+
+ Campaign campaign = database.createCampaign("PACOMM", "FRANCE");
+
+ {
+ service.createFlight(campaign, 124);
+ int result = service.getNextFlightNumber();
+ Assert.assertEquals(125, result);
+ }
+
+ {
+ config.setFlightNumber(18);
+ int result = service.getNextFlightNumber();
+ Assert.assertEquals(125, result);
+ }
+
+ {
+ config.setFlightNumber(149);
+ int result = service.getNextFlightNumber();
+ Assert.assertEquals(150, result);
+ }
+ }
+
+ @Test
public void testAddTransects() throws Exception {
SammoaContext context = new SammoaContext(config, database.getPersistence());
@@ -91,7 +137,7 @@
// Create the strate
Strate strate = createStrate(campaign, 1, StrateType.COAST);
- Flight flight = service.createFlight(campaign);
+ Flight flight = service.createFlight(campaign, service.getNextFlightNumber());
// add 4 observers in flight
for (int i = 0; i < 4; i++) {
Added: trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/SammoaConfigMock.java
===================================================================
--- trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/SammoaConfigMock.java (rev 0)
+++ trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/SammoaConfigMock.java 2012-08-30 15:58:32 UTC (rev 500)
@@ -0,0 +1,29 @@
+package fr.ulr.sammoa.application;
+
+/**
+ * Created: 30/08/12
+ *
+ * @author fdesbois <florian.desbois(a)codelutin.com>
+ */
+public class SammoaConfigMock extends SammoaConfig {
+
+ protected int flightNumber;
+
+ public SammoaConfigMock(String file, String... args) {
+ super(file, args);
+ }
+
+ @Override
+ public Integer getFlightNumber() {
+ return flightNumber;
+ }
+
+ @Override
+ public void setFlightNumber(int flightNumber) {
+ this.flightNumber = flightNumber;
+ }
+
+ @Override
+ public void save() {
+ }
+}
Property changes on: trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/SammoaConfigMock.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Modified: trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/io/input/csv/ImportCsvServiceTest.java
===================================================================
--- trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/io/input/csv/ImportCsvServiceTest.java 2012-08-30 14:42:03 UTC (rev 499)
+++ trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/io/input/csv/ImportCsvServiceTest.java 2012-08-30 15:58:32 UTC (rev 500)
@@ -24,6 +24,7 @@
*/
import fr.ulr.sammoa.application.SammoaConfig;
+import fr.ulr.sammoa.application.SammoaConfigMock;
import fr.ulr.sammoa.application.SammoaContext;
import fr.ulr.sammoa.persistence.Campaign;
import fr.ulr.sammoa.persistence.Observer;
@@ -49,7 +50,7 @@
public class ImportCsvServiceTest {
public SammoaConfig config =
- new SammoaConfig("sammoa-test.properties");
+ new SammoaConfigMock("sammoa-test.properties");
@Rule
public SammoaDatabase database = new SammoaDatabase(
Modified: trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/output/map/ExportMapServiceTest.java
===================================================================
--- trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/output/map/ExportMapServiceTest.java 2012-08-30 14:42:03 UTC (rev 499)
+++ trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/output/map/ExportMapServiceTest.java 2012-08-30 15:58:32 UTC (rev 500)
@@ -26,6 +26,7 @@
import com.google.common.collect.Lists;
import fr.ulr.sammoa.application.FlightService;
import fr.ulr.sammoa.application.SammoaConfig;
+import fr.ulr.sammoa.application.SammoaConfigMock;
import fr.ulr.sammoa.application.SammoaContext;
import fr.ulr.sammoa.application.io.input.map.DbfImport;
import fr.ulr.sammoa.application.io.input.map.DoubleToIntegerValueParser;
@@ -71,7 +72,7 @@
public class ExportMapServiceTest {
public SammoaConfig config =
- new SammoaConfig("sammoa-test.properties");
+ new SammoaConfigMock("sammoa-test.properties");
@Rule
public SammoaDatabase database = new SammoaDatabase("/" +
@@ -100,7 +101,7 @@
campaign.setEndDate(DateUtil.createDate(31, 12, 2012));
FlightService flightService = context.getService(FlightService.class);
- Flight flight = flightService.createFlight(campaign);
+ Flight flight = flightService.createFlight(campaign, flightService.getNextFlightNumber());
flight.setBeginDate(DateUtil.createDate(18, 0, 12, 18, 7, 2012));
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/FlightDAOImpl.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/FlightDAOImpl.java 2012-08-30 14:42:03 UTC (rev 499)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/FlightDAOImpl.java 2012-08-30 15:58:32 UTC (rev 500)
@@ -43,18 +43,18 @@
*/
public class FlightDAOImpl<E extends Flight> extends FlightDAOAbstract<E> {
- public int findLastFlightNumber(int defaultValue) {
+ public Integer findLastFlightNumber() {
String ql = "SELECT max(flightNumber) FROM FlightImpl";
try {
- Integer queryResult = findByQuery(Integer.class, ql);
+ Integer result = findByQuery(Integer.class, ql);
- int result = queryResult == null ? defaultValue : queryResult + 1;
-
- if (result < defaultValue) {
- result = defaultValue;
- }
+// int result = queryResult == null ? defaultValue : queryResult + 1;
+//
+// if (result < defaultValue) {
+// result = defaultValue;
+// }
return result;
} catch (TopiaException e) {
throw new TopiaRuntimeException(e);
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/campaign/CampaignUIHandler.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/campaign/CampaignUIHandler.java 2012-08-30 14:42:03 UTC (rev 499)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/campaign/CampaignUIHandler.java 2012-08-30 15:58:32 UTC (rev 500)
@@ -217,7 +217,7 @@
observerFile.getAbsolutePath());
}
- success &= uiImporter.importCvs(observerImporter, observerFile);
+ success &= uiImporter.importCsv(observerImporter, observerFile);
}
SammoaUtil.updateBusyState(ui, false);
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-30 14:42:03 UTC (rev 499)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/home/HomeUIHandler.java 2012-08-30 15:58:32 UTC (rev 500)
@@ -39,13 +39,17 @@
import fr.ulr.sammoa.ui.swing.SammoaUIContext;
import fr.ulr.sammoa.ui.swing.SammoaUIHandler;
import fr.ulr.sammoa.ui.swing.UIDecoratorService;
+import fr.ulr.sammoa.ui.swing.util.SammoaUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import javax.swing.JOptionPane;
import java.util.Collection;
import java.util.List;
import java.util.Set;
+import static org.nuiton.i18n.I18n._;
+
/**
* Created: 19/07/12
*
@@ -281,10 +285,36 @@
if (flight == null) {
- // Create a new Flight for the selected Campaign
- flight = flightService.createFlight(campaign);
+ int nextFlightNumber = flightService.getNextFlightNumber();
+
+ String response = JOptionPane.showInputDialog(
+ ui, _("sammoa.inputDialog.flightNumber.message"), nextFlightNumber);
+
+ if (response == null) {
+ // nothing to do
+
+ } else {
+ try {
+ int flightNumber = Integer.parseInt(response);
+
+ if (flightNumber < nextFlightNumber) {
+ SammoaUtil.showErrorMessage(
+ ui, _("sammoa.inputDialog.flightNumber.error.greaterThanNextFlightNumber", nextFlightNumber));
+
+ } else {
+
+ // Create the flight
+ flight = flightService.createFlight(campaign, flightNumber);
+
+ context.changeScreen(SammoaScreen.FLIGHT, campaign, flight);
+ }
+
+ } catch (NumberFormatException ex) {
+ SammoaUtil.showErrorMessage(
+ ui, _("sammoa.inputDialog.flightNumber.error.notANumber"));
+ }
+ }
}
- context.changeScreen(SammoaScreen.FLIGHT, campaign, flight);
}
public void showValidation() {
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/UIImporter.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/UIImporter.java 2012-08-30 14:42:03 UTC (rev 499)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/UIImporter.java 2012-08-30 15:58:32 UTC (rev 500)
@@ -30,8 +30,6 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.swing.JOptionPane;
-import javax.swing.UIManager;
import java.awt.Component;
import java.io.File;
import java.io.IOException;
@@ -67,7 +65,7 @@
SammoaUtil.updateBusyState(ui, false);
- JOptionPane.showMessageDialog(ui, successMessage);
+ SammoaUtil.showSuccessMessage(ui, successMessage);
result = true;
@@ -80,7 +78,7 @@
return result;
}
- public boolean importCvs(CsvImporter importer, File file) {
+ public boolean importCsv(CsvImporter importer, File file) {
boolean result = false;
try {
@@ -91,7 +89,7 @@
SammoaUtil.updateBusyState(ui, false);
- JOptionPane.showMessageDialog(ui, successMessage);
+ SammoaUtil.showSuccessMessage(ui, successMessage);
result = true;
@@ -109,9 +107,7 @@
if (logger.isInfoEnabled()) {
logger.info("Import error from file '" + file.getAbsolutePath() + "'", e);
}
- JOptionPane.showMessageDialog(
- ui, e.getMessage(), "Error",
- JOptionPane.ERROR_MESSAGE, UIManager.getIcon("error"));
+ SammoaUtil.showErrorMessage(ui, e.getMessage());
}
}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/region/RegionUIHandler.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/region/RegionUIHandler.java 2012-08-30 14:42:03 UTC (rev 499)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/region/RegionUIHandler.java 2012-08-30 15:58:32 UTC (rev 500)
@@ -131,7 +131,7 @@
speciesFile.getAbsolutePath());
}
- success = uiImporter.importCvs(speciesImporter, speciesFile);
+ success = uiImporter.importCsv(speciesImporter, speciesFile);
}
SammoaUtil.updateBusyState(ui, false);
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 14:42:03 UTC (rev 499)
+++ trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2012-08-30 15:58:32 UTC (rev 500)
@@ -94,6 +94,9 @@
sammoa.info.importApplication.importfile.loaded.on.existingCampaign=Import an existing campaign %s, please choose which flights of the following list to import
sammoa.info.importApplication.importfile.loaded.on.newCampaign=Import a new campaign %s, all the flights of the following list will be imported
sammoa.info.importApplication.no.importfile.loaded=No import file loaded, choose an file to import then press the 'load import file' button
+sammoa.inputDialog.flightNumber.error.greaterThanNextFlightNumber=The flight number can't be greater than %d
+sammoa.inputDialog.flightNumber.error.notANumber=The flight number must be a valid integer
+sammoa.inputDialog.flightNumber.message=Choose the flight number
sammoa.label.campaign=Campaign\:
sammoa.label.campaign.beginDate=Begin\:
sammoa.label.campaign.code=Code\:
1
0
Author: tchemit
Date: 2012-08-30 16:42:03 +0200 (Thu, 30 Aug 2012)
New Revision: 499
Url: http://forge.codelutin.com/repositories/revision/sammoa/499
Log:
updates to mavenpom 3.3.7
Modified:
trunk/pom.xml
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2012-08-30 13:38:08 UTC (rev 498)
+++ trunk/pom.xml 2012-08-30 14:42:03 UTC (rev 499)
@@ -10,7 +10,7 @@
<parent>
<groupId>org.nuiton</groupId>
<artifactId>mavenpom4redmine</artifactId>
- <version>3.3.7-SNAPSHOT</version>
+ <version>3.3.7</version>
</parent>
<groupId>fr.ulr</groupId>
1
0
r498 - trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application
by tchemit@users.forge.codelutin.com 30 Aug '12
by tchemit@users.forge.codelutin.com 30 Aug '12
30 Aug '12
Author: tchemit
Date: 2012-08-30 15:38:08 +0200 (Thu, 30 Aug 2012)
New Revision: 498
Url: http://forge.codelutin.com/repositories/revision/sammoa/498
Log:
fix typo
Modified:
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUIHandler.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-30 13:28:13 UTC (rev 497)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUIHandler.java 2012-08-30 13:38:08 UTC (rev 498)
@@ -58,7 +58,7 @@
import static org.nuiton.i18n.I18n._;
/**
- * Handelr of {@link ExportApplicationUI}.
+ * Handler of {@link ExportApplicationUI}.
*
* @author tchemit <chemit(a)codelutin.com>
* @since 0.6
1
0
30 Aug '12
Author: fdesbois
Date: 2012-08-30 15:28:13 +0200 (Thu, 30 Aug 2012)
New Revision: 497
Url: http://forge.codelutin.com/repositories/revision/sammoa/497
Log:
fixes #1419 : allow change time, do not keep milliseconds
Added:
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TimeCellEditor.java
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/FakeGpsHandler.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsHandlerGpsylon.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerValidation.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/FlightDAOImpl.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPointDAOImpl.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPointImpl.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPoints.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/ObservationDAOImpl.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/RouteDAOImpl.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Routes.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectDAOImpl.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectFlightDAOImpl.java
trunk/sammoa-persistence/src/main/xmi/sammoa.properties
trunk/sammoa-persistence/src/test/java/fr/ulr/sammoa/persistence/GeoPointsTest.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUI.css
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/TextCellEditor.java
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-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -843,7 +843,10 @@
RouteDAO dao = SammoaDAOHelper.getRouteDAO(transaction);
// Create the new Route
- Route result = dao.createByNaturalId(beginTime, type, flight);
+ Route result = dao.create();
+ result.setBeginTime(beginTime);
+ result.setRouteType(type);
+ result.setFlight(flight);
// Copy previous data
if (previousRoute != null) {
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/FakeGpsHandler.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/FakeGpsHandler.java 2012-08-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/FakeGpsHandler.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -29,6 +29,7 @@
import fr.ulr.sammoa.persistence.GeoPoint;
import fr.ulr.sammoa.persistence.GeoPointImpl;
import fr.ulr.sammoa.persistence.GeoPoints;
+import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -133,13 +134,13 @@
GeoPoint result;
if (currentLocation == null) {
result = new GeoPointImpl(GeoPoints.EMPTY_COORDINATE, GeoPoints.EMPTY_COORDINATE);
- result.setRecordTime(new Date());
+ result.setRecordTime(getDate());
} else if (currentLocation.getTopiaId() != null) {
result = new GeoPointImpl(currentLocation.getLatitude(), currentLocation.getLongitude());
result.setAltitude(currentLocation.getAltitude());
result.setSpeed(currentLocation.getSpeed());
- result.setRecordTime(new Date());
+ result.setRecordTime(getDate());
} else {
result = currentLocation;
@@ -171,11 +172,17 @@
longitude += random.nextDouble() - 0.5;
currentLocation = new GeoPointImpl(latitude, longitude);
- currentLocation.setRecordTime(new Date());
+ currentLocation.setRecordTime(getDate());
count--;
}
}
}
+ protected Date getDate() {
+ Date result = new Date();
+ result = DateUtils.setMilliseconds(result, 0);
+ return result;
+ }
+
}
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsHandlerGpsylon.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsHandlerGpsylon.java 2012-08-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsHandlerGpsylon.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -31,6 +31,7 @@
import fr.ulr.sammoa.persistence.GeoPointImpl;
import fr.ulr.sammoa.persistence.GeoPoints;
import gnu.io.CommPortIdentifier;
+import org.apache.commons.lang3.time.DateUtils;
import org.dinopolis.gpstool.gpsinput.GPSDataProcessor;
import org.dinopolis.gpstool.gpsinput.GPSDevice;
import org.dinopolis.gpstool.gpsinput.GPSException;
@@ -173,15 +174,17 @@
// }
double latitude = lastPosition != null
- ? lastPosition.getLatitude() : GeoPoints.EMPTY_COORDINATE;
+ ? lastPosition.getLatitude()
+ : GeoPoints.EMPTY_COORDINATE;
+
double longitude = lastPosition != null
- ? lastPosition.getLongitude() : GeoPoints.EMPTY_COORDINATE;
+ ? lastPosition.getLongitude()
+ : GeoPoints.EMPTY_COORDINATE;
GeoPoint result = new GeoPointImpl(latitude, longitude);
result.setAltitude(lastAltitude);
result.setSpeed(lastSpeed);
- // FIXME-fdesbois-2012-07-02 : ensure time with GPS value and not system timestamp
- result.setRecordTime(new Date());
+ result.setRecordTime(getDate());
if (logger.isWarnEnabled() && lastPosition == null) {
logger.warn("Retrieve a location without any coordinates : {}", result);
@@ -255,6 +258,13 @@
super.finalize();
}
+ protected Date getDate() {
+ // FIXME-fdesbois-2012-07-02 : ensure time with GPS value and not system timestamp
+ Date result = new Date();
+ result = DateUtils.setMilliseconds(result, 0);
+ return result;
+ }
+
/**
* Si l'on recoit des evenements, c'est que le gps fonctionne.
* Il sont envoyé par le traitement des flux NMEA et propagé par le
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerValidation.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerValidation.java 2012-08-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerValidation.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -41,6 +41,7 @@
import org.slf4j.LoggerFactory;
import java.io.File;
+import java.util.Calendar;
import java.util.Date;
import java.util.List;
@@ -102,30 +103,33 @@
Date newTime;
if (position > 0) {
- newTime = DateUtils.addMilliseconds(previousTime, (int) position);
+ newTime = DateUtils.addSeconds(previousTime, (int) position);
} else {
- // Arbitrary add 1 second for the newTime
- newTime = DateUtils.addMilliseconds(previousTime, 1000);
+ newTime = new Date();
+ newTime.setTime(previousTime.getTime());
- // Ensure that newTime is before nextRoute time
- Route nextRoute = Routes.findNext(routes, currentRoute);
- if (nextRoute != null) {
-
- logger.debug(String.format("Next route %1$s at %2$tH:%2$tM:%2$tS.%2$tL",
- nextRoute.getRouteType(),
- nextRoute.getBeginTime())
- );
-
- // If greater or equals than the nextRoute, we use the middle
- // time between previous and next route
- if (newTime.after(nextRoute.getBeginTime())
- || newTime.equals(nextRoute.getBeginTime())) {
-
- newTime = Routes.getMiddleTime(currentRoute, nextRoute);
- }
- }
+// // Arbitrary add 1 second for the newTime
+// newTime = DateUtils.addMilliseconds(previousTime, 1000);
+//
+// // Ensure that newTime is before nextRoute time
+// Route nextRoute = Routes.findNext(routes, currentRoute);
+// if (nextRoute != null) {
+//
+// logger.debug(String.format("Next route %1$s at %2$tH:%2$tM:%2$tS.%2$tL",
+// nextRoute.getRouteType(),
+// nextRoute.getBeginTime())
+// );
+//
+// // If greater or equals than the nextRoute, we use the middle
+// // time between previous and next route
+// if (newTime.after(nextRoute.getBeginTime())
+// || newTime.equals(nextRoute.getBeginTime())) {
+//
+// newTime = Routes.getMiddleTime(currentRoute, nextRoute);
+// }
+// }
}
if (logger.isDebugEnabled()) {
@@ -140,12 +144,16 @@
// Create a new location if no one is available for the newTime
if (!location.getRecordTime().equals(newTime)) {
- // Note that the captureDelay is keeped but maybe we need to update it
- // depends on modified time ?
result = new GeoPointImpl(location.getLatitude(), location.getLongitude());
result.setSpeed(location.getSpeed());
result.setAltitude(location.getAltitude());
- result.setCaptureDelay(location.getCaptureDelay());
+
+ // Ensure captureDelay of the new recording time
+ long locationSeconds = DateUtils.getFragmentInSeconds(location.getRecordTime(), Calendar.MINUTE);
+ long newSeconds = DateUtils.getFragmentInSeconds(newTime, Calendar.MINUTE);
+ int captureDelay = (int) newSeconds - (int) locationSeconds;
+ result.setCaptureDelay(captureDelay);
+
result.setFlight(flight);
result.setRecordTime(newTime);
SammoaDAOHelper.getGeoPointDAO(tx).create(result);
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/FlightDAOImpl.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/FlightDAOImpl.java 2012-08-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/FlightDAOImpl.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -92,23 +92,4 @@
}
}
-// public List<Flight> findAllByCampaignOrderedByBeginDateDesc(Campaign campaign) {
-//
-// List<Flight> result;
-//
-// String ql = String.format("FROM %1$s WHERE %2$s = :campaign ORDER BY %3$s DESC",
-// FlightImpl.class.getSimpleName(),
-// Flight.PROPERTY_CAMPAIGN,
-// Flight.PROPERTY_BEGIN_DATE
-// );
-//
-// try {
-// result = context.findAll(ql, "campaign", campaign);
-//
-// } catch (TopiaException e) {
-// throw new TopiaRuntimeException(e);
-// }
-// return result;
-// }
-
}
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPointDAOImpl.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPointDAOImpl.java 2012-08-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPointDAOImpl.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -32,11 +32,9 @@
public List<E> findAllByFlightOrderedByRecordTime(Flight flight) {
- String ql = String.format("FROM %1$s WHERE %2$s = :flight ORDER BY %3$s",
- GeoPointImpl.class.getSimpleName(),
- GeoPoint.PROPERTY_FLIGHT,
- GeoPoint.PROPERTY_RECORD_TIME
- );
+ String ql = "FROM GeoPointImpl " +
+ "WHERE flight = :flight " +
+ "ORDER BY recordTime";
try {
List<E> result = findAllByQuery(ql, "flight", flight);
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPointImpl.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPointImpl.java 2012-08-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPointImpl.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -52,6 +52,7 @@
.append(PROPERTY_ALTITUDE, altitude)
.append(PROPERTY_SPEED, speed)
.append(PROPERTY_RECORD_TIME, recordTime)
+ .append(PROPERTY_CAPTURE_DELAY, captureDelay)
.build();
}
}
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPoints.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPoints.java 2012-08-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPoints.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -101,7 +101,7 @@
for (Date date : dates) {
// We continue starting from the previous index to avoid loop on all the date list
- index = getClosestDateIndex(index > 0 ? index - 1 : 0, geoPointDates, date);
+ index = getBeforeDateIndex(index > 0 ? index - 1 : 0, geoPointDates, date);
result.add(geoPoints.get(index));
}
@@ -120,41 +120,44 @@
List<Date> geoPointDates = Lists.transform(source, toDate());
- int index = getClosestDateIndex(0, geoPointDates, date);
+ int index = getBeforeDateIndex(0, geoPointDates, date);
result = geoPoints.get(index);
}
return result;
}
- protected static int getClosestDateIndex(int startIndex, List<Date> source, Date date) {
+ protected static int getBeforeDateIndex(int startIndex, List<Date> source, Date date) {
int size = source.size();
for (int index = startIndex; index < size; index++) {
int nextIndex = index + 1;
if (nextIndex < size) {
- Date before = source.get(index);
- Date after = source.get(nextIndex);
+ Date end = source.get(nextIndex);
- // If the date is equal or before we take the current index
- if (date.equals(before) || date.before(before)) {
+ if (date.before(end)) {
return index;
+ }
- // If the date is before the next date, we check which one
- // of the before and after is the nearest value and we return
- // its index
- } else if (date.before(after)) {
-
- long diffBefore = date.getTime() - before.getTime();
- long diffAfter = after.getTime() - date.getTime();
-
- if (diffBefore <= diffAfter) {
- return index;
-
- } else {
- return nextIndex;
- }
- }
+// // If the date is equal or before we take the current index
+// if (date.equals(before) || date.before(before)) {
+// return index;
+//
+// // If the date is before the next date, we check which one
+// // of the before and after is the nearest value and we return
+// // its index
+// } else if (date.before(after)) {
+//
+// long diffBefore = date.getTime() - before.getTime();
+// long diffAfter = after.getTime() - date.getTime();
+//
+// if (diffBefore <= diffAfter) {
+// return index;
+//
+// } else {
+// return nextIndex;
+// }
+// }
}
}
// We loop over the whole list, we return the last index
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/ObservationDAOImpl.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/ObservationDAOImpl.java 2012-08-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/ObservationDAOImpl.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -81,7 +81,9 @@
public List<E> findAllByFlightOrderedByObservationTime(Flight flight) {
- String ql = "FROM ObservationImpl WHERE flight = :flight ORDER BY observationTime";
+ String ql = "FROM ObservationImpl " +
+ "WHERE flight = :flight " +
+ "ORDER BY observationTime, topiaCreateDate";
try {
List<E> result = findAllByQuery(ql, "flight", flight);
@@ -93,7 +95,9 @@
public int findLastObservationNumber(Flight flight) {
- String ql = "SELECT max(observationNumber) FROM ObservationImpl WHERE flight = :flight";
+ String ql = "SELECT max(observationNumber) " +
+ "FROM ObservationImpl " +
+ "WHERE flight = :flight";
try {
Integer queryResult = findByQuery(Integer.class, ql, "flight", flight);
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/RouteDAOImpl.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/RouteDAOImpl.java 2012-08-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/RouteDAOImpl.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -39,7 +39,7 @@
String ql = "FROM RouteImpl " +
"WHERE flight = :flight " +
- "ORDER BY beginTime";
+ "ORDER BY beginTime, topiaCreateDate";
try {
List<E> result = findAllByQuery(ql, "flight", flight);
@@ -54,7 +54,7 @@
String ql = "FROM RouteImpl " +
"WHERE flight = :flight " +
"AND deleted = :deleted " +
- "ORDER BY beginTime DESC";
+ "ORDER BY beginTime DESC, topiaCreateDate DESC";
try {
List<E> queryResults = findAllByQueryWithBound(
@@ -75,7 +75,7 @@
"AND routeType = :type " +
"AND beginTime <= :date " +
"AND deleted = :deleted " +
- "ORDER BY beginTime DESC";
+ "ORDER BY beginTime DESC, topiaCreateDate DESC";
try {
List<E> queryResults = findAllByQueryWithBound(
@@ -100,7 +100,7 @@
"WHERE flight = :flight " +
"AND beginTime <= :date " +
"AND deleted = :deleted " +
- "ORDER BY beginTime DESC";
+ "ORDER BY beginTime DESC, topiaCreateDate DESC";
try {
List<E> queryResults = findAllByQueryWithBound(
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Routes.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Routes.java 2012-08-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Routes.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -28,6 +28,7 @@
import com.google.common.base.Preconditions;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
+import com.google.common.collect.ComparisonChain;
import com.google.common.collect.Iterables;
import com.google.common.collect.Ordering;
import com.google.common.collect.Sets;
@@ -94,31 +95,38 @@
boolean result = Objects.equal(o1.getRouteType(), o2.getRouteType());
- result &= Objects.equal(o1.getTransectFlight(), o2.getTransectFlight());
- result &= Objects.equal(o1.getCircleBackCause(), o2.getCircleBackCause());
+ // We assume that time equality for a same routeType is an equivalence
+ if (result && Objects.equal(o1.getBeginTime(), o2.getBeginTime())) {
+ result = true;
- result &= Objects.equal(o1.isDeleted(), o2.isDeleted());
+ } else {
- result &= Objects.equal(o1.getSeaState(), o2.getSeaState());
- result &= Objects.equal(o1.getSwell(), o2.getSwell());
- result &= Objects.equal(o1.getTurbidity(), o2.getTurbidity());
- result &= Objects.equal(o1.getCloudCover(), o2.getCloudCover());
- result &= Objects.equal(o1.getSkyGlint(), o2.getSkyGlint());
- result &= Objects.equal(o1.getGlareFrom(), o2.getGlareFrom());
- result &= Objects.equal(o1.getGlareTo(), o2.getGlareTo());
- result &= Objects.equal(o1.isGlareUnder(), o2.isGlareUnder());
- result &= Objects.equal(o1.getGlareSeverity(), o2.getGlareSeverity());
- result &= Objects.equal(o1.getSubjectiveConditions(), o2.getSubjectiveConditions());
+ result &= Objects.equal(o1.getTransectFlight(), o2.getTransectFlight());
+ result &= Objects.equal(o1.getCircleBackCause(), o2.getCircleBackCause());
- result &= o1.getObserverPosition().size() == o2.getObserverPosition().size();
+ result &= Objects.equal(o1.isDeleted(), o2.isDeleted());
- if (result) {
+ result &= Objects.equal(o1.getSeaState(), o2.getSeaState());
+ result &= Objects.equal(o1.getSwell(), o2.getSwell());
+ result &= Objects.equal(o1.getTurbidity(), o2.getTurbidity());
+ result &= Objects.equal(o1.getCloudCover(), o2.getCloudCover());
+ result &= Objects.equal(o1.getSkyGlint(), o2.getSkyGlint());
+ result &= Objects.equal(o1.getGlareFrom(), o2.getGlareFrom());
+ result &= Objects.equal(o1.getGlareTo(), o2.getGlareTo());
+ result &= Objects.equal(o1.isGlareUnder(), o2.isGlareUnder());
+ result &= Objects.equal(o1.getGlareSeverity(), o2.getGlareSeverity());
+ result &= Objects.equal(o1.getSubjectiveConditions(), o2.getSubjectiveConditions());
- for (ObserverPosition position1 : o1.getObserverPosition()) {
- ObserverPosition position2 =
- o2.getObserverPositionByPosition(position1.getPosition());
+ result &= o1.getObserverPosition().size() == o2.getObserverPosition().size();
- result &= Objects.equal(position1.getObserver(), position2.getObserver());
+ if (result) {
+
+ for (ObserverPosition position1 : o1.getObserverPosition()) {
+ ObserverPosition position2 =
+ o2.getObserverPositionByPosition(position1.getPosition());
+
+ result &= Objects.equal(position1.getObserver(), position2.getObserver());
+ }
}
}
return result;
@@ -160,15 +168,15 @@
return Iterables.find(routes, new WithObservationPredicate(observation, routes, ignoreDeleted), null);
}
- public static Date getMiddleTime(Route previousRoute, Route nextRoute) {
- Date previousTime = previousRoute.getBeginTime();
- Date nextTime = nextRoute.getBeginTime();
+// public static Date getMiddleTime(Route previousRoute, Route nextRoute) {
+// Date previousTime = previousRoute.getBeginTime();
+// Date nextTime = nextRoute.getBeginTime();
+//
+// long diff = nextTime.getTime() - previousTime.getTime();
+// Date result = new Date(nextTime.getTime() - diff / 2);
+// return result;
+// }
- long diff = nextTime.getTime() - previousTime.getTime();
- Date result = new Date(nextTime.getTime() - diff / 2);
- return result;
- }
-
public static Predicate<Route> isDeleted() {
return IS_DELETED_PREDICATE;
}
@@ -181,12 +189,12 @@
@Override
public int compare(Route o1, Route o2) {
-// int result = ComparisonChain
-// .start()
-// .compare(o1.getBeginTime(), o2.getBeginTime())
-// .compare(o1.getTopiaCreateDate(), o2.getTopiaCreateDate())
-// .result();
- return o1.getBeginTime().compareTo(o2.getBeginTime());
+ int result = ComparisonChain
+ .start()
+ .compare(o1.getBeginTime(), o2.getBeginTime())
+ .compare(o1.getTopiaCreateDate(), o2.getTopiaCreateDate())
+ .result();
+ return result;
}
};
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectDAOImpl.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectDAOImpl.java 2012-08-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectDAOImpl.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -32,13 +32,9 @@
public List<E> findAllByCampaignOrderedByName(Campaign campaign) {
- String ql = String.format("FROM %1$s WHERE %2$s.%3$s.%4$s = :campaign ORDER BY %5$s",
- TransectImpl.class.getSimpleName(),
- Transect.PROPERTY_STRATE,
- Strate.PROPERTY_SECTOR,
- Sector.PROPERTY_CAMPAIGN,
- Transect.PROPERTY_NAME
- );
+ String ql = "FROM TransectImpl " +
+ "WHERE strate.sector.campaign = :campaign " +
+ "ORDER BY name";
try {
List<E> result = findAllByQuery(ql, "campaign", campaign);
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectFlightDAOImpl.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectFlightDAOImpl.java 2012-08-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectFlightDAOImpl.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -35,7 +35,8 @@
public Map<Transect, Long> countAllByTransect() {
- String ql = "SELECT transect, count(*) FROM TransectFlightImpl " +
+ String ql = "SELECT transect, count(*) " +
+ "FROM TransectFlightImpl " +
"GROUP BY transect";
try {
@@ -55,8 +56,10 @@
public Map<Transect, Long> countAllByTransects(Collection<Transect> transects) {
- String ql = "SELECT transect, count(*) FROM TransectFlightImpl " +
- "WHERE transect IN (:transects) GROUP BY transect";
+ String ql = "SELECT transect, count(*) " +
+ "FROM TransectFlightImpl " +
+ "WHERE transect IN (:transects) " +
+ "GROUP BY transect";
try {
List<Object[]> queryResults = findAllByQuery(
@@ -86,23 +89,5 @@
getContext().executeSQL(builder.toString());
}
-// public Long countByTransect(Transect transect) {
-//
-// Long result;
-//
-// String ql = String.format("SELECT count(*) FROM %1$s WHERE %2$s = :transect",
-// TransectFlightImpl.class.getSimpleName(),
-// TransectFlight.PROPERTY_TRANSECT
-// );
-//
-// try {
-// result = (Long) context.findUnique(ql, "transect", transect);
-//
-// } catch (TopiaException e) {
-// throw new TopiaRuntimeException(e);
-// }
-// return result;
-// }
-
}
Modified: trunk/sammoa-persistence/src/main/xmi/sammoa.properties
===================================================================
--- trunk/sammoa-persistence/src/main/xmi/sammoa.properties 2012-08-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-persistence/src/main/xmi/sammoa.properties 2012-08-30 13:28:13 UTC (rev 497)
@@ -112,10 +112,10 @@
############## ROUTE
-fr.ulr.sammoa.persistence.Route.class.tagvalue.naturalIdMutable=true
-fr.ulr.sammoa.persistence.Route.attribute.routeType.tagvalue.naturalId=true
-fr.ulr.sammoa.persistence.Route.attribute.flight.tagvalue.naturalId=true
-fr.ulr.sammoa.persistence.Route.attribute.beginTime.tagvalue.naturalId=true
+#fr.ulr.sammoa.persistence.Route.class.tagvalue.naturalIdMutable=true
+#fr.ulr.sammoa.persistence.Route.attribute.routeType.tagvalue.naturalId=true
+#fr.ulr.sammoa.persistence.Route.attribute.flight.tagvalue.naturalId=true
+#fr.ulr.sammoa.persistence.Route.attribute.beginTime.tagvalue.naturalId=true
# transectFlight is not a collection (EAGER load)
fr.ulr.sammoa.persistence.Route.attribute.transectFlight.tagvalue.lazy=false
Modified: trunk/sammoa-persistence/src/test/java/fr/ulr/sammoa/persistence/GeoPointsTest.java
===================================================================
--- trunk/sammoa-persistence/src/test/java/fr/ulr/sammoa/persistence/GeoPointsTest.java 2012-08-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-persistence/src/test/java/fr/ulr/sammoa/persistence/GeoPointsTest.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -55,7 +55,7 @@
Assert.assertEquals(3, result.size());
Assert.assertEquals(4000, result.get(0).getRecordTime().getTime());
- Assert.assertEquals(6000, result.get(1).getRecordTime().getTime());
+ Assert.assertEquals(5000, result.get(1).getRecordTime().getTime());
Assert.assertEquals(85000, result.get(2).getRecordTime().getTime());
}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUI.css
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUI.css 2012-08-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUI.css 2012-08-30 13:28:13 UTC (rev 497)
@@ -85,7 +85,7 @@
#beginDatePicker {
patternLayout:{_("sammoa.dateTimePattern")};
showPopupButton:false;
- editable:false;
+ editable:{model.isValidationMode()};
date:{bean.getBeginDate()};
}
@@ -96,7 +96,7 @@
#endDatePicker {
patternLayout:{_("sammoa.dateTimePattern")};
showPopupButton:false;
- editable:false;
+ editable:{model.isValidationMode()};
date:{bean.getEndDate()};
}
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-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/EffortPanelHandler.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -58,9 +58,11 @@
import fr.ulr.sammoa.ui.swing.util.SammoaUtil;
import fr.ulr.sammoa.ui.swing.util.TableDataChangeListener;
import fr.ulr.sammoa.ui.swing.util.TextCellEditor;
+import fr.ulr.sammoa.ui.swing.util.TimeCellEditor;
import fr.ulr.sammoa.ui.swing.util.ValidRowHighlightPredicate;
import jaxx.runtime.JAXXUtil;
import jaxx.runtime.SwingUtil;
+import jaxx.runtime.swing.JAXXDatePicker;
import jaxx.runtime.swing.JAXXWidgetUtil;
import jaxx.runtime.swing.editor.cell.NumberCellEditor;
import jaxx.runtime.validator.swing.SwingListValidatorDataLocator;
@@ -154,7 +156,6 @@
ui.getConavComboBox().setRenderer(observeCellRenderer);
JTable errorTable = ui.getErrorTable();
- SwingListValidatorMessageTableModel errorTableModel = ui.getErrorTableModel();
// prepare error table ui
SwingValidatorUtil.installUI(
@@ -170,139 +171,282 @@
}
);
- FlightUIModel flightUIModel = ui.getFlightUIModel();
- String validatorContext = flightUIModel.isValidationMode() ? "validation" : "onBoard";
+ initRouteTable();
- // init route section
- {
- JXTable table = ui.getRouteTable();
+ initObservationTable();
+ }
- RouteTableModel tableModel = ui.getRouteTableModel();
- BeanListValidator<Route> validator = ui.getRouteValidator();
- validator.setContext(validatorContext);
- getParentUI().setContextValue(validator, ROUTE_VALIDATOR_CONTEXT_VALUE);
+ /**
+ * Add hightlighters on the editor of beans.
+ *
+ * @param validator the validator where to find bean states
+ * @param editor the editor of beans
+ * @param dataLocator the data locator
+ * @param scopes scopes to hightlight
+ * @param <O> type of bean to validate
+ * @since 2.5.3
+ */
+ public static <O> void addHightLighterOnEditor(BeanListValidator<O> validator,
+ JXTable editor,
+ SwingListValidatorDataLocator<O> dataLocator,
+ NuitonValidatorScope... scopes) {
- init(table, new ListSelectionListener() {
- @Override
- public void valueChanged(ListSelectionEvent e) {
+ for (NuitonValidatorScope scope : scopes) {
- if (!e.getValueIsAdjusting()) {
+ SwingListValidatorHighlightPredicate<O> predicate = SwingListValidatorHighlightPredicate.newPredicate(
+ scope,
+ validator, dataLocator
+ );
- ListSelectionModel listSelectionModel =
- (ListSelectionModel) e.getSource();
- int firstIndex = e.getFirstIndex();
- int lastIndex = e.getLastIndex();
- Integer newSelectedRow = null;
+ Highlighter highlighter = SammoaUtil.newBackgroundColorHighlighter(
+ predicate, SwingValidatorUtil.getColor(scope));
+ editor.addHighlighter(highlighter);
+ }
+ }
- if (listSelectionModel.isSelectionEmpty()) {
+ public Observer getObserverByPosition(Route route, Position position) {
+ Observer result;
+ if (route != null) {
+ ObserverPosition observerPosition =
+ route.getObserverPositionByPosition(position);
+ result = observerPosition.getObserver();
- // no selection
- } else if (listSelectionModel.isSelectedIndex(firstIndex)) {
+ } else {
+ result = null;
+ }
+ return result;
+ }
- // use first index
- newSelectedRow = firstIndex;
- } else if (listSelectionModel.isSelectedIndex(lastIndex)) {
+ public void setObserverByPosition(Observer newValue, Position position) {
+ if (!comboIsAdjusting) {
- // use last index
- newSelectedRow = lastIndex;
- }
- FlightUIModel flightUIModel = ui.getFlightUIModel();
- List<Route> routes = flightUIModel.getRoutes();
- Route route = null;
+ FlightUIModel flightUIModel = ui.getFlightUIModel();
- if (newSelectedRow != null &&
- newSelectedRow < routes.size()) {
- route = routes.get(newSelectedRow);
+ Route route = flightUIModel.getRouteEditBean();
+ if (route != null) {
- if (logger.isInfoEnabled()) {
- logger.info("Select route from index {}", newSelectedRow);
- }
+ if (logger.isDebugEnabled()) {
+ logger.debug(String.format("Set observer %s for position %s", newValue, position));
+ }
- if (flightUIModel.isValidationMode()) {
- getParentUI().getHandler().getFlightController().setCurrentRoute(route);
- }
+ FlightService flightService = context.getService(FlightService.class);
+ flightService.setRouteObserverByPosition(route, newValue, position);
- } else {
- if (logger.isInfoEnabled()) {
- logger.info("No route selected");
- }
+ // the method setObserverByPosition could update other positions
+ // so we need to refresh all comboboxes
+ comboIsAdjusting = true;
+
+ try {
+ if (Position.NAVIGATOR != position) {
+ ObserverPosition navPosition = route.getObserverPositionByPosition(Position.NAVIGATOR);
+ ui.getNavComboBox().setSelectedItem(navPosition.getObserver());
+ }
+
+ if (Position.FRONT_LEFT != position) {
+ ObserverPosition leftPosition = route.getObserverPositionByPosition(Position.FRONT_LEFT);
+ ui.getLeftComboBox().setSelectedItem(leftPosition.getObserver());
+ }
+
+ if (Position.FRONT_RIGHT != position) {
+ ObserverPosition rightPosition = route.getObserverPositionByPosition(Position.FRONT_RIGHT);
+ ui.getRightComboBox().setSelectedItem(rightPosition.getObserver());
+ }
+
+ if (Position.CO_NAVIGATOR != position) {
+ ObserverPosition conavPosition = route.getObserverPositionByPosition(Position.CO_NAVIGATOR);
+ ui.getConavComboBox().setSelectedItem(conavPosition.getObserver());
+ }
+ } finally {
+
+ comboIsAdjusting = false;
+ }
+
+ // Fire on TableModel to update the row (highlighting)
+ // 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);
+
+ // Update observation table to ensure observer's name during validation
+ if (flightUIModel.isValidationMode()) {
+ fireObservationsUpdated(route, false);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void stateChanged(DeviceStateEvent event) {
+ DeviceState state = event.getNewValue();
+ if (DeviceState.ERROR == state) {
+ ui.getObservationTable().setBackground(DEVICE_ERROR_BACKGROUND_COLOR);
+
+ } else {
+ ui.getObservationTable().setBackground(Color.WHITE);
+ }
+ }
+
+ public void initRouteTable() {
+
+ FlightUIModel flightUIModel = ui.getFlightUIModel();
+
+ JXTable table = ui.getRouteTable();
+ RouteTableModel tableModel = ui.getRouteTableModel();
+
+ SwingUtil.setI18nTableHeaderRenderer(
+ table,
+ n_("sammoa.observations.routeTable.column.effortNumber"),
+ n_("sammoa.observations.routeTable.column.effortNumber.tip"),
+ n_("sammoa.observations.routeTable.column.beginTime"),
+ n_("sammoa.observations.routeTable.column.beginTime.tip"),
+ n_("sammoa.observations.routeTable.column.routeType"),
+ n_("sammoa.observations.routeTable.column.routeType.tip"),
+ n_("sammoa.observations.routeTable.column.transect"),
+ n_("sammoa.observations.routeTable.column.transect.tip"),
+ n_("sammoa.observations.routeTable.column.seaState"),
+ n_("sammoa.observations.routeTable.column.seaState.tip"),
+ n_("sammoa.observations.routeTable.column.swell"),
+ n_("sammoa.observations.routeTable.column.swell.tip"),
+ n_("sammoa.observations.routeTable.column.turbidity"),
+ n_("sammoa.observations.routeTable.column.turbidity.tip"),
+ n_("sammoa.observations.routeTable.column.skyGlint"),
+ n_("sammoa.observations.routeTable.column.skyGlint.tip"),
+ n_("sammoa.observations.routeTable.column.glareFrom"),
+ n_("sammoa.observations.routeTable.column.glareFrom.tip"),
+ n_("sammoa.observations.routeTable.column.glareTo"),
+ n_("sammoa.observations.routeTable.column.glareTo.tip"),
+ n_("sammoa.observations.routeTable.column.glareSeverity"),
+ n_("sammoa.observations.routeTable.column.glareSeverity.tip"),
+ n_("sammoa.observations.routeTable.column.glareUnder"),
+ n_("sammoa.observations.routeTable.column.glareUnder.tip"),
+ n_("sammoa.observations.routeTable.column.cloudCover"),
+ n_("sammoa.observations.routeTable.column.cloudCover.tip"),
+ n_("sammoa.observations.routeTable.column.subjectiveConditions"),
+ n_("sammoa.observations.routeTable.column.subjectiveConditions.tip"),
+ n_("sammoa.observations.routeTable.column.unexpectedLeft"),
+ n_("sammoa.observations.routeTable.column.unexpectedLeft.tip"),
+ n_("sammoa.observations.routeTable.column.unexpectedRight"),
+ n_("sammoa.observations.routeTable.column.unexpectedRight.tip"),
+ n_("sammoa.observations.routeTable.column.comment"),
+ n_("sammoa.observations.routeTable.column.comment.tip"),
+ n_("sammoa.observations.routeTable.column.deleted"),
+ n_("sammoa.observations.routeTable.column.deleted.tip")
+ );
+
+ init(table, new ListSelectionListener() {
+
+ @Override
+ public void valueChanged(ListSelectionEvent e) {
+
+ if (!e.getValueIsAdjusting()) {
+
+ ListSelectionModel listSelectionModel =
+ (ListSelectionModel) e.getSource();
+ int firstIndex = e.getFirstIndex();
+ int lastIndex = e.getLastIndex();
+ Integer newSelectedRow = null;
+
+ if (listSelectionModel.isSelectionEmpty()) {
+
+ // no selection
+ } else if (listSelectionModel.isSelectedIndex(firstIndex)) {
+
+ // use first index
+ newSelectedRow = firstIndex;
+ } else if (listSelectionModel.isSelectedIndex(lastIndex)) {
+
+ // use last index
+ newSelectedRow = lastIndex;
+ }
+ FlightUIModel flightUIModel = ui.getFlightUIModel();
+ List<Route> routes = flightUIModel.getRoutes();
+ Route route = null;
+
+ if (newSelectedRow != null &&
+ newSelectedRow < routes.size()) {
+ route = routes.get(newSelectedRow);
+
+ if (logger.isInfoEnabled()) {
+ logger.info("Select route from index {}", newSelectedRow);
}
- // set new route in model to validate
- flightUIModel.setRouteEditBean(route);
+ } else {
+ if (logger.isInfoEnabled()) {
+ logger.info("No route selected");
+ }
}
+
+ // set new route in model to validate
+ flightUIModel.setRouteEditBean(route);
}
- });
+ }
+ });
- SwingUtil.setI18nTableHeaderRenderer(
- table,
- n_("sammoa.observations.routeTable.column.effortNumber"),
- n_("sammoa.observations.routeTable.column.effortNumber.tip"),
- n_("sammoa.observations.routeTable.column.beginTime"),
- n_("sammoa.observations.routeTable.column.beginTime.tip"),
- n_("sammoa.observations.routeTable.column.routeType"),
- n_("sammoa.observations.routeTable.column.routeType.tip"),
- n_("sammoa.observations.routeTable.column.transect"),
- n_("sammoa.observations.routeTable.column.transect.tip"),
- n_("sammoa.observations.routeTable.column.seaState"),
- n_("sammoa.observations.routeTable.column.seaState.tip"),
- n_("sammoa.observations.routeTable.column.swell"),
- n_("sammoa.observations.routeTable.column.swell.tip"),
- n_("sammoa.observations.routeTable.column.turbidity"),
- n_("sammoa.observations.routeTable.column.turbidity.tip"),
- n_("sammoa.observations.routeTable.column.skyGlint"),
- n_("sammoa.observations.routeTable.column.skyGlint.tip"),
- n_("sammoa.observations.routeTable.column.glareFrom"),
- n_("sammoa.observations.routeTable.column.glareFrom.tip"),
- n_("sammoa.observations.routeTable.column.glareTo"),
- n_("sammoa.observations.routeTable.column.glareTo.tip"),
- n_("sammoa.observations.routeTable.column.glareSeverity"),
- n_("sammoa.observations.routeTable.column.glareSeverity.tip"),
- n_("sammoa.observations.routeTable.column.glareUnder"),
- n_("sammoa.observations.routeTable.column.glareUnder.tip"),
- n_("sammoa.observations.routeTable.column.cloudCover"),
- n_("sammoa.observations.routeTable.column.cloudCover.tip"),
- n_("sammoa.observations.routeTable.column.subjectiveConditions"),
- n_("sammoa.observations.routeTable.column.subjectiveConditions.tip"),
- n_("sammoa.observations.routeTable.column.unexpectedLeft"),
- n_("sammoa.observations.routeTable.column.unexpectedLeft.tip"),
- n_("sammoa.observations.routeTable.column.unexpectedRight"),
- n_("sammoa.observations.routeTable.column.unexpectedRight.tip"),
- n_("sammoa.observations.routeTable.column.comment"),
- n_("sammoa.observations.routeTable.column.comment.tip"),
- n_("sammoa.observations.routeTable.column.deleted"),
- n_("sammoa.observations.routeTable.column.deleted.tip")
- );
-
+ // Listeners
+ {
int columnToEditOnInsert = RouteTableModel.RouteColumn.SEA_STATE.ordinal();
flightUIModel.addPropertyChangeListener(
FlightUIModel.PROPERTY_ROUTES,
new TableDataChangeListener(table, columnToEditOnInsert)
);
- // Highlighter for no modification
- table.addHighlighter(
- SammoaUtil.newForegroundColorHighlighter(
- new RouteNoModificationHighlightPredicate(tableModel),
- SammoaColors.ROUTE_NO_MODIFICATION_ROW_COLOR)
- );
+ if (flightUIModel.isValidationMode()) {
+ flightUIModel.addPropertyChangeListener(
+ FlightUIModel.PROPERTY_ROUTE_EDIT_BEAN,
+ new PropertyChangeListener() {
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ Route route = (Route) evt.getNewValue();
+ getParentUI().getHandler().getFlightController().setCurrentRoute(route);
+ }
+ }
+ );
+ }
+ }
+
+ // Validation
+ {
+ JTable errorTable = ui.getErrorTable();
+ SwingListValidatorMessageTableModel errorTableModel = ui.getErrorTableModel();
+
+ BeanListValidator<Route> validator = ui.getRouteValidator();
+ validator.setContext(getValidatorContext());
+ getParentUI().setContextValue(validator, ROUTE_VALIDATOR_CONTEXT_VALUE);
+
RouteValidatorDataLocator dataLocator = new RouteValidatorDataLocator();
SwingValidatorUtil.registerListValidator(
validator,
errorTableModel,
table,
- errorTable, dataLocator);
+ errorTable,
+ dataLocator
+ );
addHightLighterOnEditor(
- validator, table, dataLocator,
+ validator,
+ table,
+ dataLocator,
NuitonValidatorScope.ERROR,
- NuitonValidatorScope.WARNING);
+ NuitonValidatorScope.WARNING
+ );
+ for (Route route : tableModel.getBean()) {
+ validator.addBean(route);
+ }
+ }
+
+ // Highlighters
+ {
table.addHighlighter(SammoaUtil.newForegroundColorHighlighter(
+ new RouteNoModificationHighlightPredicate(tableModel),
+ SammoaColors.ROUTE_NO_MODIFICATION_ROW_COLOR)
+ );
+ table.addHighlighter(SammoaUtil.newForegroundColorHighlighter(
new DeletedRowHighlightPredicate(flightUIModel.getRoutes()),
SammoaColors.DELETED_ROW_COLOR)
);
@@ -310,32 +454,106 @@
new ValidRowHighlightPredicate(flightUIModel.getRoutes()),
SammoaColors.VALID_ROW_COLOR)
);
-
- for (Route route : tableModel.getBean()) {
- validator.addBean(route);
- }
}
+ }
- // init observation section
- {
- JXTable table = ui.getObservationTable();
+ public void initObservationTable() {
- BeanListValidator<Observation> validator = ui.getObservationValidator();
- validator.setContext(validatorContext);
- getParentUI().setContextValue(validator, OBSERVATION_VALIDATOR_CONTEXT_VALUE);
+ FlightUIModel flightUIModel = ui.getFlightUIModel();
- FlightController flightController =
- getParentUI().getHandler().getFlightController();
+ JXTable table = ui.getObservationTable();
+ ObservationTableModel tableModel = ui.getObservationTableModel();
- if (flightUIModel.isValidationMode()) {
+ SwingUtil.setI18nTableHeaderRenderer(
+ 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.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"),
+ n_("sammoa.observations.observationTable.column.species.tip"),
+ n_("sammoa.observations.observationTable.column.age"),
+ n_("sammoa.observations.observationTable.column.age.tip"),
+ n_("sammoa.observations.observationTable.column.decAngle"),
+ n_("sammoa.observations.observationTable.column.decAngle.tip"),
+ n_("sammoa.observations.observationTable.column.cue"),
+ n_("sammoa.observations.observationTable.column.cue.tip"),
+ n_("sammoa.observations.observationTable.column.behaviour"),
+ n_("sammoa.observations.observationTable.column.behaviour.tip"),
+ n_("sammoa.observations.observationTable.column.swimDir"),
+ n_("sammoa.observations.observationTable.column.swimDir.tip"),
+ n_("sammoa.observations.observationTable.column.calves"),
+ n_("sammoa.observations.observationTable.column.calves.tip"),
+ n_("sammoa.observations.observationTable.column.photo"),
+ n_("sammoa.observations.observationTable.column.photo.tip"),
+ n_("sammoa.observations.observationTable.column.comment"),
+ n_("sammoa.observations.observationTable.column.comment.tip"),
+ n_("sammoa.observations.observationTable.column.observationStatus"),
+ n_("sammoa.observations.observationTable.column.observationStatus.tip"),
+ n_("sammoa.observations.observationTable.column.deleted"),
+ n_("sammoa.observations.observationTable.column.deleted.tip"),
+ n_("sammoa.observations.observationTable.column.circleback"),
+ n_("sammoa.observations.observationTable.column.circleback.tip")
+ );
- // nothing for the moment
+ init(table, new ListSelectionListener() {
- } else {
- flightController.getDeviceManager(GpsHandler.class).addDeviceStateListener(this);
- flightController.getDeviceManager(AudioRecorder.class).addDeviceStateListener(this);
+ @Override
+ public void valueChanged(ListSelectionEvent e) {
+
+ FlightUIModel flightUIModel = ui.getFlightUIModel();
+
+ if (!e.getValueIsAdjusting()) {
+
+ ListSelectionModel listSelectionModel =
+ (ListSelectionModel) e.getSource();
+ int firstIndex = e.getFirstIndex();
+ int lastIndex = e.getLastIndex();
+ Integer newSelectedRow = null;
+
+ if (listSelectionModel.isSelectionEmpty()) {
+
+ // no selection
+ } else if (listSelectionModel.isSelectedIndex(firstIndex)) {
+
+ // use first index
+ newSelectedRow = firstIndex;
+ } else if (listSelectionModel.isSelectedIndex(lastIndex)) {
+
+ // use last index
+ newSelectedRow = lastIndex;
+ }
+ List<Observation> observations = flightUIModel.getObservations();
+ Observation observation = null;
+
+ if (newSelectedRow != null &&
+ newSelectedRow < observations.size()) {
+ observation = observations.get(newSelectedRow);
+
+ if (logger.isInfoEnabled()) {
+ logger.info("Select observation from index {}", newSelectedRow);
+ }
+
+ } else {
+ if (logger.isInfoEnabled()) {
+ logger.info("No observation selected");
+ }
+ }
+
+ // set new observation in model to validate
+ flightUIModel.setObservationEditBean(observation);
+ }
}
+ });
+ // Listeners
+ {
+ FlightController flightController =
+ getParentUI().getHandler().getFlightController();
int columnToEditOnInsert = ObservationTableModel.ObservationColumn.POD_SIZE.ordinal();
flightUIModel.addPropertyChangeListener(
@@ -345,107 +563,118 @@
// For CircleBack buttons
flightUIModel.addPropertyChangeListener(
- FlightUIModel.PROPERTY_FLIGHT_STATE, observationUpdateListener);
+ FlightUIModel.PROPERTY_FLIGHT_STATE,
+ new PropertyChangeListener() {
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+
+ FlightUIModel model = (FlightUIModel) evt.getSource();
+
+ if (model.sizeObservations() > 0) {
+
+ ui.getObservationTableModel().fireTableRowsUpdated(
+ 0, model.sizeObservations() - 1);
+ }
+ }
+ });
+
// For highlighting depends on selected route
flightUIModel.addPropertyChangeListener(
- FlightUIModel.PROPERTY_ROUTE_EDIT_BEAN, observationUpdateListener);
+ FlightUIModel.PROPERTY_ROUTE_EDIT_BEAN,
+ new PropertyChangeListener() {
- SwingUtil.setI18nTableHeaderRenderer(
- 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.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"),
- n_("sammoa.observations.observationTable.column.species.tip"),
- n_("sammoa.observations.observationTable.column.age"),
- n_("sammoa.observations.observationTable.column.age.tip"),
- n_("sammoa.observations.observationTable.column.decAngle"),
- n_("sammoa.observations.observationTable.column.decAngle.tip"),
- n_("sammoa.observations.observationTable.column.cue"),
- n_("sammoa.observations.observationTable.column.cue.tip"),
- n_("sammoa.observations.observationTable.column.behaviour"),
- n_("sammoa.observations.observationTable.column.behaviour.tip"),
- n_("sammoa.observations.observationTable.column.swimDir"),
- n_("sammoa.observations.observationTable.column.swimDir.tip"),
- n_("sammoa.observations.observationTable.column.calves"),
- n_("sammoa.observations.observationTable.column.calves.tip"),
- n_("sammoa.observations.observationTable.column.photo"),
- n_("sammoa.observations.observationTable.column.photo.tip"),
- n_("sammoa.observations.observationTable.column.comment"),
- n_("sammoa.observations.observationTable.column.comment.tip"),
- n_("sammoa.observations.observationTable.column.observationStatus"),
- n_("sammoa.observations.observationTable.column.observationStatus.tip"),
- n_("sammoa.observations.observationTable.column.deleted"),
- n_("sammoa.observations.observationTable.column.deleted.tip"),
- n_("sammoa.observations.observationTable.column.circleback"),
- n_("sammoa.observations.observationTable.column.circleback.tip")
- );
-
-// init(dataTable, new ObservationTableListSelectionListener(ui.getFlightUIModel()));
- init(table, new ListSelectionListener() {
@Override
- public void valueChanged(ListSelectionEvent e) {
+ public void propertyChange(PropertyChangeEvent evt) {
- FlightUIModel flightUIModel = ui.getFlightUIModel();
+ Route oldValue = (Route) evt.getOldValue();
+ if (oldValue != null) {
+ fireObservationsUpdated(oldValue, false);
+ }
+ Route newValue = (Route) evt.getNewValue();
+ if (newValue != null) {
+ fireObservationsUpdated(newValue, true);
+ }
+ }
+ });
- if (!e.getValueIsAdjusting()) {
+ if (flightUIModel.isValidationMode()) {
- ListSelectionModel listSelectionModel =
- (ListSelectionModel) e.getSource();
- int firstIndex = e.getFirstIndex();
- int lastIndex = e.getLastIndex();
- Integer newSelectedRow = null;
+ // For validation, time change is listening to properly select the route
+ flightUIModel.addPropertyChangeListener(
+ FlightUIModel.PROPERTY_OBSERVATION_EDIT_BEAN,
+ new PropertyChangeListener() {
- if (listSelectionModel.isSelectionEmpty()) {
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
- // no selection
- } else if (listSelectionModel.isSelectedIndex(firstIndex)) {
+ Observation oldValue = (Observation) evt.getNewValue();
+ if (oldValue != null) {
+ oldValue.removePropertyChangeListener(
+ Observation.PROPERTY_OBSERVATION_TIME,
+ observationTimeChangeListener);
+ }
+ Observation newValue = (Observation) evt.getNewValue();
+ if (newValue != null) {
+ newValue.addPropertyChangeListener(
+ Observation.PROPERTY_OBSERVATION_TIME,
+ observationTimeChangeListener);
- // use first index
- newSelectedRow = firstIndex;
- } else if (listSelectionModel.isSelectedIndex(lastIndex)) {
-
- // use last index
- newSelectedRow = lastIndex;
+ selectRouteByObservation(newValue);
}
- List<Observation> observations = flightUIModel.getObservations();
- Observation observation = null;
+ }
+ });
- if (newSelectedRow != null &&
- newSelectedRow < observations.size()) {
- observation = observations.get(newSelectedRow);
+ } else {
+ flightController.getDeviceManager(GpsHandler.class).addDeviceStateListener(this);
+ flightController.getDeviceManager(AudioRecorder.class).addDeviceStateListener(this);
+ }
+ }
- if (logger.isInfoEnabled()) {
- logger.info("Select observation from index {}", newSelectedRow);
- }
+ table.addHighlighter(
+ SammoaUtil.newBackgroundColorHighlighter(
+ new ObservationForSelectedRouteHighlightPredicate(flightUIModel),
+ SammoaColors.OBSERVATION_FOR_ROUTE_ROW_COLOR)
+ );
- // We need to auto-select the route in validation mode
- if (flightUIModel.isValidationMode()) {
- Route route = Routes.findWithObservation(
- flightUIModel.getRoutes(), observation, true);
+ // Validation
+ {
+ JTable errorTable = ui.getErrorTable();
+ SwingListValidatorMessageTableModel errorTableModel = ui.getErrorTableModel();
- int routeIndex = flightUIModel.indexOfRoutes(route);
- ui.getRouteTable().getSelectionModel().setSelectionInterval(routeIndex, routeIndex);
- }
+ BeanListValidator<Observation> validator = ui.getObservationValidator();
+ validator.setContext(getValidatorContext());
+ getParentUI().setContextValue(validator, OBSERVATION_VALIDATOR_CONTEXT_VALUE);
- } else {
- if (logger.isInfoEnabled()) {
- logger.info("No observation selected");
- }
- }
+ ObservationValidatorDataLocator dataLocator =
+ new ObservationValidatorDataLocator();
- // set new observation in model to validate
- flightUIModel.setObservationEditBean(observation);
- }
- }
- });
+ SwingValidatorUtil.registerListValidator(
+ validator,
+ errorTableModel,
+ table,
+ errorTable,
+ dataLocator
+ );
+ addHightLighterOnEditor(
+ validator,
+ table,
+ dataLocator,
+ NuitonValidatorScope.ERROR,
+ NuitonValidatorScope.WARNING
+ );
+
+ for (Observation observation : tableModel.getBean()) {
+ validator.addBean(observation);
+ }
+ }
+
+ // Renderers/Editors/Highlighters
+ {
+ UIDecoratorService decoratorService =
+ context.getService(UIDecoratorService.class);
+
TableCellRenderer stringRenderer = table.getDefaultRenderer(String.class);
// ObservationStatus
@@ -499,26 +728,6 @@
column.setCellRenderer(editorRenderer);
}
- ObservationValidatorDataLocator dataLocator =
- new ObservationValidatorDataLocator();
-
- SwingValidatorUtil.registerListValidator(
- validator,
- errorTableModel,
- table,
- errorTable, dataLocator);
-
- table.addHighlighter(
- SammoaUtil.newBackgroundColorHighlighter(
- new ObservationForSelectedRouteHighlightPredicate(flightUIModel),
- SammoaColors.OBSERVATION_FOR_ROUTE_ROW_COLOR)
- );
-
- addHightLighterOnEditor(
- validator, table, dataLocator,
- NuitonValidatorScope.ERROR,
- NuitonValidatorScope.WARNING);
-
table.addHighlighter(SammoaUtil.newForegroundColorHighlighter(
new DeletedRowHighlightPredicate(flightUIModel.getObservations()),
SammoaColors.DELETED_ROW_COLOR)
@@ -527,139 +736,12 @@
new ValidRowHighlightPredicate(flightUIModel.getObservations()),
SammoaColors.VALID_ROW_COLOR)
);
-
- ObservationTableModel tableModel = ui.getObservationTableModel();
- for (Observation observation : tableModel.getBean()) {
- validator.addBean(observation);
- }
}
}
-
- /**
- * Add hightlighters on the editor of beans.
- *
- * @param validator the validator where to find bean states
- * @param editor the editor of beans
- * @param dataLocator the data locator
- * @param scopes scopes to hightlight
- * @param <O> type of bean to validate
- * @since 2.5.3
- */
- public static <O> void addHightLighterOnEditor(BeanListValidator<O> validator,
- JXTable editor,
- SwingListValidatorDataLocator<O> dataLocator,
- NuitonValidatorScope... scopes) {
-
- for (NuitonValidatorScope scope : scopes) {
-
- SwingListValidatorHighlightPredicate<O> predicate = SwingListValidatorHighlightPredicate.newPredicate(
- scope,
- validator, dataLocator
- );
-
- Highlighter highlighter = SammoaUtil.newBackgroundColorHighlighter(
- predicate, SwingValidatorUtil.getColor(scope));
- editor.addHighlighter(highlighter);
- }
- }
-
- public Observer getObserverByPosition(Route route, Position position) {
- Observer result;
- if (route != null) {
- ObserverPosition observerPosition =
- route.getObserverPositionByPosition(position);
- result = observerPosition.getObserver();
-
- } else {
- result = null;
- }
- return result;
- }
-
- public void setObserverByPosition(Observer newValue, Position position) {
- if (!comboIsAdjusting) {
-
- FlightUIModel flightUIModel = ui.getFlightUIModel();
-
- Route route = flightUIModel.getRouteEditBean();
- if (route != null) {
-
- if (logger.isDebugEnabled()) {
- logger.debug(String.format("Set observer %s for position %s", newValue, position));
- }
-
- FlightService flightService = context.getService(FlightService.class);
- flightService.setRouteObserverByPosition(route, newValue, position);
-
- // the method setObserverByPosition could update other positions
- // so we need to refresh all comboboxes
- comboIsAdjusting = true;
-
- try {
- if (Position.NAVIGATOR != position) {
- ObserverPosition navPosition = route.getObserverPositionByPosition(Position.NAVIGATOR);
- ui.getNavComboBox().setSelectedItem(navPosition.getObserver());
- }
-
- if (Position.FRONT_LEFT != position) {
- ObserverPosition leftPosition = route.getObserverPositionByPosition(Position.FRONT_LEFT);
- ui.getLeftComboBox().setSelectedItem(leftPosition.getObserver());
- }
-
- if (Position.FRONT_RIGHT != position) {
- ObserverPosition rightPosition = route.getObserverPositionByPosition(Position.FRONT_RIGHT);
- ui.getRightComboBox().setSelectedItem(rightPosition.getObserver());
- }
-
- if (Position.CO_NAVIGATOR != position) {
- ObserverPosition conavPosition = route.getObserverPositionByPosition(Position.CO_NAVIGATOR);
- ui.getConavComboBox().setSelectedItem(conavPosition.getObserver());
- }
- } finally {
-
- comboIsAdjusting = false;
- }
-
- // Fire on TableModel to update the row (highlighting)
- // 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);
-
- // Update observation table to ensure observer's name during validation
- if (flightUIModel.isValidationMode()) {
- updateObservationTable(route, false);
- }
- }
- }
- }
-
- @Override
- public void stateChanged(DeviceStateEvent event) {
- DeviceState state = event.getNewValue();
- if (DeviceState.ERROR == state) {
- ui.getObservationTable().setBackground(DEVICE_ERROR_BACKGROUND_COLOR);
-
- } else {
- ui.getObservationTable().setBackground(Color.WHITE);
- }
- }
-
public void init(final JXTable table,
- ListSelectionListener selectionListener) {
+ ListSelectionListener selectionListener) {
- // make tab key to focus only next editable cell
-// table.setSelectionModel(new ForceSelectionSelectionModel());
-// table.setSelectionBackground(null);
-// table.setSelectionForeground(Color.BLACK);
-//
-//// table.setSortable(context.isValidationMode());
-// table.setSortable(false);
-
-// table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
-
final Action moveToNextEditableCell = new MoveToNextEditableCellAction(table);
final Action moveToPreviousEditableCell = new MoveToPreviousEditableCellAction(table);
final Action moveToPreviousRowEditableCell = new MoveToPreviousRowEditableAction(table);
@@ -674,6 +756,7 @@
// Key adapter à ajouter sur les éditeurs où l'on souhaite gérer les
// touches "entrer", "gauche", "doite" de facon personnalisée.
KeyListener goNextCellAdapter = new KeyAdapter() {
+
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER ||
@@ -693,7 +776,7 @@
}
};
- // TextCellEditor
+ // Text
{
TextCellEditor editor = new TextCellEditor();
JTextField textField = editor.getComponent();
@@ -702,7 +785,8 @@
// textField.setBorder(BasicBorders.getTextFieldBorder());
table.setDefaultEditor(String.class, editor);
}
- // NumberCellEditor
+
+ // Number
{
NumberCellEditor<Integer> editor =
JAXXWidgetUtil.newNumberTableCellEditor(Integer.class, false);
@@ -715,48 +799,41 @@
table.setDefaultEditor(Integer.class, editor);
}
- // Boolean editor
+ // Boolean
{
+ TableCellRenderer renderer = table.getDefaultRenderer(Boolean.class);
+ table.setDefaultRenderer(boolean.class, renderer);
+
TableCellEditor editor = table.getDefaultEditor(Boolean.class);
table.setDefaultEditor(boolean.class, editor);
- TableCellRenderer renderer = table.getDefaultRenderer(Boolean.class);
- table.setDefaultRenderer(boolean.class, renderer);
}
- // Renderers
- TableCellRenderer defaultDateCellRenderer = table.getDefaultRenderer(Date.class);
- table.setDefaultRenderer(Date.class, JAXXWidgetUtil.newDateTableCellRenderer(defaultDateCellRenderer, _("sammoa.timePattern")));
+ // Date
+ {
+ TableCellRenderer defaultDateCellRenderer = table.getDefaultRenderer(Date.class);
+ TableCellRenderer renderer = JAXXWidgetUtil.newDateTableCellRenderer(
+ defaultDateCellRenderer, _("sammoa.timePattern"));
+ table.setDefaultRenderer(Date.class, renderer);
+ JAXXDatePicker datePicker = new JAXXDatePicker();
+ datePicker.setShowPopupButton(false);
+ datePicker.setPatternLayout(_("sammoa.timePattern"));
+ JTextField textField = datePicker.getEditor();
+// textField.addKeyListener(goNextCellAdapter);
+ textField.setBorder(new LineBorder(Color.GRAY, 2));
+ table.setDefaultEditor(Date.class, new TimeCellEditor(datePicker));
+ }
+
table.getSelectionModel().addListSelectionListener(selectionListener);
SwingUtil.scrollToTableSelection(table);
+ }
-// 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;
-// }
-// }
-// });
+ protected String getValidatorContext() {
+ return ui.getFlightUIModel().isValidationMode() ? "validation" : "onBoard";
}
- protected void updateObservationTable(Route route, boolean scrollToFirst) {
+ protected void fireObservationsUpdated(Route route, boolean scrollToFirst) {
FlightUIModel model = ui.getFlightUIModel();
@@ -786,31 +863,22 @@
}
}
- private PropertyChangeListener observationUpdateListener = new PropertyChangeListener() {
+ protected void selectRouteByObservation(Observation observation) {
- @Override
- public void propertyChange(PropertyChangeEvent evt) {
+ FlightUIModel flightUIModel = ui.getFlightUIModel();
-// int selectedRow = ui.getObservationTable().getSelectedRow();
+ Route route = Routes.findWithObservation(
+ flightUIModel.getRoutes(), observation, true);
-// ui.getObservationTableModel().fireTableDataChanged();
+ int routeIndex = flightUIModel.indexOfRoutes(route);
+ ui.getRouteTable().getSelectionModel().setSelectionInterval(routeIndex, routeIndex);
+ }
- if (FlightUIModel.PROPERTY_ROUTE_EDIT_BEAN.equals(evt.getPropertyName())) {
+ private PropertyChangeListener observationTimeChangeListener = new PropertyChangeListener() {
- Route oldValue = (Route) evt.getOldValue();
- if (oldValue != null) {
- updateObservationTable(oldValue, false);
- }
- Route newValue = (Route) evt.getNewValue();
- if (newValue != null) {
- updateObservationTable(newValue, true);
- }
-
- } else if (ui.getFlightUIModel().sizeObservations() > 0) {
-
- ui.getObservationTableModel().fireTableRowsUpdated(
- 0, ui.getFlightUIModel().sizeObservations() - 1);
- }
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ selectRouteByObservation((Observation) evt.getSource());
}
};
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-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/ObservationTableModel.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -79,7 +79,7 @@
public boolean isCellEditable(int row, int column) {
Observation observation = getBean(row);
ObservationColumn observationColumn = ObservationColumn.valueOf(column);
- boolean result = observationColumn.isEditable(observation);
+ boolean result = observationColumn.isEditable(observation, flightUIModel.isValidationMode());
return result;
}
@@ -133,7 +133,13 @@
public enum ObservationColumn {
OBSERVATION_NUMBER(false, int.class, Observation.PROPERTY_OBSERVATION_NUMBER),
- OBSERVATION_TIME(false, Date.class, Observation.PROPERTY_OBSERVATION_TIME),
+ OBSERVATION_TIME(true, Date.class, Observation.PROPERTY_OBSERVATION_TIME) {
+
+ @Override
+ public boolean isEditable(Observation bean, boolean validationMode) {
+ return super.isEditable(bean, validationMode) && validationMode;
+ }
+ },
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) {
@@ -231,7 +237,7 @@
}
}
- public boolean isEditable(Observation bean) {
+ public boolean isEditable(Observation bean, boolean validationMode) {
boolean result = !bean.isValid() && editable;
return result;
}
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-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/RouteTableModel.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -82,7 +82,7 @@
public boolean isCellEditable(int row, int column) {
Route route = getRow(row);
RouteColumn routeColumn = RouteColumn.valueOf(column);
- boolean result = routeColumn.isEditable(route);
+ boolean result = routeColumn.isEditable(route, flightUIModel.isValidationMode());
return result;
}
@@ -129,7 +129,13 @@
protected enum RouteColumn {
EFFORT_NUMBER(false, Integer.class, Route.PROPERTY_EFFORT_NUMBER),
- BEGIN_TIME(false, Date.class, Route.PROPERTY_BEGIN_TIME),
+ BEGIN_TIME(true, Date.class, Route.PROPERTY_BEGIN_TIME) {
+
+ @Override
+ public boolean isEditable(Route bean, boolean validationMode) {
+ return super.isEditable(bean, validationMode) && validationMode;
+ }
+ },
ROUTE_TYPE(false, RouteType.class, Route.PROPERTY_ROUTE_TYPE),
TRANSECT(false, String.class,
Route.PROPERTY_TRANSECT_FLIGHT,
@@ -209,7 +215,7 @@
}
}
- public boolean isEditable(Route bean) {
+ public boolean isEditable(Route bean, boolean validationMode) {
boolean result = !bean.isValid() && editable;
return result;
}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TextCellEditor.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TextCellEditor.java 2012-08-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TextCellEditor.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -42,7 +42,11 @@
private static final long serialVersionUID = 1L;
public TextCellEditor() {
- super(new JTextField());
+ this(new JTextField());
+ }
+
+ public TextCellEditor(JTextField textField) {
+ super(textField);
setClickCountToStart(1);
getComponent().addFocusListener(new FocusListener() {
Added: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TimeCellEditor.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TimeCellEditor.java (rev 0)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TimeCellEditor.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -0,0 +1,90 @@
+package fr.ulr.sammoa.ui.swing.util;
+/*
+ * #%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 jaxx.runtime.swing.JAXXDatePicker;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.swing.JTable;
+import javax.swing.table.TableCellEditor;
+import java.awt.Component;
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * Created: 17/07/12
+ *
+ * @author fdesbois <desbois(a)codelutin.com>
+ */
+public class TimeCellEditor extends TextCellEditor implements TableCellEditor {
+
+ /** Logger. */
+ private static final Logger logger = LoggerFactory.getLogger(TimeCellEditor.class);
+
+ private static final long serialVersionUID = 1L;
+
+ protected JAXXDatePicker datePicker;
+
+ protected Calendar referenceCalendar;
+
+ public TimeCellEditor(JAXXDatePicker datePicker) {
+ super(datePicker.getEditor());
+ this.datePicker = datePicker;
+ this.referenceCalendar = Calendar.getInstance();
+ }
+
+ @Override
+ public Component getTableCellEditorComponent(JTable table,
+ Object value,
+ boolean isSelected,
+ int row,
+ int column) {
+ Date date = (Date) value;
+ referenceCalendar.setTime(date);
+
+ if (logger.isDebugEnabled()) {
+ logger.debug(String.format("Set editor date: %1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS", date));
+ }
+
+ datePicker.setDate(date);
+ return datePicker;
+ }
+
+ @Override
+ public Object getCellEditorValue() {
+
+ Calendar editCalendar = Calendar.getInstance();
+ editCalendar.setTime(datePicker.getDate());
+ editCalendar.set(Calendar.DATE, referenceCalendar.get(Calendar.DATE));
+ editCalendar.set(Calendar.MONTH, referenceCalendar.get(Calendar.MONTH));
+ editCalendar.set(Calendar.YEAR, referenceCalendar.get(Calendar.YEAR));
+
+ if (logger.isDebugEnabled()) {
+ logger.debug(String.format("Get editor date: %1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS", editCalendar.getTime()));
+ }
+
+ return editCalendar.getTime();
+ }
+}
Property changes on: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TimeCellEditor.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
1
0
r496 - in trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application: device device/audio flightController
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:48 +0200 (Thu, 30 Aug 2012)
New Revision: 496
Url: http://forge.codelutin.com/repositories/revision/sammoa/496
Log:
refs #1197 : integration of SammoaAudioRecorder (not working on file change)
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManager.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManagerProvider.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioRecorder.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerOnBoard.java
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManager.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManager.java 2012-08-30 13:27:33 UTC (rev 495)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManager.java 2012-08-30 13:27:48 UTC (rev 496)
@@ -45,7 +45,9 @@
*/
void start();
- /** Stop the device session */
+ /**
+ * Stop the device session
+ */
void stop();
/**
@@ -55,16 +57,24 @@
*/
void close() throws DeviceTechnicalException;
- /** @return the DeviceState */
+ /**
+ * @return the DeviceState
+ */
DeviceState getState();
- /** @param listener DeviceStateListener to add */
+ /**
+ * @param listener DeviceStateListener to add
+ */
void addDeviceStateListener(DeviceStateListener listener);
- /** @param listener DeviceStateListener to remove */
+ /**
+ * @param listener DeviceStateListener to remove
+ */
void removeDeviceStateListener(DeviceStateListener listener);
- /** @return all the listeners */
+ /**
+ * @return all the listeners
+ */
Set<DeviceStateListener> getDeviceStateListeners();
}
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManagerProvider.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManagerProvider.java 2012-08-30 13:27:33 UTC (rev 495)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManagerProvider.java 2012-08-30 13:27:48 UTC (rev 496)
@@ -31,7 +31,7 @@
import fr.ulr.sammoa.application.device.audio.AudioReader;
import fr.ulr.sammoa.application.device.audio.AudioReaderMock;
import fr.ulr.sammoa.application.device.audio.AudioRecorder;
-import fr.ulr.sammoa.application.device.audio.AudioRecorderDefault;
+import fr.ulr.sammoa.application.device.audio.SammoaAudioRecorder;
import fr.ulr.sammoa.application.device.gps.GpsConfig;
import fr.ulr.sammoa.application.device.gps.GpsHandler;
import fr.ulr.sammoa.application.device.gps.GpsLocationListener;
@@ -145,7 +145,8 @@
@Override
public AudioRecorder get() {
- return new AudioRecorderDefault();
+// return new AudioRecorderDefault();
+ return new SammoaAudioRecorder(44100, 16);
}
});
return result;
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioRecorder.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioRecorder.java 2012-08-30 13:27:33 UTC (rev 495)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioRecorder.java 2012-08-30 13:27:48 UTC (rev 496)
@@ -25,14 +25,14 @@
package fr.ulr.sammoa.application.device.audio;
import com.google.common.base.Preconditions;
+import com.google.common.collect.Sets;
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 org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
@@ -40,8 +40,11 @@
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.TargetDataLine;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import java.io.File;
+import java.io.IOException;
+import java.util.Set;
+import java.util.Timer;
+import java.util.TimerTask;
/**
* Created: 16/05/12
@@ -50,11 +53,11 @@
*/
public class SammoaAudioRecorder implements AudioRecorder {
- private static final Logger log = LoggerFactory.getLogger(SammoaAudioRecorder.class);
+ private static final Logger logger = LoggerFactory.getLogger(SammoaAudioRecorder.class);
protected AudioFormat audioFormat;
- protected AudioFileFormat.Type outputType = AudioFileFormat.Type.WAVE;
+ protected AudioFileFormat.Type outputType;
protected DeviceState state;
@@ -62,13 +65,12 @@
protected AudioRecorderThread currentRecorder;
- public SammoaAudioRecorder(
- float sampleRate, // 8000,11025,16000,22050,44100
- int sampleSizeInBits // 8,16
- ) {
+ 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
+ boolean signed = true; // true,false
+ boolean bigEndian = false; // true,false
audioFormat = new AudioFormat(
sampleRate,
@@ -76,17 +78,14 @@
channels,
signed,
bigEndian);
+
+ outputType = AudioFileFormat.Type.WAVE;
+ listeners = Sets.newHashSet();
}
@Override
public DeviceState getState() {
- DeviceState result;
- if (currentRecorder == null) {
- result = DeviceState.READY;
- } else {
- result = DeviceState.RUNNING;
- }
- return result;
+ return state;
}
public void setState(DeviceState state, DeviceTechnicalException error) {
@@ -123,28 +122,36 @@
@Override
public void open() throws DeviceTechnicalException {
- // rien a faire
+ setState(DeviceState.READY, null);
}
@Override
public void start() {
- // rien a faire
+ // nothing to do
}
@Override
public void record(File outputFile, long delaySeconds) {
- Preconditions.checkArgument(outputFile != null);
+ Preconditions.checkNotNull(outputFile);
try {
// stop last started if necessary
stop();
// start new recorder thread
currentRecorder = new AudioRecorderThread(
- audioFormat, outputType, outputFile, delaySeconds);
+ audioFormat, outputType, outputFile, delaySeconds, this);
currentRecorder.start();
- } catch (Exception eee) {
- eee.printStackTrace();
- log.error("Can't record audio", eee);
+
+ setState(DeviceState.RUNNING, null);
+
+ } catch (LineUnavailableException ex) {
+ fireError("Error recording " + outputFile.getName(), ex);
+ } catch (IllegalArgumentException ex) {
+ fireError("Error recording " + outputFile.getName(), ex);
+ } catch (IllegalStateException ex) {
+ fireError("Error recording " + outputFile.getName(), ex);
+ } catch (SecurityException ex) {
+ fireError("Error recording " + outputFile.getName(), ex);
}
}
@@ -158,6 +165,7 @@
if (currentRecorder != null) {
currentRecorder.stopRecord();
currentRecorder = null;
+ setState(DeviceState.READY, null);
}
}
@@ -166,26 +174,40 @@
stop();
}
- static protected class AudioRecorderThread extends Thread{
+ protected void fireError(String message, Throwable cause) {
+ if (logger.isErrorEnabled()) {
+ logger.error(message, cause);
+ }
+ DeviceTechnicalException error = new DeviceTechnicalException(
+ this, message, cause);
+ setState(DeviceState.ERROR, error);
+ }
+
+ protected static class AudioRecorderThread extends Thread {
+
protected TargetDataLine targetDataLine;
protected AudioFileFormat.Type fileType;
- protected File filename;
+ protected File file;
protected long delayToClose;
protected AudioInputStream stream;
+ protected SammoaAudioRecorder audioRecorder;
- public AudioRecorderThread(
- AudioFormat audioFormat, AudioFileFormat.Type fileType,
- File filename, long delayToClose) throws LineUnavailableException {
+ public AudioRecorderThread(AudioFormat audioFormat,
+ AudioFileFormat.Type fileType,
+ File file,
+ long delayToClose,
+ SammoaAudioRecorder audioRecorder)
+ throws LineUnavailableException {
+
this.fileType = fileType;
- this.filename = filename;
+ this.file = file;
this.delayToClose = delayToClose;
+ this.audioRecorder = audioRecorder;
-
DataLine.Info dataLineInfo = new DataLine.Info(
TargetDataLine.class, audioFormat);
- targetDataLine = (TargetDataLine)
- AudioSystem.getLine(dataLineInfo);
+ targetDataLine = (TargetDataLine) AudioSystem.getLine(dataLineInfo);
AudioFormat.Encoding targetEncoding = AudioFormat.Encoding.ULAW;
targetDataLine.open(audioFormat);
@@ -200,29 +222,36 @@
* le parametre delayToClose passer lors de la construction du thread
*/
public void stopRecord() {
- System.out.println("Arret demande ...");
+ if (logger.isDebugEnabled()) {
+ logger.debug("Ask for stop record... close in {} seconds",
+ delayToClose);
+ }
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
targetDataLine.stop();
targetDataLine.close();
- System.out.println("... arret reel");
+ if (logger.isDebugEnabled()) {
+ logger.debug("Closing record: {}", file);
+ }
+
}
}, 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);
+ if (logger.isDebugEnabled()) {
+ logger.debug("Write audio to: {}", file);
}
+ try {
+ AudioSystem.write(stream, fileType, file);
+
+ } catch (IOException ex) {
+ audioRecorder.fireError("Error recording " + file.getName(), ex);
+ }
}
}
}
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerOnBoard.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerOnBoard.java 2012-08-30 13:27:33 UTC (rev 495)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerOnBoard.java 2012-08-30 13:27:48 UTC (rev 496)
@@ -88,7 +88,7 @@
if (state == FlightState.ON_EFFORT
|| currentRoute.getRouteType() == RouteType.CIRCLE_BACK) {
- saveAudio(0);
+ saveAudio(3);
}
}
}
@@ -141,7 +141,6 @@
if (RouteType.LEG == newRoute.getRouteType()
|| RouteType.CIRCLE_BACK == newRoute.getRouteType()) {
- // Stop previous recording after 3 seconds
saveAudio(3);
} else {
1
0