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
August 2012
- 4 participants
- 171 discussions
r380 - trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence
by tchemit@users.forge.codelutin.com 09 Aug '12
by tchemit@users.forge.codelutin.com 09 Aug '12
09 Aug '12
Author: tchemit
Date: 2012-08-09 19:26:32 +0200 (Thu, 09 Aug 2012)
New Revision: 380
Url: http://forge.codelutin.com/repositories/revision/sammoa/380
Log:
improve code
Modified:
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/StringRefs.java
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/StringRefs.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/StringRefs.java 2012-08-09 13:50:53 UTC (rev 379)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/StringRefs.java 2012-08-09 17:26:32 UTC (rev 380)
@@ -24,7 +24,6 @@
*/
import com.google.common.base.Function;
-import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import java.util.List;
@@ -40,14 +39,14 @@
public static List<StringRef> toRefs(List<String> strings) {
List<StringRef> result =
- Lists.newArrayList(Iterables.transform(strings, TO_STRING_REF_FUNCTION));
+ Lists.transform(strings, TO_STRING_REF_FUNCTION);
return result;
}
public static List<String> toStrings(List<StringRef> strings) {
List<String> result =
- Lists.newArrayList(Iterables.transform(strings, TO_STRING_FUNCTION));
+ Lists.transform(strings, TO_STRING_FUNCTION);
return result;
}
1
0
r379 - in trunk: sammoa-application/src/main/java/fr/ulr/sammoa/application sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight
by fdesbois@users.forge.codelutin.com 09 Aug '12
by fdesbois@users.forge.codelutin.com 09 Aug '12
09 Aug '12
Author: fdesbois
Date: 2012-08-09 15:50:53 +0200 (Thu, 09 Aug 2012)
New Revision: 379
Url: http://forge.codelutin.com/repositories/revision/sammoa/379
Log:
Improve orderings
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/FlightDAOImpl.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Flights.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Strates.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/StrateModel.java
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java 2012-08-09 09:48:59 UTC (rev 378)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java 2012-08-09 13:50:53 UTC (rev 379)
@@ -32,6 +32,7 @@
import fr.ulr.sammoa.persistence.Campaign;
import fr.ulr.sammoa.persistence.Flight;
import fr.ulr.sammoa.persistence.FlightDAO;
+import fr.ulr.sammoa.persistence.Flights;
import fr.ulr.sammoa.persistence.GeoPoint;
import fr.ulr.sammoa.persistence.GeoPointDAO;
import fr.ulr.sammoa.persistence.Observation;
@@ -103,8 +104,10 @@
FlightDAO dao = SammoaDAOHelper.getFlightDAO(transaction);
- result = dao.findAllByCampaignOrderedByBeginDateDesc(campaign);
+ result = dao.findAllByCampaign(campaign);
+ Collections.sort(result, Flights.onDate());
+
} catch (TopiaException e) {
throw new TopiaRuntimeException(e);
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-09 09:48:59 UTC (rev 378)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/FlightDAOImpl.java 2012-08-09 13:50:53 UTC (rev 379)
@@ -27,8 +27,6 @@
import org.nuiton.topia.TopiaException;
import org.nuiton.topia.TopiaRuntimeException;
-import java.util.List;
-
/**
* Created: 08/06/12
*
@@ -60,23 +58,23 @@
return result;
}
- 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;
- }
+// 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/Flights.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Flights.java 2012-08-09 09:48:59 UTC (rev 378)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Flights.java 2012-08-09 13:50:53 UTC (rev 379)
@@ -25,7 +25,11 @@
import com.google.common.base.Function;
import com.google.common.base.Predicate;
+import com.google.common.collect.ComparisonChain;
+import com.google.common.collect.Ordering;
+import java.util.Comparator;
+
/**
* Created: 19/07/12
*
@@ -36,6 +40,10 @@
private Flights() {
// static class do not have instanciation
}
+
+ public static Comparator<Flight> onDate() {
+ return ON_DATE_COMPARATOR;
+ }
public static Function<Flight, String> toSystemId() {
return TO_SYSTEM_ID_FUNCTION;
@@ -80,4 +88,33 @@
return input == null || systemId.equals(input.getSystemId());
}
}
+
+ protected static Comparator<Flight> ON_DATE_COMPARATOR =
+ new Comparator<Flight>() {
+
+ @Override
+ public int compare(Flight flight1, Flight flight2) {
+ int result = ComparisonChain
+ .start()
+ // on beginDate, first null
+ .compare(
+ flight1.getBeginDate(),
+ flight2.getBeginDate(),
+ Ordering.natural().reverse().nullsFirst()
+ )
+ // on endDate null
+ .compareTrueFirst(
+ flight1.getEndDate() == null,
+ flight2.getEndDate() == null
+ )
+ // on flightNumber
+ .compare(
+ flight1.getFlightNumber(),
+ flight2.getFlightNumber(),
+ Ordering.natural().reverse()
+ )
+ .result();
+ return result;
+ }
+ };
}
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Strates.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Strates.java 2012-08-09 09:48:59 UTC (rev 378)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Strates.java 2012-08-09 13:50:53 UTC (rev 379)
@@ -26,6 +26,7 @@
import com.google.common.base.Function;
import com.google.common.base.Preconditions;
import com.google.common.base.Predicate;
+import com.google.common.collect.Ordering;
import java.util.Comparator;
@@ -89,19 +90,9 @@
@Override
public int compare(Strate o1, Strate o2) {
- int result;
- if (o1 == null && o2 != null) {
- result = -1;
-
- } else if (o1 != null && o2 == null) {
- result = 1;
-
- } else if (o1 == null) {
- result = 0;
-
- } else {
- result = o1.getCode().compareTo(o2.getCode());
- }
+ int result = Ordering.natural()
+ .nullsFirst()
+ .compare(o1.getCode(), o2.getCode());
return result;
}
};
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java 2012-08-09 09:48:59 UTC (rev 378)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java 2012-08-09 13:50:53 UTC (rev 379)
@@ -305,7 +305,7 @@
}
List<StrateModel> result =
- Ordering.from(StrateModel.onCode()).sortedCopy(strateMap.values());
+ Ordering.natural().sortedCopy(strateMap.values());
result.add(0, strateAll);
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/StrateModel.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/StrateModel.java 2012-08-09 09:48:59 UTC (rev 378)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/StrateModel.java 2012-08-09 13:50:53 UTC (rev 379)
@@ -29,7 +29,6 @@
import fr.ulr.sammoa.persistence.Strates;
import fr.ulr.sammoa.ui.swing.BaseModel;
-import java.util.Comparator;
import java.util.List;
/**
@@ -37,7 +36,7 @@
*
* @author fdesbois <desbois(a)codelutin.com>
*/
-public class StrateModel extends BaseModel {
+public class StrateModel extends BaseModel implements Comparable<StrateModel> {
private static final long serialVersionUID = 1L;
@@ -76,28 +75,16 @@
firePropertyChange(PROPERTY_TRANSECTS, oldValue, transects);
}
- public static Comparator<StrateModel> onCode() {
- return ON_CODE_COMPARATOR;
+ @Override
+ public int compareTo(StrateModel o) {
+ int result = Strates.onCode().compare(getSource(), o.getSource());
+ return result;
}
public static Predicate<StrateModel> withStrate(Strate strate) {
return new StrateModelWithStratePredicate(strate);
}
- protected static Comparator<StrateModel> ON_CODE_COMPARATOR =
- new Comparator<StrateModel>() {
-
- Comparator<Strate> strateComparator = Strates.onCode();
-
- @Override
- public int compare(StrateModel o1, StrateModel o2) {
- Strate strate1 = o1.getSource();
- Strate strate2 = o2.getSource();
- int result = strateComparator.compare(strate1, strate2);
- return result;
- }
- };
-
protected static class StrateModelWithStratePredicate
implements Predicate<StrateModel> {
1
0
r378 - in trunk: sammoa-application/src/main/java/fr/ulr/sammoa/application/map src/site/rst
by tchemit@users.forge.codelutin.com 09 Aug '12
by tchemit@users.forge.codelutin.com 09 Aug '12
09 Aug '12
Author: tchemit
Date: 2012-08-09 11:48:59 +0200 (Thu, 09 Aug 2012)
New Revision: 378
Url: http://forge.codelutin.com/repositories/revision/sammoa/378
Log:
refs #1203: Export SHP (add efforts and observations export model + fix doc)
Added:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/LegStatus.java
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/ExportMapService.java
trunk/src/site/rst/import-export.rst
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/ExportMapService.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/ExportMapService.java 2012-08-09 09:47:55 UTC (rev 377)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/ExportMapService.java 2012-08-09 09:48:59 UTC (rev 378)
@@ -80,29 +80,252 @@
}
public void exportEffortsMap(ExportMapModel dataModel) {
+ Preconditions.checkNotNull(dataModel.getCampaign());
+ Preconditions.checkNotNull(dataModel.getBeginDate());
+ Preconditions.checkNotNull(dataModel.getEndDate());
+
if (logger.isInfoEnabled()) {
- logger.info("Start EffortsMap export to " +
- dataModel.getExportDirectory() + "::" +
+ logger.info("Start EffortsMap export to {} :: {}",
+ dataModel.getExportDirectory(),
dataModel.getExportFilename());
}
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
+ long startTime = TimeLog.getTime();
+ Campaign campaign = dataModel.getCampaign();
+ Region region = campaign.getRegion();
+
+ // * uniquement pour un parcours de type LEG, sinon la cellule sera vide
+ // ** uniquement pour un parcours de type CIRCLE_BACK, sinon la cellule sera vide
+ DbfTableModelBuilder builder = new DbfTableModelBuilder()
+ .stringColumn("REGION") // (campaign.region.code)
+ .stringColumn("CAMPAIGN") // (campaign.code)
+ .integerColumn("SECTOR") // * (route.transectFlight.transect.strate.sector.sectorNumber)
+ .stringColumn("STRATE_TYPE") // * (route.transectFlight.transect.strate.strateType.code)
+ .stringColumn("STRATE") // * (route.transectFlight.transect.strate.code)
+ .stringColumn("TRANSECT") // * (route.transectFlight.transect.name)
+ .integerColumn("PASSAGE") // * (route.transectFlight.crossingNumber)
+ .integerColumn("FLIGHT") // (route.flight.flightNumber)
+ .stringColumn("COMPUTER") // (route.flight.systemId)
+ .stringColumn("ROUTE_TYPE") // (route.routeType.name)
+ .stringColumn("EFFORT_GROUP") // * ()
+ .stringColumn("EFFORT") // * ()
+ .stringColumn("STATUS") // * (LegStatus.name)
+ .dateColumn("DATE") // (route.beginTime)
+ .stringColumn("HHMMSS") // (format(route.beginTime, "HHmmss"))
+ .integerColumn("SEA_STATE") // (route.seaState)
+ .integerColumn("SWELL") // (route.swell)
+ .integerColumn("TURBIDITY") // (route.turbidity)
+ .integerColumn("SKY_GLINT") // (route.skyGlint)
+ .stringColumn("GLARE_FROM") // (route.glareFrom)
+ .stringColumn("GLARE_TO") // (route.glareTo)
+ .integerColumn("GLARE_SEVERITY") // (route.glareSeverity)
+ .booleanColumn("GLARE_UNDER") // (route.glareUnder)
+ .integerColumn("CLOUD_COVER") // (route.cloudCover)
+ .stringColumn("SUBJECTIVE") // (route.subjectiveConditions)
+ .stringColumn("UNEXP_LEFT") // (route.unexpectedLeft)
+ .stringColumn("UNEXP_RIGHT") // (route.unexpectedRight)
+ .stringColumn("LEFT_REAR") // (route.observerPosition[FRONT_LEFT].observer.initials)
+ .stringColumn("RIGHT_REAR") // (route.observerPosition[FRONT_RIGHT].observer.initials)
+ .stringColumn("CENTER") // (route.observerPosition[NAVIGATOR].observer.initials)
+ .stringColumn("CB_CAUSE") // ** ()
+ .doubleColumn("LAT", 19, 11) // (geoPoint.latitude)
+ .doubleColumn("LON", 19, 11) // (geoPoint.longitude)
+ .doubleColumn("SPEED", 19, 11) // (geoPoint.speed)
+ .doubleColumn("ALTITUDE", 19, 11) // (geoPoint.altitude)
+ .stringColumn("GPS_TIME") // (format(geoPoint.recordTime, "HHmmss"))
+ .stringColumn("AIRCRAFT") // (route.flight.planeImmatriculation)
+ .stringColumn("COMMENT") // (route.comment)
+ .build();
+
+ EsriGraphicList graphicList = new EsriPointList();
+ List<Flight> campaignFlights = context.getFlightService().getFlights(dataModel.getCampaign());
+
+ // Filter on period
+ final PeriodDates period = new PeriodDates(dataModel.getBeginDate(), dataModel.getEndDate());
+ Iterable<Flight> flights = Iterables.filter(campaignFlights, new Predicate<Flight>() {
+
+ @Override
+ public boolean apply(Flight input) {
+ return period.between(input.getBeginDate());
+ }
+ });
+
+ // Export for each flight
+ for (Flight flight : flights) {
+
+ if (logger.isInfoEnabled()) {
+ logger.info("Export GeoPoints from flight {} - {} - {} - {}",
+ new Object[]{flight.getFlightNumber(),
+ flight.getSystemId(),
+ campaign.getCode(),
+ region.getCode()}
+ );
+ }
+
+ List<GeoPoint> geoPoints = context.getFlightService().getFlightGeoPoints(flight);
+
+ // One record by GeoPoint
+ for (GeoPoint geoPoint : geoPoints) {
+
+ Map<String, Object> record = Maps.newHashMap();
+
+ record.put("REGION", region.getCode());
+ record.put("CAMPAIGN", campaign.getCode());
+ record.put("FLIGHT", flight.getFlightNumber());
+ record.put("COMPUTER", flight.getSystemId());
+ record.put("DATE", geoPoint.getRecordTime());
+ record.put("HHMMSS", timeFormat.format(geoPoint.getRecordTime()));
+ record.put("LAT", geoPoint.getLatitude());
+ record.put("LON", geoPoint.getLongitude());
+ record.put("SPEED", geoPoint.getSpeed());
+ record.put("ALTITUDE", geoPoint.getAltitude());
+
+ builder.addValues(record);
+
+ if (logger.isTraceEnabled()) {
+ logger.trace("Record={}", record);
+ }
+
+ OMGraphic graphic = new OMPoint(geoPoint.getLatitude(), geoPoint.getLongitude());
+ graphicList.add(graphic);
+ }
}
+
+ startTime = timeLog.log(startTime, "exportGeoPointsMap", "after building EsriGraphicList and DbfTableModel");
+
+ // Execute export with EsriShapeExport
+ DbfTableModel tableModel = builder.getModel();
+ String pathFile = new File(dataModel.getExportDirectory(), dataModel.getExportFilename()).getAbsolutePath();
+ EsriShapeExport shapeExport = new EsriShapeExport(graphicList, tableModel, pathFile);
+ shapeExport.export();
+
+ timeLog.log(startTime, "exportEffortsMap", "after EsriShapeExport execution");
}
public void exportObservationsMap(ExportMapModel dataModel) {
+ Preconditions.checkNotNull(dataModel.getCampaign());
+ Preconditions.checkNotNull(dataModel.getBeginDate());
+ Preconditions.checkNotNull(dataModel.getEndDate());
+
if (logger.isInfoEnabled()) {
- logger.info("Start ObservationsMap export to " +
- dataModel.getExportDirectory() + "::" +
+ logger.info("Start ObservationsMap export to {} :: {}",
+ dataModel.getExportDirectory(),
dataModel.getExportFilename());
}
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
+ long startTime = TimeLog.getTime();
+ Campaign campaign = dataModel.getCampaign();
+ Region region = campaign.getRegion();
+
+ // * uniquement pour un parcours de type LEG, sinon la cellule sera vide
+ // ** uniquement pour un parcours de type CIRCLE_BACK, sinon la cellule sera vide
+ DbfTableModelBuilder builder = new DbfTableModelBuilder()
+ .stringColumn("REGION") // (campaign.region.code)
+ .stringColumn("CAMPAIGN") // (campaign.code)
+ .integerColumn("SECTOR") // * (route.transectFlight.transect.strate.sector.sectorNumber)
+ .stringColumn("STRATE_TYPE") // * (route.transectFlight.transect.strate.strateType.code)
+ .stringColumn("STRATE") // * (route.transectFlight.transect.strate.code)
+ .stringColumn("TRANSECT") // * (route.transectFlight.transect.name)
+ .integerColumn("PASSAGE") // * (route.transectFlight.crossingNumber)
+ .integerColumn("FLIGHT") // (route.flight.flightNumber)
+ .stringColumn("COMPUTER") // (route.flight.systemId)
+ .stringColumn("ROUTE_TYPE") // (route.routeType.name)
+ .stringColumn("EFFORT_GROUP") // * ()
+ .stringColumn("EFFORT") // * ()
+ .stringColumn("OBSERVATION") // ()
+ .dateColumn("DATE") // (observation.beginTime)
+ .stringColumn("HHMMSS") // (format(observation.beginTime, "HHmmss"))
+ .stringColumn("TAXON") // (observation.species.type)
+ .stringColumn("GROUP") // (observation.species.groupName)
+ .stringColumn("FAMILY") // (observation.species.family)
+ .stringColumn("SPECIES") // (observation.species.code)
+ .stringColumn("SPECIES_NAME") // (observation.species.commonName)
+ .stringColumn("SPECIES_LATIN") // (observation.species.latinName)
+ .integerColumn("POD_SIZE") // (observation.podSize)
+ .stringColumn("AGE") // (observation.age)
+ .integerColumn("DEC_ANGLE") // (observation.decAngle)
+ .stringColumn("CUE") // (observation.cue)
+ .stringColumn("BEHAVIOUR") // (observation.behaviour)
+ .integerColumn("SWIM_DIR") // (observation.swimDir)
+ .stringColumn("CALVES") // (observation.calves)
+ .stringColumn("PHOTO") // (observation.photo)
+ .stringColumn("OBSERVER") // (observation.observerPosition.observer.initials)
+ .stringColumn("SIDE") // (observation.observerPosition.observer.position.name)
+ .stringColumn("STATUS") // (observation.observationStatus.name)
+ .stringColumn("CB_CAUSE") // ** ()
+ .doubleColumn("LAT", 19, 11) // (geoPoint.latitude)
+ .doubleColumn("LON", 19, 11) // (geoPoint.longitude)
+ .doubleColumn("SPEED", 19, 11) // (geoPoint.speed)
+ .doubleColumn("ALTITUDE", 19, 11) // (geoPoint.altitude)
+ .stringColumn("GPS_TIME") // (format(geoPoint.recordTime, "HHmmss"))
+ .stringColumn("AIRCRAFT") // (observation.flight.planeImmatriculation)
+ .stringColumn("COMMENT") // (observation.comment)
+ .build();
+
+ EsriGraphicList graphicList = new EsriPointList();
+ List<Flight> campaignFlights = context.getFlightService().getFlights(dataModel.getCampaign());
+
+ // Filter on period
+ final PeriodDates period = new PeriodDates(dataModel.getBeginDate(), dataModel.getEndDate());
+ Iterable<Flight> flights = Iterables.filter(campaignFlights, new Predicate<Flight>() {
+
+ @Override
+ public boolean apply(Flight input) {
+ return period.between(input.getBeginDate());
+ }
+ });
+
+ // Export for each flight
+
+ for (Flight flight : flights) {
+
+ if (logger.isInfoEnabled()) {
+ logger.info("Export GeoPoints from flight {} - {} - {} - {}",
+ new Object[]{flight.getFlightNumber(),
+ flight.getSystemId(),
+ campaign.getCode(),
+ region.getCode()}
+ );
+ }
+
+ List<GeoPoint> geoPoints = context.getFlightService().getFlightGeoPoints(flight);
+
+ // One record by GeoPoint
+ for (GeoPoint geoPoint : geoPoints) {
+
+ Map<String, Object> record = Maps.newHashMap();
+
+ record.put("REGION", region.getCode());
+ record.put("CAMPAIGN", campaign.getCode());
+ record.put("FLIGHT", flight.getFlightNumber());
+ record.put("COMPUTER", flight.getSystemId());
+ record.put("DATE", geoPoint.getRecordTime());
+ record.put("HHMMSS", timeFormat.format(geoPoint.getRecordTime()));
+ record.put("LAT", geoPoint.getLatitude());
+ record.put("LON", geoPoint.getLongitude());
+ record.put("SPEED", geoPoint.getSpeed());
+ record.put("ALTITUDE", geoPoint.getAltitude());
+
+ builder.addValues(record);
+
+ if (logger.isTraceEnabled()) {
+ logger.trace("Record={}", record);
+ }
+
+ OMGraphic graphic = new OMPoint(geoPoint.getLatitude(), geoPoint.getLongitude());
+ graphicList.add(graphic);
+ }
}
+
+ startTime = timeLog.log(startTime, "exportObservationsMap", "after building EsriGraphicList and DbfTableModel");
+
+ // Execute export with EsriShapeExport
+ DbfTableModel tableModel = builder.getModel();
+ String pathFile = new File(dataModel.getExportDirectory(), dataModel.getExportFilename()).getAbsolutePath();
+ EsriShapeExport shapeExport = new EsriShapeExport(graphicList, tableModel, pathFile);
+ shapeExport.export();
+
+ timeLog.log(startTime, "exportObservationsMap", "after EsriShapeExport execution");
}
public void exportGeoPointsMap(ExportMapModel dataModel) {
@@ -111,8 +334,8 @@
Preconditions.checkNotNull(dataModel.getEndDate());
if (logger.isInfoEnabled()) {
- logger.info("Start GeoPointsMap export to " +
- dataModel.getExportDirectory() + "::" +
+ logger.info("Start GeoPointsMap export to {} :: {}",
+ dataModel.getExportDirectory(),
dataModel.getExportFilename());
}
@@ -148,15 +371,14 @@
});
// Export for each flight
- Map<String, Object> record = Maps.newHashMap();
for (Flight flight : flights) {
if (logger.isInfoEnabled()) {
logger.info(String.format("Export GeoPoints from flight %d - %s - %s - %s",
- flight.getFlightNumber(),
- flight.getSystemId(),
- campaign.getCode(),
- region.getCode())
+ flight.getFlightNumber(),
+ flight.getSystemId(),
+ campaign.getCode(),
+ region.getCode())
);
}
@@ -165,7 +387,7 @@
// One record by GeoPoint
for (GeoPoint geoPoint : geoPoints) {
- record.clear();
+ Map<String, Object> record = Maps.newHashMap();
record.put("REGION", region.getCode());
record.put("CAMPAIGN", campaign.getCode());
Added: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/LegStatus.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/LegStatus.java (rev 0)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/LegStatus.java 2012-08-09 09:48:59 UTC (rev 378)
@@ -0,0 +1,16 @@
+package fr.ulr.sammoa.application.map;
+
+/**
+ * TODO
+ *
+ * @author tchemit <chemit(a)codelutin.com>
+ * @since 0.5
+ */
+public enum LegStatus {
+ BEAGIN,
+ ADD, END;
+
+ public String getName() {
+ return name();
+ }
+}
Property changes on: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/LegStatus.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision
Added: svn:eol-style
+ native
Modified: trunk/src/site/rst/import-export.rst
===================================================================
--- trunk/src/site/rst/import-export.rst 2012-08-09 09:47:55 UTC (rev 377)
+++ trunk/src/site/rst/import-export.rst 2012-08-09 09:48:59 UTC (rev 378)
@@ -203,19 +203,19 @@
- REGION : Code de la région
- * route.flight.campaign.region.code
+ * campaign.region.code
- CAMPAIGN : Code de la campagne
- * route.flight.campaign.code
+ * campaign.code
-- SECTOR* : Numéro du secteur
+- SECTOR* : Numéro du secteur (N)
* route.transectFlight.transect.strate.sector.sectorNumber
- STRATE_TYPE* : Type de strate
- * route.transectFlight.transect.strate.strateType
+ * route.transectFlight.transect.strate.strateType.code
- STRATE* : Code de la strate
@@ -225,11 +225,11 @@
* route.transectFlight.transect.name
-- PASSAGE* : Numéro de passage
+- PASSAGE* : Numéro de passage (N)
* route.transectFlight.crossingNumber
-- FLIGHT : Numéro de vol
+- FLIGHT : Numéro de vol (N)
* route.flight.flightNumber
@@ -239,7 +239,7 @@
- ROUTE_TYPE : Type de parcours (LEG, TRANSIT, CIRCLE_BACK)
- * route.routeType
+ * route.routeType.name
- EFFORT_GROUP* : Identifiant du group d'effort
@@ -250,15 +250,13 @@
* "L" + route.effortNumber + "-" + route.flight.flightNumber + "-" + route.flight.systemId
+- STATUS* : LegStatus.name (BEGIN, ADD, END)
-
-- STATUS* : Status (BEGIN, ADD, END)
-
* si route.routeType = TRANSIT ou CIRCLE_BACK => ajout d'une ligne END (ensuite currentLegGroup = null)
* si previousRoute.routeType = TRANSIT ou CIRCLE_BACK (ou currentLegGroup = null) => BEGIN
* si previousRoute.routeType = LEG et nextRoute.routeType = LEG (ou currentLegGroup != null) => ADD
-- DATE : Date du parcours/segment
+- DATE : Date du parcours/segment (D)
* route.beginTime
@@ -266,19 +264,19 @@
* format(route.beginTime, "HHmmss")
-- SEA_STATE : Etat de la mer
+- SEA_STATE : Etat de la mer (N)
* route.seaState
-- SWELL : Houle
+- SWELL : Houle (N)
* route.swell
-- TURBIDITY : Turbidité
+- TURBIDITY : Turbidité (N)
* route.turbidity
-- SKY_GLINT : Transparence
+- SKY_GLINT : Transparence (N)
* route.skyGlint
@@ -290,15 +288,15 @@
* route.glareTo
-- GLARE_SEVERITY : Intensité d'éblouissement
+- GLARE_SEVERITY : Intensité d'éblouissement (N)
* route.glareSeverity
-- GLARE_UNDER :
+- GLARE_UNDER : (L)
* route.glareUnder
-- CLOUD_COVER : Couverture nuageuse
+- CLOUD_COVER : Couverture nuageuse (N)
* route.cloudCover
@@ -326,26 +324,23 @@
* route.observerPosition[NAVIGATOR].observer.initials
-
-
-
- CB_CAUSE** : Cause du circle-back
* "O" + route.circleBackCause.observationNumber + "-" + route.circleBackCause.flight.flightNumber + "-" + route.circleBackCause.flight.systemId
-- LAT : Latitude du point GPS
+- LAT : Latitude du point GPS (N)
* geoPoint.latitude
-- LON : Longitude du point GPS
+- LON : Longitude du point GPS (N)
* geoPoint.longitude
-- SPEED : Vitesse de l'avion à ce point GPS
+- SPEED : Vitesse de l'avion à ce point GPS (N)
* geoPoint.speed
-- ALTITUDE : Altitude de l'avion à ce point GPS
+- ALTITUDE : Altitude de l'avion à ce point GPS (N)
* geoPoint.altitude
@@ -387,7 +382,7 @@
* observation.flight.campaign.code
-- SECTOR* : Numéro du secteur
+- SECTOR* : Numéro du secteur (N)
* route.transectFlight.transect.strate.sector.sectorNumber
@@ -403,11 +398,11 @@
* route.transectFlight.transect.name
-- PASSAGE* : Numéro de passage
+- PASSAGE* : Numéro de passage (N)
* route.transectFlight.crossingNumber
-- FLIGHT : Numéro de vol
+- FLIGHT : Numéro de vol (N)
* route.flight.flightNumber
@@ -417,7 +412,7 @@
- ROUTE_TYPE : Type de parcours (LEG, TRANSIT, CIRCLE_BACK)
- * route.routeType
+ * route.routeType.name
- EFFORT_GROUP* : Identifiant du group d'effort
@@ -432,7 +427,7 @@
* "O" + observation.observationNumber + "-" + observation.flight.flightNumber + "-" + observation.flight.systemId
-- DATE : Date de l'observation
+- DATE : Date de l'observation (D)
* observation.beginTime
@@ -464,7 +459,7 @@
* observation.species.latinName
-- POD_SIZE : Taille des groupes
+- POD_SIZE : Taille des groupes (N)
* observation.podSize
@@ -472,7 +467,7 @@
* observation.age
-- DEC_ANGLE : Angle ou Bande
+- DEC_ANGLE : Angle ou Bande (N)
* observation.decAngle
@@ -484,7 +479,7 @@
* observation.behaviour
-- SWIM_DIR : Direction de nage
+- SWIM_DIR : Direction de nage (N)
* observation.swimDir
@@ -502,32 +497,29 @@
- SIDE : Position de l'observateur (L : LEFT, R : RIGHT, C : CENTER)
- * observation.observerPosition.observer.position
+ * observation.observerPosition.observer.position.name
- STATUS : Status de l'observation (NEW, CIRCLE_BACK, RECAPTURE, NO_RECAPTURE)
- * observation.observationStatus
+ * observation.observationStatus.name
-
-
-
- CB_CAUSE** : Cause du circle-back
* "O" + route.circleBackCause.observationNumber + "-" + route.circleBackCause.flight.flightNumber + "-" + route.circleBackCause.flight.systemId
-- LAT : Latitude du point GPS
+- LAT : Latitude du point GPS (N)
* geoPoint.latitude
-- LON : Longitude du point GPS
+- LON : Longitude du point GPS (N)
* geoPoint.longitude
-- SPEED : Vitesse de l'avion à ce point GPS
+- SPEED : Vitesse de l'avion à ce point GPS (N)
* geoPoint.speed
-- ALTITUDE : Altitude de l'avion à ce point GPS
+- ALTITUDE : Altitude de l'avion à ce point GPS (N)
* geoPoint.altitude
1
0
r377 - trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map
by tchemit@users.forge.codelutin.com 09 Aug '12
by tchemit@users.forge.codelutin.com 09 Aug '12
09 Aug '12
Author: tchemit
Date: 2012-08-09 11:47:55 +0200 (Thu, 09 Aug 2012)
New Revision: 377
Url: http://forge.codelutin.com/repositories/revision/sammoa/377
Log:
add boolean support in dbf export model builder
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/DbfTableModelBuilder.java
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/DbfTableModelBuilder.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/DbfTableModelBuilder.java 2012-08-09 09:47:24 UTC (rev 376)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/DbfTableModelBuilder.java 2012-08-09 09:47:55 UTC (rev 377)
@@ -77,10 +77,20 @@
return result;
}
+ public DbfColumnModel newBooleanColumn(String name) {
+ DbfColumnModel result = new DbfColumnModel(name, DbfTableModel.TYPE_LOGICAL);
+ result.setLength(1);
+ return result;
+ }
+
public DbfTableModelBuilder stringColumn(String name) {
return dbfColumn(newStringColumn(name));
}
+ public DbfTableModelBuilder booleanColumn(String name) {
+ return dbfColumn(newBooleanColumn( name ));
+ }
+
public DbfTableModelBuilder integerColumn(String name) {
return dbfColumn(newIntegerColumn(name));
}
@@ -171,6 +181,8 @@
result = DATE_FORMAT.format(date);
}
+ }else if (DbfTableModel.TYPE_LOGICAL == type) {
+ result = ( (Boolean) value ) ? "T" : "F";
}
return result;
}
1
0
Author: tchemit
Date: 2012-08-09 11:47:24 +0200 (Thu, 09 Aug 2012)
New Revision: 376
Url: http://forge.codelutin.com/repositories/revision/sammoa/376
Log:
remove obsolete directory
Removed:
trunk/doc/
1
0
r375 - trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence
by tchemit@users.forge.codelutin.com 09 Aug '12
by tchemit@users.forge.codelutin.com 09 Aug '12
09 Aug '12
Author: tchemit
Date: 2012-08-09 11:47:15 +0200 (Thu, 09 Aug 2012)
New Revision: 375
Url: http://forge.codelutin.com/repositories/revision/sammoa/375
Log:
move some generated code to none generated code
Added:
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/ObservationStatus.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Position.java
Added: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/ObservationStatus.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/ObservationStatus.java (rev 0)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/ObservationStatus.java 2012-08-09 09:47:15 UTC (rev 375)
@@ -0,0 +1,13 @@
+package fr.ulr.sammoa.persistence;
+
+
+public enum ObservationStatus {
+ RECAPTURE,
+ NEW,
+ NO_RECAPTURE,
+ CIRCLE_BACK;
+
+ public String getName() {
+ return name();
+ }
+} //ObservationStatus
Property changes on: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/ObservationStatus.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision
Added: svn:eol-style
+ native
Added: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Position.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Position.java (rev 0)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Position.java 2012-08-09 09:47:15 UTC (rev 375)
@@ -0,0 +1,14 @@
+package fr.ulr.sammoa.persistence;
+
+public enum Position {
+ NAVIGATOR,
+ FRONT_LEFT,
+ FRONT_RIGHT,
+ BACK_LEFT,
+ BACK_RIGHT,
+ CO_NAVIGATOR;
+
+ public String getName() {
+ return name();
+ }
+} //Position
Property changes on: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Position.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision
Added: svn:eol-style
+ native
1
0
09 Aug '12
Author: fdesbois
Date: 2012-08-09 11:35:36 +0200 (Thu, 09 Aug 2012)
New Revision: 374
Url: http://forge.codelutin.com/repositories/revision/sammoa/374
Log:
Fix some bugs + add some minor improvements
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/main/java/fr/ulr/sammoa/application/device/DeviceTechnicalException.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/BaseGpsHandler.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPoints.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/SammoaUIContext.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/CircleBackAction.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/flight/FlightUIHandler.java
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/util/Importer.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/ShpImporter.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-08 18:26:33 UTC (rev 373)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java 2012-08-09 09:35:36 UTC (rev 374)
@@ -745,7 +745,7 @@
logger.trace(String.format(
"ObserverPosition : %s, %s, %s",
elmt.getTopiaId(),
- elmt.getObserver().getInitials(),
+ (elmt.getObserver() != null ? elmt.getObserver().getInitials() : "N/A"),
elmt.getPosition())
);
}
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-08 18:26:33 UTC (rev 373)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaConfig.java 2012-08-09 09:35:36 UTC (rev 374)
@@ -476,7 +476,7 @@
KEY_ADD("ui." + PROPERTY_ADD,
_("sammoa.config.ui.add"),
- "pressed F6",
+ "pressed F7",
KeyStroke.class,
false,
false),
@@ -504,7 +504,7 @@
KEY_CIRCLE_BACK("ui." + PROPERTY_CIRCLE_BACK,
_("sammoa.config.ui.circleBack"),
- "pressed F7",
+ "pressed F11",
KeyStroke.class,
false,
false);
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceTechnicalException.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceTechnicalException.java 2012-08-08 18:26:33 UTC (rev 373)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceTechnicalException.java 2012-08-09 09:35:36 UTC (rev 374)
@@ -43,6 +43,14 @@
this.source = source;
}
+ public String getMessageWithCause() {
+ String result = getMessage();
+ if (getCause() != null) {
+ result += " : " + getCause().getMessage();
+ }
+ return result;
+ }
+
public DeviceManager getSource() {
return source;
}
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/BaseGpsHandler.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/BaseGpsHandler.java 2012-08-08 18:26:33 UTC (rev 373)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/BaseGpsHandler.java 2012-08-09 09:35:36 UTC (rev 374)
@@ -117,8 +117,10 @@
@Override
public void stop() {
- timer.cancel();
- timer = null;
+ if (timer != null) {
+ timer.cancel();
+ timer = null;
+ }
}
@Override
@@ -179,9 +181,7 @@
} catch (DeviceTechnicalException ex) {
// We use ERROR, because this task is during start
- // Error is generally the same as previous one from first open() call,
- // no need to propagate it
- setState(DeviceState.ERROR, null);
+ setState(DeviceState.ERROR, ex);
if (logger.isErrorEnabled()) {
logger.error("Can't open GPS device. Try again in "
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-08 18:26:33 UTC (rev 373)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPoints.java 2012-08-09 09:35:36 UTC (rev 374)
@@ -46,18 +46,21 @@
List<GeoPoint> result = Lists.newArrayList();
- List<Date> geoPointDates = FluentIterable
- .from(geoPoints)
- .transform(toDate())
- .toSortedImmutableList(Ordering.natural());
+ if (!geoPoints.isEmpty()) {
- int index = 0;
- for (Date date : dates) {
+ List<Date> geoPointDates = FluentIterable
+ .from(geoPoints)
+ .transform(toDate())
+ .toSortedImmutableList(Ordering.natural());
- // We continue starting from the previous index to avoid loop on all the date list
- index = getClosestDateIndex(index > 0 ? index - 1 : 0, geoPointDates, date);
+ int index = 0;
+ for (Date date : dates) {
- result.add(geoPoints.get(index));
+ // We continue starting from the previous index to avoid loop on all the date list
+ index = getClosestDateIndex(index > 0 ? index - 1 : 0, geoPointDates, date);
+
+ result.add(geoPoints.get(index));
+ }
}
return result;
}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java 2012-08-08 18:26:33 UTC (rev 373)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java 2012-08-09 09:35:36 UTC (rev 374)
@@ -76,6 +76,10 @@
this.ui = ui;
}
+ public MainUI getUI() {
+ return ui;
+ }
+
public SammoaContext getAppContext() {
return context.getAppContext();
}
@@ -127,6 +131,8 @@
} else {
+ SammoaUtil.updateBusyState(ui, true);
+
if (currentBody != null) {
SammoaUI<?> body = (SammoaUI<?>) currentBody;
body.getHandler().onCloseUI();
@@ -178,6 +184,8 @@
}
ui.setScreen(screen);
+
+ SammoaUtil.updateBusyState(ui, false);
}
}
@@ -301,7 +309,7 @@
flightUIHandler.getFlightController().openGpsDevice(gpsConfig);
} catch (DeviceTechnicalException ex) {
logger.error("Error on new GpsHandler", ex);
- SammoaUtil.showError(ui, ex);
+ SammoaUtil.showErrorMessage(ui, ex.getMessageWithCause());
}
}
}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/SammoaUIContext.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/SammoaUIContext.java 2012-08-08 18:26:33 UTC (rev 373)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/SammoaUIContext.java 2012-08-09 09:35:36 UTC (rev 374)
@@ -164,6 +164,10 @@
mainUIHandler.setScreen(SammoaScreen.EXPORT_MAP);
}
+ public void setStatusMessage(String message) {
+ mainUIHandler.getUI().getStatus().setStatus(message);
+ }
+
public void open() {
context.open();
}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/CircleBackAction.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/CircleBackAction.java 2012-08-08 18:26:33 UTC (rev 373)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/CircleBackAction.java 2012-08-09 09:35:36 UTC (rev 374)
@@ -23,6 +23,7 @@
*/
package fr.ulr.sammoa.ui.swing.action;
+import com.google.common.collect.Iterables;
import fr.ulr.sammoa.persistence.Observation;
import fr.ulr.sammoa.persistence.Route;
import fr.ulr.sammoa.persistence.RouteType;
@@ -60,7 +61,7 @@
if (observation == null) {
List<Observation> obsList = getModel().getObservations();
- observation = obsList.get(obsList.size());
+ observation = Iterables.getLast(obsList);
}
getFlightController().circleBack(observation);
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-08 18:26:33 UTC (rev 373)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/campaign/CampaignUIHandler.java 2012-08-09 09:35:36 UTC (rev 374)
@@ -37,6 +37,7 @@
import fr.ulr.sammoa.ui.swing.region.RegionUIModel;
import fr.ulr.sammoa.ui.swing.util.CsvImporter;
import fr.ulr.sammoa.ui.swing.util.Importer;
+import fr.ulr.sammoa.ui.swing.util.SammoaUtil;
import fr.ulr.sammoa.ui.swing.util.ShpImporter;
import jaxx.runtime.swing.ErrorDialogUI;
import jaxx.runtime.validator.swing.SwingValidatorMessageTableRenderer;
@@ -167,7 +168,9 @@
boolean success = true;
Campaign campaign = getModel().newBean();
-
+
+ SammoaUtil.updateBusyState(ui, true);
+
String campaignId = getReferentialService().saveCampaign(campaign);
getModel().setId(campaignId);
@@ -207,12 +210,14 @@
success &= observerImporter.readFile(ui, observerFile);
}
+ SammoaUtil.updateBusyState(ui, false);
+
if (success) {
context.setCampaignId(campaignId);
close();
}
- } catch (IllegalArgumentException e) {
+ } catch (Exception e) {
ErrorDialogUI.showError(e);
}
}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java 2012-08-08 18:26:33 UTC (rev 373)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java 2012-08-09 09:35:36 UTC (rev 374)
@@ -239,14 +239,16 @@
flightController.openGpsDevice(getConfig().getGpsConfig());
} catch (DeviceTechnicalException ex) {
logger.error("Error on GPS init", ex);
- SammoaUtil.showError(ui, ex);
+ SammoaUtil.showErrorMessage(ui, ex.getMessageWithCause());
+ SammoaUtil.updateBusyState(context.getMainUIHandler().getUI(), true);
}
try {
flightController.openAudioDevice();
} catch (DeviceTechnicalException ex) {
logger.error("Error on Audio init", ex);
- SammoaUtil.showError(ui, ex);
+ SammoaUtil.showErrorMessage(ui, ex.getMessageWithCause());
+ SammoaUtil.updateBusyState(context.getMainUIHandler().getUI(), true);
}
flightController.addListener(this);
@@ -885,7 +887,7 @@
event.getNewValue() == DeviceState.ERROR &&
event.getError() != null) {
- SammoaUtil.showError(ui, event.getError());
+ context.setStatusMessage(event.getError().getMessageWithCause());
}
}
};
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-08 18:26:33 UTC (rev 373)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/region/RegionUIHandler.java 2012-08-09 09:35:36 UTC (rev 374)
@@ -120,6 +120,8 @@
// Prepare new instance
Region region = getModel().newBean();
+ SammoaUtil.updateBusyState(ui, true);
+
// Save the entity
String regionId = getReferentialService().saveRegion(region);
getModel().setId(regionId);
@@ -134,15 +136,17 @@
);
}
- success &= speciesImporter.readFile(ui, speciesFile);
+ success = speciesImporter.readFile(ui, speciesFile);
}
+ SammoaUtil.updateBusyState(ui, false);
+
// Close on success
if (success) {
ui.getCloseButton().doClick();
}
- } catch (IllegalArgumentException e) {
+ } catch (Exception e) {
ErrorDialogUI.showError(e);
}
}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/Importer.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/Importer.java 2012-08-08 18:26:33 UTC (rev 373)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/Importer.java 2012-08-09 09:35:36 UTC (rev 374)
@@ -27,9 +27,8 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.swing.JOptionPane;
-import javax.swing.UIManager;
-import java.awt.Component;
+import javax.swing.*;
+import java.awt.*;
import java.io.File;
import java.io.IOException;
@@ -48,8 +47,12 @@
try {
+ SammoaUtil.updateBusyState(ui, true);
+
String successMessage = onActionPerformed(file);
+ SammoaUtil.updateBusyState(ui, false);
+
JOptionPane.showMessageDialog(ui, successMessage);
result = true;
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-08-08 18:26:33 UTC (rev 373)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/SammoaUtil.java 2012-08-09 09:35:36 UTC (rev 374)
@@ -26,7 +26,6 @@
import com.google.common.base.Joiner;
import com.google.common.base.Throwables;
-import fr.ulr.sammoa.application.device.DeviceTechnicalException;
import jaxx.runtime.JAXXUtil;
import jaxx.runtime.SwingUtil;
import org.apache.commons.beanutils.NestedNullException;
@@ -208,7 +207,7 @@
return file == null ? incoming : new File(file);
}
- public static void updateBusyState(JComponent ui, boolean busy) {
+ public static void updateBusyState(Component ui, boolean busy) {
if (busy) {
// ui bloquee
if (logger.isDebugEnabled()) {
@@ -224,11 +223,7 @@
}
}
- public static void showError(Component ui, DeviceTechnicalException ex) {
- String message = ex.getMessage();
- if (ex.getCause() != null) {
- message += " : " + ex.getCause().getMessage();
- }
+ public static void showErrorMessage(Component ui, String message) {
JOptionPane.showMessageDialog(
ui,
message,
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/ShpImporter.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/ShpImporter.java 2012-08-08 18:26:33 UTC (rev 373)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/ShpImporter.java 2012-08-09 09:35:36 UTC (rev 374)
@@ -47,76 +47,69 @@
@Override
protected String onActionPerformed(File file) throws IOException {
- String result;
- try {
-
- File dbfFile;
- String fileName = file.getName();
- File sourceDirectory = file.getParentFile();
-
- String ext = Files.getFileExtension(fileName);
- int extIndex = fileName.lastIndexOf(ext);
- final String fileNameWithoutExt = fileName.substring(0, extIndex);
+ File dbfFile;
+ String fileName = file.getName();
+ File sourceDirectory = file.getParentFile();
+ String ext = Files.getFileExtension(fileName);
+ int extIndex = fileName.lastIndexOf(ext);
+ final String fileNameWithoutExt = fileName.substring(0, extIndex);
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("Source directory '" + sourceDirectory.getAbsolutePath() + "' and fileName '" + fileNameWithoutExt + "'");
+ }
+
+ if (!ext.equals("dbf")) {
+
+ fileName = fileNameWithoutExt + "dbf";
+
if (logger.isDebugEnabled()) {
- logger.debug("Source directory '" + sourceDirectory.getAbsolutePath() + "' and fileName '" + fileNameWithoutExt + "'");
+ logger.debug(String.format("Use dbfFile %s for import", fileName));
}
- if (!ext.equals("dbf")) {
+ dbfFile = new File(sourceDirectory, fileName);
- fileName = fileNameWithoutExt + "dbf";
-
- if (logger.isDebugEnabled()) {
- logger.debug(String.format("Use dbfFile %s for import", fileName));
- }
-
- dbfFile = new File(sourceDirectory, fileName);
-
- if (!dbfFile.exists()) {
- throw new FileNotFoundException("Can't found dbf file '" + dbfFile.getAbsolutePath() + "' for import");
- }
-
- } else {
- dbfFile = file;
+ if (!dbfFile.exists()) {
+ throw new FileNotFoundException("Can't found dbf file '" + dbfFile.getAbsolutePath() + "' for import");
}
-
- DbfImport<E> importer = new DbfImport<E>(getModel(), dbfFile.toURI().toURL());
-
- result = onActionPerformed(importer);
- String[] files = sourceDirectory.list(new FilenameFilter() {
+ } else {
+ dbfFile = file;
+ }
- @Override
- public boolean accept(File dir, String fullName) {
- String extension = Files.getFileExtension(fullName);
- int extIndex = fullName.lastIndexOf(extension);
- String name = fullName.substring(0, extIndex);
- if (logger.isDebugEnabled()) {
- logger.debug(String.format("Read file : %s [ext = %s] -> check equals for %s",
- fullName,
- extension,
- name)
- );
- }
- return fileNameWithoutExt.equals(name);
- }
- });
+ DbfImport<E> importer = new DbfImport<E>(getModel(), dbfFile.toURI().toURL());
- for (String name : files) {
- String extension = Files.getFileExtension(name);
- File sourceFile = new File(sourceDirectory, name);
- File targetFile = new File(getCopyDirectory(), getCopyFileName() + "." + extension);
- if (logger.isInfoEnabled()) {
- logger.info(String.format("Copy file '%1$s' to '%2$s'",
- sourceFile.getAbsolutePath(),
- targetFile.getAbsolutePath())
+ String result = onActionPerformed(importer);
+
+ String[] files = sourceDirectory.list(new FilenameFilter() {
+
+ @Override
+ public boolean accept(File dir, String fullName) {
+ String extension = Files.getFileExtension(fullName);
+ int extIndex = fullName.lastIndexOf(extension);
+ String name = fullName.substring(0, extIndex);
+ if (logger.isDebugEnabled()) {
+ logger.debug(String.format("Read file : %s [ext = %s] -> check equals for %s",
+ fullName,
+ extension,
+ name)
);
}
- FileUtils.copyFile(sourceFile, targetFile);
+ return fileNameWithoutExt.equals(name);
}
+ });
- } catch (IOException e) {
- throw e;
+ for (String name : files) {
+ String extension = Files.getFileExtension(name);
+ File sourceFile = new File(sourceDirectory, name);
+ File targetFile = new File(getCopyDirectory(), getCopyFileName() + "." + extension);
+ if (logger.isInfoEnabled()) {
+ logger.info(String.format("Copy file '%1$s' to '%2$s'",
+ sourceFile.getAbsolutePath(),
+ targetFile.getAbsolutePath())
+ );
+ }
+ FileUtils.copyFile(sourceFile, targetFile);
}
return result;
}
1
0
08 Aug '12
Author: fdesbois
Date: 2012-08-08 20:26:33 +0200 (Wed, 08 Aug 2012)
New Revision: 373
Url: http://forge.codelutin.com/repositories/revision/sammoa/373
Log:
refs #1378 : improve errors
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaConfig.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceState.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceStateEvent.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorder.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorderDefault.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorderMock.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/BaseGpsHandler.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/GpsConfig.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/FlightControllerDefault.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/ExportMapService.java
trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/map/ExportMapServiceTest.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/DeviceStateLED.java
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/io/exportMap/ExportMapUIModel.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/EffortPanelHandler.java
trunk/sammoa-ui-swing/src/main/resources/logback.xml
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-08 18:26:09 UTC (rev 372)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaConfig.java 2012-08-08 18:26:33 UTC (rev 373)
@@ -37,7 +37,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.swing.KeyStroke;
+import javax.swing.*;
import java.io.File;
import java.io.IOException;
import java.net.URL;
@@ -432,7 +432,7 @@
"true",
Boolean.class
),
- /** Time in seconds before timeout (NO_DATA, NO_DEVICE) */
+ /** Time in seconds before timeout (ERROR, NO_DEVICE) */
CAMPAIGN_ID("campaign.id",
n_("sammoa.config.campaign.id"),
null,
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceState.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceState.java 2012-08-08 18:26:09 UTC (rev 372)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceState.java 2012-08-08 18:26:33 UTC (rev 373)
@@ -37,5 +37,5 @@
/** voyant vert : reception de données */
RECORDING,
/** voyant rouge clignotant : périphirique prêt mais aucune données */
- NO_DATA
+ ERROR
}
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceStateEvent.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceStateEvent.java 2012-08-08 18:26:09 UTC (rev 372)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceStateEvent.java 2012-08-08 18:26:33 UTC (rev 373)
@@ -36,6 +36,8 @@
protected DeviceState newValue;
+ protected DeviceTechnicalException error;
+
public DeviceStateEvent(DeviceManager source, DeviceState oldValue, DeviceState newValue) {
this.source = source;
this.oldValue = oldValue;
@@ -53,4 +55,12 @@
public DeviceState getNewValue() {
return newValue;
}
+
+ public DeviceTechnicalException getError() {
+ return error;
+ }
+
+ public void setError(DeviceTechnicalException error) {
+ this.error = error;
+ }
}
\ No newline at end of file
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorder.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorder.java 2012-08-08 18:26:09 UTC (rev 372)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorder.java 2012-08-08 18:26:33 UTC (rev 373)
@@ -27,7 +27,6 @@
import javax.sound.sampled.AudioFileFormat;
import java.io.File;
-import java.io.IOException;
/**
* Recorder of audio files. Two recorder are used and a delay between recording
@@ -51,9 +50,8 @@
*
* @param outputFile File to record
* @param delaySeconds Delay for previous recording
- * @throws IOException for recording issues on the file
*/
- void record(File outputFile, long delaySeconds) throws IOException;
+ void record(File outputFile, long delaySeconds);
/**
* Stop the current recording after {@code delaySeconds}.
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorderDefault.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorderDefault.java 2012-08-08 18:26:09 UTC (rev 372)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorderDefault.java 2012-08-08 18:26:33 UTC (rev 373)
@@ -129,13 +129,15 @@
return state;
}
- protected void setState(DeviceState state) {
+ public void setState(DeviceState state, DeviceTechnicalException error) {
DeviceState oldValue = getState();
this.state = state;
// Fire on listeners
for (DeviceStateListener listener : listeners) {
- listener.stateChanged(new DeviceStateEvent(this, oldValue, state));
+ DeviceStateEvent event = new DeviceStateEvent(this, oldValue, state);
+ event.setError(error);
+ listener.stateChanged(event);
}
}
@@ -174,26 +176,26 @@
// Start using the line for recording
dataLine.start();
- setState(DeviceState.READY);
+ setState(DeviceState.READY, null);
if (logger.isInfoEnabled()) {
logger.info("Audio line is ready");
}
} catch (IllegalArgumentException e) {
- setState(DeviceState.NO_DEVICE);
+ setState(DeviceState.NO_DEVICE, null);
throw new DeviceTechnicalException(this, "Can't open audio device", e);
} catch (IllegalStateException e) {
- setState(DeviceState.NO_DEVICE);
+ setState(DeviceState.NO_DEVICE, null);
throw new DeviceTechnicalException(this, "Can't open audio device", e);
} catch (SecurityException e) {
- setState(DeviceState.NO_DEVICE);
+ setState(DeviceState.NO_DEVICE, null);
throw new DeviceTechnicalException(this, "Can't open audio device", e);
} catch (LineUnavailableException e) {
- setState(DeviceState.NO_DEVICE);
+ setState(DeviceState.NO_DEVICE, null);
throw new DeviceTechnicalException(this, "Can't open audio device", e);
}
}
@@ -214,9 +216,9 @@
}
@Override
- public void record(File outputFile, long delaySeconds) throws IOException {
+ public void record(File outputFile, long delaySeconds) {
- if (DeviceState.NO_DATA == state) {
+ if (DeviceState.NO_DEVICE == state) {
if (logger.isWarnEnabled()) {
logger.warn("Can't record " + outputFile.getAbsolutePath() + ", no available dataLine");
}
@@ -231,37 +233,45 @@
"You must start the AudioRecorder to initialize " +
"the audio line before call record method");
+ try {
+ // Start recorder1
+ if (currentRecorder == null) {
+ recorder1 = new Recorder(outputFile, this, audioFormat, lineReader);
+ currentRecorder = recorder1;
- // Start recorder1
- if (currentRecorder == null) {
- recorder1 = new Recorder(outputFile, audioFormat, outputType, lineReader);
- currentRecorder = recorder1;
+ // Stop recorder1 if recording and start recorder2
+ } else if (currentRecorder == recorder1) {
- // Stop recorder1 if recording and start recorder2
- } else if (currentRecorder == recorder1) {
+ if (recorder1.isRecording()) {
+ recorder1.stop(delaySeconds);
+ }
- if (recorder1.isRecording()) {
- recorder1.stop(delaySeconds);
- }
+ if (recorder2 != null && recorder2.isRecording()) {
+ recorder2.stop();
+ }
+ recorder2 = new Recorder(outputFile, this, audioFormat, lineReader);
+ currentRecorder = recorder2;
- if (recorder2 != null && recorder2.isRecording()) {
- recorder2.stop();
- }
- recorder2 = new Recorder(outputFile, audioFormat, outputType, lineReader);
- currentRecorder = recorder2;
+ // Stop recorder2 if recording and start recorder1
+ } else if (currentRecorder == recorder2) {
- // Stop recorder2 if recording and start recorder1
- } else if (currentRecorder == recorder2) {
+ if (recorder2.isRecording()) {
+ recorder2.stop(delaySeconds);
+ }
- if (recorder2.isRecording()) {
- recorder2.stop(delaySeconds);
+ if (recorder1.isRecording()) {
+ recorder1.stop();
+ }
+ recorder1 = new Recorder(outputFile, this, audioFormat, lineReader);
+ currentRecorder = recorder1;
}
- if (recorder1.isRecording()) {
- recorder1.stop();
- }
- recorder1 = new Recorder(outputFile, audioFormat, outputType, lineReader);
- currentRecorder = recorder1;
+ } catch (IOException e) {
+ setState(DeviceState.ERROR,
+ new DeviceTechnicalException(this,
+ "Error on saving file "
+ + outputFile.getAbsolutePath(), e)
+ );
}
}
@@ -301,7 +311,7 @@
dataLine.close();
dataLine = null;
- setState(DeviceState.NO_DEVICE);
+ setState(DeviceState.NO_DEVICE, null);
}
}
@@ -331,7 +341,7 @@
if (!recorders.isEmpty()) {
- setState(DeviceState.RECORDING);
+ setState(DeviceState.RECORDING, null);
numBytesRead = dataLine.read(buffer, 0, bufferSize);
synchronized (recorders) {
@@ -341,7 +351,7 @@
}
} else {
- setState(DeviceState.READY);
+ setState(DeviceState.READY, null);
}
}
@@ -359,10 +369,10 @@
protected static class Recorder {
+ protected AudioRecorderDefault audioRecorder;
+
protected AudioFormat audioFormat;
- protected AudioFileFormat.Type outputType;
-
protected ByteArrayOutputStream bufferStream;
protected String outputFilePath;
@@ -396,8 +406,8 @@
}
public Recorder(File outputFile,
+ AudioRecorderDefault audioRecorder,
AudioFormat audioFormat,
- AudioFileFormat.Type outputType,
DataLineReader lineReader) throws IOException {
this.outputFilePath = outputFile.getAbsolutePath();
@@ -407,10 +417,10 @@
} else {
logger.info("Use existing file '{}' to continue recording", outputFilePath);
}
+ this.outputStream = new BufferedOutputStream(new FileOutputStream(outputFile, true));
this.bufferStream = new ByteArrayOutputStream();
- this.outputStream = new BufferedOutputStream(new FileOutputStream(outputFile, true));
this.audioFormat = audioFormat;
- this.outputType = outputType;
+ this.audioRecorder = audioRecorder;
this.lineReader = lineReader;
this.lineReader.addRecorder(this);
@@ -500,10 +510,13 @@
try {
logger.debug("Save in file {}", outputFilePath);
- AudioSystem.write(audioStream, outputType, outputStream);
+ AudioSystem.write(audioStream, audioRecorder.getOutputType(), outputStream);
} catch (IOException e) {
logger.error("Can't record file {}", outputFilePath, e);
+ audioRecorder.setState(DeviceState.ERROR,
+ new DeviceTechnicalException(audioRecorder,
+ "Error on saving file " + outputFilePath, e));
} finally {
try {
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorderMock.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorderMock.java 2012-08-08 18:26:09 UTC (rev 372)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorderMock.java 2012-08-08 18:26:33 UTC (rev 373)
@@ -30,7 +30,6 @@
import javax.sound.sampled.AudioFileFormat;
import java.io.File;
-import java.io.IOException;
import java.util.Set;
/**
@@ -63,7 +62,7 @@
}
@Override
- public void record(File outputFile, long delaySeconds) throws IOException {
+ public void record(File outputFile, long delaySeconds) {
// do nothing
}
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/BaseGpsHandler.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/BaseGpsHandler.java 2012-08-08 18:26:09 UTC (rev 372)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/BaseGpsHandler.java 2012-08-08 18:26:33 UTC (rev 373)
@@ -67,7 +67,7 @@
/**
* Value to check the number of timer update failures before the DeviceState
- * becomes {@link DeviceState#NO_DATA}
+ * becomes {@link DeviceState#ERROR}
*/
protected int nbFailuresMax;
@@ -101,8 +101,8 @@
if (getState() == DeviceState.READY) {
if (logger.isDebugEnabled()) {
- logger.debug("Start scheduling GpsHandler every "
- + periodMilliseconds + " milliseconds");
+ logger.debug("Start scheduling GpsHandler to retrieve data every "
+ + config.getCheckPeriod() + " seconds");
}
timer = new Timer();
@@ -151,12 +151,15 @@
return gpsLocationListeners;
}
- protected void setState(DeviceState state) {
+ public void setState(DeviceState state, DeviceTechnicalException error) {
DeviceState oldValue = getState();
this.state = state;
+ // Fire on listeners
for (DeviceStateListener listener : deviceStateListeners) {
- listener.stateChanged(new DeviceStateEvent(this, oldValue, state));
+ DeviceStateEvent event = new DeviceStateEvent(this, oldValue, state);
+ event.setError(error);
+ listener.stateChanged(event);
}
}
@@ -175,12 +178,14 @@
} catch (DeviceTechnicalException ex) {
- // We use NO_DATA, because this task is during start
- setState(DeviceState.NO_DATA);
+ // We use ERROR, because this task is during start
+ // Error is generally the same as previous one from first open() call,
+ // no need to propagate it
+ setState(DeviceState.ERROR, null);
if (logger.isErrorEnabled()) {
logger.error("Can't open GPS device. Try again in "
- + this.scheduledExecutionTime() + " milliseconds", ex);
+ + config.getCheckPeriod() + " seconds", ex);
}
}
}
@@ -208,12 +213,19 @@
// Data is unavailable
if (location == null && nbFailures >= nbFailuresMax) {
- setState(DeviceState.NO_DATA);
+ setState(DeviceState.ERROR,
+ new DeviceTechnicalException(BaseGpsHandler.this,
+ String.format("The GPS signal is lost after %d seconds ! " +
+ "The application will try again in %d seconds",
+ config.getTimeout(),
+ config.getCheckPeriod())
+ )
+ );
// GPS is recording
} else {
- setState(DeviceState.RECORDING);
+ setState(DeviceState.RECORDING, null);
// Fire events for location change
for (GpsLocationListener listener : gpsLocationListeners) {
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-08 18:26:09 UTC (rev 372)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/FakeGpsHandler.java 2012-08-08 18:26:33 UTC (rev 373)
@@ -73,7 +73,7 @@
// } else {
// if (started) {
// if (r.nextInt(32) > 25) {
-// newState = DeviceState.NO_DATA;
+// newState = DeviceState.ERROR;
// } else {
// newState = DeviceState.RECORDING;
// }
@@ -94,7 +94,7 @@
@Override
public void open() throws DeviceTechnicalException {
- setState(DeviceState.READY);
+ setState(DeviceState.READY, null);
}
@Override
@@ -108,7 +108,7 @@
@Override
public void close() throws DeviceTechnicalException {
- setState(DeviceState.NO_DEVICE);
+ setState(DeviceState.NO_DEVICE, null);
}
@Override
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsConfig.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsConfig.java 2012-08-08 18:26:09 UTC (rev 372)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsConfig.java 2012-08-08 18:26:33 UTC (rev 373)
@@ -111,7 +111,7 @@
"2",
Integer.class
),
- /** Time in seconds before timeout (NO_DATA, NO_DEVICE) */
+ /** Time in seconds before timeout (ERROR, NO_DEVICE) */
GPS_TIMEOUT("gps.timeout",
n_("sammoa.config.gps.timeout"),
"10",
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-08 18:26:09 UTC (rev 372)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsHandlerGpsylon.java 2012-08-08 18:26:33 UTC (rev 373)
@@ -127,18 +127,18 @@
logger.info("Connected to GPS device");
- setState(DeviceState.READY);
+ setState(DeviceState.READY, null);
} catch (GPSException ex) {
- setState(DeviceState.NO_DEVICE);
+ setState(DeviceState.NO_DEVICE, null);
throw new DeviceTechnicalException(this, "Can't open GPS device", ex);
}
}
@Override
- public void close() {
+ public void close() throws DeviceTechnicalException {
stop();
@@ -158,9 +158,10 @@
logger.info("GPS device is closed");
- setState(DeviceState.NO_DEVICE);
+ setState(DeviceState.NO_DEVICE, null);
} catch (GPSException e) {
+ setState(DeviceState.ERROR, null);
throw new DeviceTechnicalException(this, "Can't close GPS device", e);
}
}
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerDefault.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerDefault.java 2012-08-08 18:26:09 UTC (rev 372)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerDefault.java 2012-08-08 18:26:33 UTC (rev 373)
@@ -61,7 +61,6 @@
import org.slf4j.LoggerFactory;
import java.io.File;
-import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Date;
@@ -787,11 +786,7 @@
File audioFile = new File(audioDir, fileName);
- try {
- getAudioRecorder().record(audioFile, delay);
- } catch (IOException e) {
- throw Throwables.propagate(e);
- }
+ getAudioRecorder().record(audioFile, delay);
}
protected Date saveGPS(TopiaContext transaction,
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/ExportMapService.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/ExportMapService.java 2012-08-08 18:26:09 UTC (rev 372)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/ExportMapService.java 2012-08-08 18:26:33 UTC (rev 373)
@@ -29,6 +29,7 @@
import com.bbn.openmap.dataAccess.shape.EsriShapeExport;
import com.bbn.openmap.omGraphics.OMGraphic;
import com.bbn.openmap.omGraphics.OMPoint;
+import com.google.common.base.Preconditions;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
@@ -47,7 +48,6 @@
import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
-import java.util.Date;
import java.util.List;
import java.util.Map;
@@ -106,6 +106,10 @@
}
public void exportGeoPointsMap(ExportMapModel dataModel) {
+ Preconditions.checkNotNull(dataModel.getCampaign());
+ Preconditions.checkNotNull(dataModel.getBeginDate());
+ Preconditions.checkNotNull(dataModel.getEndDate());
+
if (logger.isInfoEnabled()) {
logger.info("Start GeoPointsMap export to " +
dataModel.getExportDirectory() + "::" +
@@ -134,9 +138,7 @@
List<Flight> campaignFlights = context.getFlightService().getFlights(dataModel.getCampaign());
// Filter on period
- Date beginDate = dataModel.getBeginDate() == null ? campaign.getBeginDate() : dataModel.getBeginDate();
- Date endDate = dataModel.getEndDate() == null ? campaign.getEndDate() : dataModel.getEndDate();
- final PeriodDates period = new PeriodDates(beginDate, endDate);
+ final PeriodDates period = new PeriodDates(dataModel.getBeginDate(), dataModel.getEndDate());
Iterable<Flight> flights = Iterables.filter(campaignFlights, new Predicate<Flight>() {
@Override
Modified: trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/map/ExportMapServiceTest.java
===================================================================
--- trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/map/ExportMapServiceTest.java 2012-08-08 18:26:09 UTC (rev 372)
+++ trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/map/ExportMapServiceTest.java 2012-08-08 18:26:33 UTC (rev 373)
@@ -89,10 +89,10 @@
exportDirectory,
"export-geoPoints.shp",
campaign,
+ campaign.getBeginDate(),
+ campaign.getEndDate(),
null,
null,
- null,
- null,
null
);
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/DeviceStateLED.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/DeviceStateLED.java 2012-08-08 18:26:09 UTC (rev 372)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/DeviceStateLED.java 2012-08-08 18:26:33 UTC (rev 373)
@@ -56,10 +56,6 @@
protected DeviceState state;
- public DeviceStateLED() {
-// stateChanged(DeviceState.NO_DEVICE);
- }
-
protected static final ImageIcon NO_DEVICE_ICON = Resource.getIcon("/icons/device/nodevice.png");
protected static final ImageIcon READY_ICON = Resource.getIcon("/icons/device/ready.png");
protected static final ImageIcon RECORDING_ICON = Resource.getIcon("/icons/device/recording.png");
@@ -67,13 +63,17 @@
@Override
public void stateChanged(DeviceStateEvent event) {
+ setState(event.getNewValue());
+ }
+
+ public void setState(DeviceState state) {
DeviceState oldValue = getState();
- this.state = event.getNewValue();
-
+ this.state = state;
+
if (oldValue != state) {
logger.debug("[{}] Update LED status: {}",
- getClass().getSimpleName(), state);
+ getClass().getSimpleName(), state);
switch (state) {
case NO_DEVICE:
@@ -85,7 +85,7 @@
case RECORDING:
setIcon(RECORDING_ICON);
break;
- case NO_DATA:
+ case ERROR:
setIcon(NO_DATA_ICON);
break;
}
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-08-08 18:26:09 UTC (rev 372)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightBarHandler.java 2012-08-08 18:26:33 UTC (rev 373)
@@ -24,6 +24,8 @@
*/
package fr.ulr.sammoa.ui.swing.flight;
+import fr.ulr.sammoa.application.device.audio.AudioRecorder;
+import fr.ulr.sammoa.application.device.gps.GpsHandler;
import fr.ulr.sammoa.application.flightController.FlightState;
import fr.ulr.sammoa.persistence.Route;
import fr.ulr.sammoa.ui.swing.BaseHandler;
@@ -53,9 +55,16 @@
public void init() {
getFlightUIModel().addPropertyChangeListener(this);
- getFlightController().getAudioRecorder().addDeviceStateListener(view.getAudioLED());
- getFlightController().getGpsHandler().addDeviceStateListener(view.getGpsLED());
- getFlightController().getGpsHandler().addGpsLocationListener(getModel());
+
+ AudioRecorder audioRecorder = getFlightController().getAudioRecorder();
+ view.getAudioLED().setState(audioRecorder.getState());
+ audioRecorder.addDeviceStateListener(view.getAudioLED());
+
+ GpsHandler gpsHandler = getFlightController().getGpsHandler();
+ view.getGpsLED().setState(gpsHandler.getState());
+ gpsHandler.addDeviceStateListener(view.getGpsLED());
+ gpsHandler.addGpsLocationListener(getModel());
+
if (FlightState.OFF_EFFORT.equals(getFlightUIModel().getFlightState())) {
getModel().setEffortPanelColor(SammoaColors.ON_EFFORT_BACKGROUND_COLOR);
}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java 2012-08-08 18:26:09 UTC (rev 372)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java 2012-08-08 18:26:33 UTC (rev 373)
@@ -52,6 +52,9 @@
import fr.ulr.sammoa.application.ReferentialService;
import fr.ulr.sammoa.application.SammoaConfig;
import fr.ulr.sammoa.application.SammoaContext;
+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 fr.ulr.sammoa.application.device.gps.GpsLocationEvent;
import fr.ulr.sammoa.application.device.gps.GpsLocationListener;
@@ -197,7 +200,7 @@
// TODO-fdesbois-2012-07-19 : load all this data in the same transaction
// TODO-fdesbois-2012-07-19 : to avoid separated instances of same entities
- // TODO-fdesbois-2012-07-19 : like Transect or ObserverPosition
+ // TODO-fdesbois-2012-07-19 : like ObserverPosition or use proper Model like TransectModel
Flight flight = getFlightService().getFlight(flightId);
Preconditions.checkNotNull(flight);
Campaign campaign = flight.getCampaign();
@@ -235,19 +238,21 @@
try {
flightController.openGpsDevice(getConfig().getGpsConfig());
} catch (DeviceTechnicalException ex) {
- logger.error("Error on FlightController init", ex);
+ logger.error("Error on GPS init", ex);
SammoaUtil.showError(ui, ex);
}
try {
flightController.openAudioDevice();
} catch (DeviceTechnicalException ex) {
- logger.error("Error on FlightController init", ex);
+ logger.error("Error on Audio init", ex);
SammoaUtil.showError(ui, ex);
}
flightController.addListener(this);
flightController.getGpsHandler().addGpsLocationListener(gpsLocationListener);
+ flightController.getGpsHandler().addDeviceStateListener(deviceStateListener);
+ flightController.getAudioRecorder().addDeviceStateListener(deviceStateListener);
flightController.init();
@@ -872,6 +877,19 @@
}
};
+ protected DeviceStateListener deviceStateListener = new DeviceStateListener() {
+
+ @Override
+ public void stateChanged(DeviceStateEvent event) {
+ if (event.getOldValue() != DeviceState.ERROR &&
+ event.getNewValue() == DeviceState.ERROR &&
+ event.getError() != null) {
+
+ SammoaUtil.showError(ui, event.getError());
+ }
+ }
+ };
+
protected GpsLocationListener gpsLocationListener = new GpsLocationListener() {
@Override
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/exportMap/ExportMapUIModel.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/exportMap/ExportMapUIModel.java 2012-08-08 18:26:09 UTC (rev 372)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/exportMap/ExportMapUIModel.java 2012-08-08 18:26:33 UTC (rev 373)
@@ -317,12 +317,24 @@
List<Species> speciesToUse = Species2.getSelectedSpecies(
getSpecies(), getSelectedSpecies(), getSelectedSpeciesTypes());
+ // Ensure bounds for beginDate and enDate
+ Date beginDate = getBeginDate();
+ Date campaignBeginDate = getSelectedCampaign().getBeginDate();
+ if (beginDate == null || beginDate.before(campaignBeginDate)) {
+ beginDate = campaignBeginDate;
+ }
+ Date endDate = getEndDate();
+ Date campaignEndDate = getSelectedCampaign().getEndDate();
+ if (endDate == null || endDate.after(campaignEndDate)) {
+ endDate = campaignEndDate;
+ }
+
ExportMapModel result = ExportMapModel.newModel(
getExportDirectory(),
filename,
getSelectedCampaign(),
- getBeginDate(),
- getEndDate(),
+ beginDate,
+ endDate,
getSelectedStrates(),
getSelectedRouteTypes(),
speciesToUse
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-08 18:26:09 UTC (rev 372)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/EffortPanelHandler.java 2012-08-08 18:26:33 UTC (rev 373)
@@ -552,7 +552,7 @@
@Override
public void stateChanged(DeviceStateEvent event) {
DeviceState state = event.getNewValue();
- if (DeviceState.NO_DATA == state) {
+ if (DeviceState.ERROR == state) {
ui.getObservationTable().setBackground(DEVICE_ERROR_BACKGROUND_COLOR);
} else {
Modified: trunk/sammoa-ui-swing/src/main/resources/logback.xml
===================================================================
--- trunk/sammoa-ui-swing/src/main/resources/logback.xml 2012-08-08 18:26:09 UTC (rev 372)
+++ trunk/sammoa-ui-swing/src/main/resources/logback.xml 2012-08-08 18:26:33 UTC (rev 373)
@@ -47,7 +47,7 @@
<!--</rollingPolicy>-->
<!--</appender>-->
- <logger name="fr.ulr.sammoa" level="DEBUG"/>
+ <logger name="fr.ulr.sammoa" level="INFO"/>
<root level="ERROR">
<!--<appender-ref ref="FILE"/>-->
1
0
r372 - in trunk: sammoa-application sammoa-application/src/main/java/fr/ulr/sammoa/application/map sammoa-application/src/main/resources/i18n sammoa-application/src/test/java/fr/ulr/sammoa/application sammoa-application/src/test/java/fr/ulr/sammoa/application/map sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util
by fdesbois@users.forge.codelutin.com 08 Aug '12
by fdesbois@users.forge.codelutin.com 08 Aug '12
08 Aug '12
Author: fdesbois
Date: 2012-08-08 20:26:09 +0200 (Wed, 08 Aug 2012)
New Revision: 372
Url: http://forge.codelutin.com/repositories/revision/sammoa/372
Log:
refs #1203 : implement Shp export for Flight GeoPoints
Added:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/DbfColumnModel.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/DbfImport.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/DbfTableModelBuilder.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/DbfTimestampConverter.java
trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/map/
trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/map/DbfTimestampConverterTest.java
trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/map/ExportMapServiceTest.java
Removed:
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/DbfImport.java
Modified:
trunk/sammoa-application/pom.xml
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/ExportMapService.java
trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties
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/util/ShpImporter.java
Modified: trunk/sammoa-application/pom.xml
===================================================================
--- trunk/sammoa-application/pom.xml 2012-08-08 16:50:09 UTC (rev 371)
+++ trunk/sammoa-application/pom.xml 2012-08-08 18:26:09 UTC (rev 372)
@@ -88,6 +88,11 @@
<artifactId>nuiton-csv</artifactId>
</dependency>
+ <dependency>
+ <groupId>com.bbn</groupId>
+ <artifactId>openmap</artifactId>
+ </dependency>
+
<!-- test dependencies -->
<dependency>
<groupId>junit</groupId>
Added: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/DbfColumnModel.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/DbfColumnModel.java (rev 0)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/DbfColumnModel.java 2012-08-08 18:26:09 UTC (rev 372)
@@ -0,0 +1,62 @@
+package fr.ulr.sammoa.application.map;
+
+import com.bbn.openmap.dataAccess.shape.DbfTableModel;
+
+/**
+ * Note: there is an existing {@link com.bbn.openmap.dataAccess.shape.DbfTableModelFactory.Column}
+ * class.
+ * <p/>
+ * Created: 07/08/12
+ *
+ * @author fdesbois <florian.desbois(a)codelutin.com>
+ */
+public class DbfColumnModel {
+
+ protected String name;
+
+ protected byte type;
+
+ protected int length;
+
+ protected byte decimalCount;
+
+ protected int index;
+
+ public DbfColumnModel(String name, byte type) {
+ this.name = name;
+ this.type = type;
+ this.index = -1;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public byte getType() {
+ return type;
+ }
+
+ public int getLength() {
+ return length;
+ }
+
+ public void setLength(int length) {
+ this.length = length;
+ }
+
+ public int getDecimalCount() {
+ return decimalCount;
+ }
+
+ public void setDecimalCount(int decimalCount) {
+ this.decimalCount = (byte) decimalCount;
+ }
+
+ public int getIndex() {
+ return index;
+ }
+
+ public void setIndex(int index) {
+ this.index = index;
+ }
+}
Property changes on: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/DbfColumnModel.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Copied: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/DbfImport.java (from rev 371, trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/DbfImport.java)
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/DbfImport.java (rev 0)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/DbfImport.java 2012-08-08 18:26:09 UTC (rev 372)
@@ -0,0 +1,129 @@
+package fr.ulr.sammoa.application.map;
+/*
+ * #%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 com.bbn.openmap.dataAccess.shape.DbfTableModel;
+import com.google.common.base.Throwables;
+import com.google.common.collect.Lists;
+import org.nuiton.util.csv.Import;
+import org.nuiton.util.csv.ImportModel;
+import org.nuiton.util.csv.ImportRuntimeException;
+import org.nuiton.util.csv.ImportableColumn;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.net.URL;
+import java.util.Iterator;
+import java.util.List;
+
+import static org.nuiton.i18n.I18n._;
+
+/**
+ * Created: 25/07/12
+ *
+ * @author fdesbois <desbois(a)codelutin.com>
+ */
+public class DbfImport<E> extends Import<E> {
+
+ private static final Logger logger = LoggerFactory.getLogger(DbfImport.class);
+
+ protected DbfTableModel source;
+
+ protected Iterator<List<Object>> records;
+
+ protected List<Object> record;
+
+ public DbfImport(ImportModel<E> model, URL fileUrl) {
+ // Use dummy reader for superclass Import that manage by default csv files
+ super(model, new Reader() {
+
+ @Override
+ public int read(char[] cbuf, int off, int len) throws IOException {
+ return -1;
+ }
+
+ @Override
+ public void close() throws IOException {
+ }
+ });
+
+ try {
+ // FIXME-fdesbois-2012-07-26 : there is an issue with encoding, don't know how to customize it
+ this.source = DbfTableModel.read(fileUrl);
+
+ } catch (Exception e) {
+ throw Throwables.propagate(e);
+ }
+ this.records = source.getRecords();
+ }
+
+ @Override
+ protected <T> String readValue(ImportableColumn<E, T> field, int lineNumber) {
+ try {
+
+ int columnNumber = source.getColumnIndexForName(field.getHeaderName());
+
+ String value = String.valueOf(record.get(columnNumber));
+
+ return value;
+
+ } catch (Exception e) {
+ throw new ImportRuntimeException(
+ _("csv.import.error.unableToReadField",
+ field.getHeaderName(), lineNumber), e);
+ }
+ }
+
+ @Override
+ public void close() {
+ // nothing to do
+ }
+
+ @Override
+ protected boolean readRow() throws ImportRuntimeException {
+ boolean result;
+ if (records.hasNext()) {
+ record = records.next();
+ if (logger.isTraceEnabled()) {
+ logger.trace("Read record {}", record);
+ }
+ result = true;
+
+ } else {
+ result = false;
+ }
+ return result;
+ }
+
+ @Override
+ protected String[] getHeaders() throws ImportRuntimeException {
+ List<String> list = Lists.newArrayList();
+ for (int index = 0; index < source.getColumnCount(); index++) {
+ list.add(source.getColumnName(index));
+ }
+ return list.toArray(new String[list.size()]);
+ }
+}
Property changes on: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/DbfImport.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Added: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/DbfTableModelBuilder.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/DbfTableModelBuilder.java (rev 0)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/DbfTableModelBuilder.java 2012-08-08 18:26:09 UTC (rev 372)
@@ -0,0 +1,178 @@
+package fr.ulr.sammoa.application.map;
+
+import com.bbn.openmap.dataAccess.shape.DbfTableModel;
+import com.google.common.base.Function;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created: 07/08/12
+ *
+ * @author fdesbois <florian.desbois(a)codelutin.com>
+ */
+public class DbfTableModelBuilder {
+
+ public static final int DEFAULT_STRING_LENGTH = 64;
+
+ public static final int DEFAULT_INTEGER_LENGTH = 8;
+
+ public static final String DATE_FORMAT_PATTERN = "yyyyMMdd";
+
+ public static final DateFormat DATE_FORMAT = new SimpleDateFormat(DATE_FORMAT_PATTERN);
+
+ protected List<DbfColumnModel> columns;
+
+ protected Map<String, DbfColumnModel> columnMap;
+
+ protected DbfTableModel model;
+
+ public DbfTableModelBuilder() {
+ columns = Lists.newArrayList();
+ }
+
+ public DbfTableModelBuilder dbfColumn(DbfColumnModel column) {
+ if (column.getIndex() != -1) {
+ columns.add(column.getIndex(), column);
+ } else {
+ column.setIndex(columns.size());
+ columns.add(column);
+ }
+ return this;
+ }
+
+ public DbfColumnModel newStringColumn(String name) {
+ DbfColumnModel result = new DbfColumnModel(name, DbfTableModel.TYPE_CHARACTER);
+ result.setLength(DEFAULT_STRING_LENGTH);
+ return result;
+ }
+
+ public DbfColumnModel newIntegerColumn(String name) {
+ DbfColumnModel result = new DbfColumnModel(name, DbfTableModel.TYPE_NUMERIC);
+ result.setLength(DEFAULT_INTEGER_LENGTH);
+ return result;
+ }
+
+ public DbfColumnModel newDoubleColumn(String name, int length, int decimalCount) {
+ DbfColumnModel result = new DbfColumnModel(name, DbfTableModel.TYPE_NUMERIC);
+ result.setLength(length);
+ result.setDecimalCount(decimalCount);
+ return result;
+ }
+
+ public DbfColumnModel newTimestampColumn(String name) {
+ DbfColumnModel result = new DbfColumnModel(name, DbfTableModel.TYPE_TIMESTAMP);
+ return result;
+ }
+
+ public DbfColumnModel newDateColumn(String name) {
+ DbfColumnModel result = new DbfColumnModel(name, DbfTableModel.TYPE_DATE);
+ result.setLength(DATE_FORMAT_PATTERN.length());
+ return result;
+ }
+
+ public DbfTableModelBuilder stringColumn(String name) {
+ return dbfColumn(newStringColumn(name));
+ }
+
+ public DbfTableModelBuilder integerColumn(String name) {
+ return dbfColumn(newIntegerColumn(name));
+ }
+
+ public DbfTableModelBuilder doubleColumn(String name, int length, int decimalCount) {
+ return dbfColumn(newDoubleColumn(name, length, decimalCount));
+ }
+
+ public DbfTableModelBuilder timestampColumn(String name) {
+ return dbfColumn(newTimestampColumn(name));
+ }
+
+ public DbfTableModelBuilder dateColumn(String name) {
+ return dbfColumn(newDateColumn(name));
+ }
+
+ public DbfTableModelBuilder build() {
+ model = new DbfTableModel(columns.size());
+ model.setWritable(true);
+
+ for (int i = 0; i < columns.size(); i++) {
+ DbfColumnModel columnModel = columns.get(i);
+ model.setColumnName(i, columnModel.getName());
+ model.setType(i, columnModel.getType());
+ model.setLength(i, columnModel.getLength());
+ model.setDecimalCount(i, (byte) columnModel.getDecimalCount());
+ }
+ columnMap = Maps.uniqueIndex(columns,
+ new Function<DbfColumnModel, String>() {
+
+ @Override
+ public String apply(DbfColumnModel input) {
+ return input.getName();
+ }
+ });
+ return this;
+ }
+
+ public DbfTableModel getModel() {
+ return model;
+ }
+
+ public void setValue(int rowIndex, String columnName, Object value) {
+ Preconditions.checkState(model != null, "Model must be built before setting values");
+
+ DbfColumnModel column = columnMap.get(columnName);
+
+ int columnIndex = column.getIndex();
+ value = cleanValue(value, column.getType());
+ model.setValueAt(value, rowIndex, columnIndex);
+ }
+
+ public int addValues(Map<String, Object> values) {
+ Preconditions.checkState(model != null, "Model must be built before adding values");
+
+ model.addBlankRecord();
+ int rowIndex = model.getRowCount() - 1;
+ for (Map.Entry<String, Object> entry : values.entrySet()) {
+ setValue(rowIndex, entry.getKey(), entry.getValue());
+ }
+ return rowIndex;
+ }
+
+ protected Object cleanValue(Object value, byte type) {
+
+ Object result = value;
+ if (DbfTableModel.isNumericalType(type)) {
+
+ // FIX for Integer Format error in DbfTableModel#getStringForType
+ if (value instanceof Integer) {
+ result = Double.valueOf(String.valueOf(value));
+ }
+ }
+ else if (DbfTableModel.TYPE_TIMESTAMP == type) {
+
+ // FIX for Date : no format is done
+ if (value instanceof Date) {
+ Date date = (Date) value;
+
+ result = DbfTimestampConverter.toString(date);
+ }
+ }
+ else if (DbfTableModel.TYPE_DATE == type) {
+
+ // FIX for Date : no format is done
+ if (value instanceof Date) {
+ Date date = (Date) value;
+
+ result = DATE_FORMAT.format(date);
+ }
+ }
+ return result;
+ }
+
+}
Property changes on: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/DbfTableModelBuilder.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Added: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/DbfTimestampConverter.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/DbfTimestampConverter.java (rev 0)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/DbfTimestampConverter.java 2012-08-08 18:26:09 UTC (rev 372)
@@ -0,0 +1,92 @@
+package fr.ulr.sammoa.application.map;
+
+import com.google.common.base.Preconditions;
+import com.google.common.base.Strings;
+import org.nuiton.util.DateUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+
+/**
+ * Created: 08/08/12
+ *
+ * @author fdesbois <florian.desbois(a)codelutin.com>
+ */
+public final class DbfTimestampConverter {
+
+ protected static final Long HOUR_MULT = 3600000L;
+ protected static final Long MINUTE_MULT = 60000L;
+ protected static final Long SECOND_MULT = 1000L;
+
+
+ private static final Logger logger = LoggerFactory.getLogger(DbfTimestampConverter.class);
+
+ private DbfTimestampConverter() {
+ // static class
+ }
+
+ public static String toString(Date date) {
+
+ Calendar calendar = new GregorianCalendar();
+ calendar.setTime(date);
+
+ Calendar refCalendar = getReferenceCalendar();
+
+ long dateValue = DateUtil.getDifferenceInDays(refCalendar.getTime(), date);
+ long timeValue = calendar.get(Calendar.HOUR_OF_DAY) * HOUR_MULT
+ + calendar.get(Calendar.MINUTE) * MINUTE_MULT
+ + calendar.get(Calendar.SECOND) * SECOND_MULT;
+
+ String result = dateValue + " " + timeValue;
+ return result;
+ }
+
+ public static Date toDate(String timestamp) {
+ Preconditions.checkArgument(Strings.nullToEmpty(timestamp).trim().contains(" "),
+ "A space is missing between the date and time values");
+
+ String[] values = timestamp.split(" ");
+
+ Long dateValue = Long.parseLong(values[0]);
+ Long timeValue = Long.parseLong(values[1]);
+
+ Calendar refCalendar = getReferenceCalendar();
+
+ Calendar resultCalendar = new GregorianCalendar();
+ resultCalendar.setTime(refCalendar.getTime());
+
+ resultCalendar.add(Calendar.DATE, dateValue.intValue());
+
+ Long hours = timeValue / HOUR_MULT;
+ Long timeWithoutHours = timeValue - hours * HOUR_MULT;
+ Long minutes = timeWithoutHours / MINUTE_MULT;
+ Long seconds = (timeWithoutHours - minutes * MINUTE_MULT) / SECOND_MULT;
+
+ resultCalendar.set(Calendar.HOUR_OF_DAY, hours.intValue());
+ resultCalendar.set(Calendar.MINUTE, minutes.intValue());
+ resultCalendar.set(Calendar.SECOND, seconds.intValue());
+
+ if (logger.isDebugEnabled()) {
+ logger.debug(String.format("DateValue=%d, TimeValue=%d, Hours=%d, Minutes=%d, Seconds=%d, Result=%s",
+ dateValue,
+ timeValue,
+ hours,
+ minutes,
+ seconds,
+ resultCalendar)
+ );
+ }
+
+ return resultCalendar.getTime();
+ }
+
+ private static Calendar getReferenceCalendar() {
+ Calendar result = new GregorianCalendar(4713, 0, 1);
+ result.set(Calendar.ERA, GregorianCalendar.BC);
+ return result;
+ }
+
+}
Property changes on: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/DbfTimestampConverter.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/ExportMapService.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/ExportMapService.java 2012-08-08 16:50:09 UTC (rev 371)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/ExportMapService.java 2012-08-08 18:26:09 UTC (rev 372)
@@ -23,12 +23,34 @@
* #L%
*/
+import com.bbn.openmap.dataAccess.shape.DbfTableModel;
+import com.bbn.openmap.dataAccess.shape.EsriGraphicList;
+import com.bbn.openmap.dataAccess.shape.EsriPointList;
+import com.bbn.openmap.dataAccess.shape.EsriShapeExport;
+import com.bbn.openmap.omGraphics.OMGraphic;
+import com.bbn.openmap.omGraphics.OMPoint;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Maps;
import fr.ulr.sammoa.application.SammoaConfig;
import fr.ulr.sammoa.application.SammoaContext;
+import fr.ulr.sammoa.persistence.Campaign;
+import fr.ulr.sammoa.persistence.Flight;
+import fr.ulr.sammoa.persistence.GeoPoint;
+import fr.ulr.sammoa.persistence.Region;
import fr.ulr.sammoa.persistence.SammoaPersistence;
+import org.nuiton.util.PeriodDates;
+import org.nuiton.util.TimeLog;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.io.File;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
/**
* Export map service
*
@@ -40,16 +62,21 @@
private static final Logger logger =
LoggerFactory.getLogger(ExportMapService.class);
+ private static final TimeLog timeLog = new TimeLog(ExportMapService.class);
+
protected SammoaContext context;
protected SammoaConfig config;
protected SammoaPersistence persistence;
+ protected DateFormat timeFormat;
+
public ExportMapService(SammoaContext context) {
this.context = context;
this.persistence = context.getPersistence();
this.config = context.getConfig();
+ this.timeFormat = new SimpleDateFormat("HHmmss");
}
public void exportEffortsMap(ExportMapModel dataModel) {
@@ -84,10 +111,90 @@
dataModel.getExportDirectory() + "::" +
dataModel.getExportFilename());
}
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
+ long startTime = TimeLog.getTime();
+
+ Campaign campaign = dataModel.getCampaign();
+ Region region = campaign.getRegion();
+
+ DbfTableModelBuilder builder = new DbfTableModelBuilder()
+ .stringColumn("REGION")
+ .stringColumn("CAMPAIGN")
+ .integerColumn("FLIGHT")
+ .stringColumn("COMPUTER")
+ .dateColumn("DATE")
+ .stringColumn("HHMMSS")
+ .doubleColumn("LAT", 19, 11)
+ .doubleColumn("LON", 19, 11)
+ .doubleColumn("SPEED", 19, 11)
+ .doubleColumn("ALTITUDE", 19, 11)
+ .build();
+
+ EsriGraphicList graphicList = new EsriPointList();
+ List<Flight> campaignFlights = context.getFlightService().getFlights(dataModel.getCampaign());
+
+ // Filter on period
+ Date beginDate = dataModel.getBeginDate() == null ? campaign.getBeginDate() : dataModel.getBeginDate();
+ Date endDate = dataModel.getEndDate() == null ? campaign.getEndDate() : dataModel.getEndDate();
+ final PeriodDates period = new PeriodDates(beginDate, endDate);
+ Iterable<Flight> flights = Iterables.filter(campaignFlights, new Predicate<Flight>() {
+
+ @Override
+ public boolean apply(Flight input) {
+ return period.between(input.getBeginDate());
+ }
+ });
+
+ // Export for each flight
+ Map<String, Object> record = Maps.newHashMap();
+ for (Flight flight : flights) {
+
+ if (logger.isInfoEnabled()) {
+ logger.info(String.format("Export GeoPoints from flight %d - %s - %s - %s",
+ flight.getFlightNumber(),
+ flight.getSystemId(),
+ campaign.getCode(),
+ region.getCode())
+ );
+ }
+
+ List<GeoPoint> geoPoints = context.getFlightService().getFlightGeoPoints(flight);
+
+ // One record by GeoPoint
+ for (GeoPoint geoPoint : geoPoints) {
+
+ record.clear();
+
+ record.put("REGION", region.getCode());
+ record.put("CAMPAIGN", campaign.getCode());
+ record.put("FLIGHT", flight.getFlightNumber());
+ record.put("COMPUTER", flight.getSystemId());
+ record.put("DATE", geoPoint.getRecordTime());
+ record.put("HHMMSS", timeFormat.format(geoPoint.getRecordTime()));
+ record.put("LAT", geoPoint.getLatitude());
+ record.put("LON", geoPoint.getLongitude());
+ record.put("SPEED", geoPoint.getSpeed());
+ record.put("ALTITUDE", geoPoint.getAltitude());
+
+ builder.addValues(record);
+
+ if (logger.isTraceEnabled()) {
+ logger.trace("Record={}", record);
+ }
+
+ OMGraphic graphic = new OMPoint(geoPoint.getLatitude(), geoPoint.getLongitude());
+ graphicList.add(graphic);
+ }
}
+
+ startTime = timeLog.log(startTime, "exportGeoPointsMap", "after building EsriGraphicList and DbfTableModel");
+
+ // Execute export with EsriShapeExport
+ DbfTableModel tableModel = builder.getModel();
+ String pathFile = new File(dataModel.getExportDirectory(), dataModel.getExportFilename()).getAbsolutePath();
+ EsriShapeExport shapeExport = new EsriShapeExport(graphicList, tableModel, pathFile);
+ shapeExport.export();
+
+ timeLog.log(startTime, "exportGeoPointsMap", "after EsriShapeExport execution");
}
}
Modified: trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties
===================================================================
--- trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties 2012-08-08 16:50:09 UTC (rev 371)
+++ trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties 2012-08-08 18:26:09 UTC (rev 372)
@@ -1,3 +1,4 @@
+csv.import.error.unableToReadField=
sammoa.config.admin.email=Administrator's email
sammoa.config.application.site.url=Website URL of the application
sammoa.config.application.version=Version of the application
Added: trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/map/DbfTimestampConverterTest.java
===================================================================
--- trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/map/DbfTimestampConverterTest.java (rev 0)
+++ trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/map/DbfTimestampConverterTest.java 2012-08-08 18:26:09 UTC (rev 372)
@@ -0,0 +1,32 @@
+package fr.ulr.sammoa.application.map;
+
+import junit.framework.Assert;
+import org.junit.Test;
+import org.nuiton.util.DateUtil;
+
+import java.util.Date;
+
+/**
+ * Created: 08/08/12
+ *
+ * @author fdesbois <florian.desbois(a)codelutin.com>
+ */
+public class DbfTimestampConverterTest {
+
+ @Test
+ public void testToString() throws Exception {
+
+ Date date = DateUtil.createDate(52, 2, 19, 5, 3, 2007);
+ String result = DbfTimestampConverter.toString(date);
+// Assert.assertEquals(result, "2454488 68572000");
+ Assert.assertEquals(result, "2454165 68572000");
+ }
+
+ @Test
+ public void testToDate() throws Exception {
+
+ Date expected = DateUtil.createDate(52, 2, 19, 5, 3, 2007);
+ Date result = DbfTimestampConverter.toDate("2454165 68572000");
+ Assert.assertEquals(expected, result);
+ }
+}
Property changes on: trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/map/DbfTimestampConverterTest.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Added: trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/map/ExportMapServiceTest.java
===================================================================
--- trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/map/ExportMapServiceTest.java (rev 0)
+++ trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/map/ExportMapServiceTest.java 2012-08-08 18:26:09 UTC (rev 372)
@@ -0,0 +1,222 @@
+package fr.ulr.sammoa.application.map;
+
+import com.google.common.collect.Lists;
+import fr.ulr.sammoa.application.FlightService;
+import fr.ulr.sammoa.application.SammoaConfig;
+import fr.ulr.sammoa.application.SammoaContext;
+import fr.ulr.sammoa.application.csv.DoubleToIntegerValueParser;
+import fr.ulr.sammoa.persistence.Campaign;
+import fr.ulr.sammoa.persistence.CampaignImpl;
+import fr.ulr.sammoa.persistence.Flight;
+import fr.ulr.sammoa.persistence.FlightImpl;
+import fr.ulr.sammoa.persistence.GeoPoint;
+import fr.ulr.sammoa.persistence.GeoPointDAO;
+import fr.ulr.sammoa.persistence.GeoPointImpl;
+import fr.ulr.sammoa.persistence.Region;
+import fr.ulr.sammoa.persistence.RegionImpl;
+import fr.ulr.sammoa.persistence.SammoaDAOHelper;
+import fr.ulr.sammoa.persistence.SammoaDatabase;
+import junit.framework.Assert;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.nuiton.topia.TopiaContext;
+import org.nuiton.topia.TopiaException;
+import org.nuiton.util.DateUtil;
+import org.nuiton.util.csv.Common;
+import org.nuiton.util.csv.ImportModel;
+import org.nuiton.util.csv.ImportableColumn;
+import org.nuiton.util.csv.ModelBuilder;
+import org.nuiton.util.csv.ValueSetter;
+
+import java.io.File;
+import java.net.URL;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Created: 08/08/12
+ *
+ * @author fdesbois <florian.desbois(a)codelutin.com>
+ */
+public class ExportMapServiceTest {
+
+ public SammoaConfig config =
+ new SammoaConfig("sammoa-test.properties");
+
+ @Rule
+ public SammoaDatabase database = new SammoaDatabase("/" +
+ config.getApplicationConfig().getConfigFileName(), config.getAutoCommitDelay());
+
+ protected TopiaContext transaction;
+
+ @Before
+ public void setUp() throws TopiaException {
+ transaction = database.beginTransaction();
+ }
+
+ @After
+ public void tearDown() throws TopiaException {
+ database.endTransaction(transaction);
+ }
+
+ @Test
+ public void testExportGeoPointsMap() throws Exception {
+
+ SammoaContext context = new SammoaContext(config, database.getPersistence());
+
+ Campaign campaign = database.createCampaign("PACOMM", "FRANCE");
+ campaign.setBeginDate(DateUtil.createDate(1, 1, 2012));
+ campaign.setEndDate(DateUtil.createDate(31, 12, 2012));
+
+ FlightService flightService = new FlightService(context);
+ Flight flight = flightService.createFlight(campaign);
+
+ flight.setBeginDate(DateUtil.createDate(18, 0, 12, 18, 7, 2012));
+
+ createGeoPoint(DateUtil.createDate(30, 15, 12, 18, 7, 2012), 1, 2, flight);
+ createGeoPoint(DateUtil.createDate(39, 18, 12, 18, 7, 2012), 3, 4, flight);
+
+ transaction.commitTransaction();
+
+ ExportMapService exportMapService = new ExportMapService(context);
+
+ File exportDirectory = database.getTestBasedir();
+
+ ExportMapModel exportMapModel = ExportMapModel.newModel(
+ exportDirectory,
+ "export-geoPoints.shp",
+ campaign,
+ null,
+ null,
+ null,
+ null,
+ null
+ );
+
+ exportMapService.exportGeoPointsMap(exportMapModel);
+
+ Assert.assertTrue(new File(exportDirectory, "export-geoPoints.shp").exists());
+ Assert.assertTrue(new File(exportDirectory, "export-geoPoints.dbf").exists());
+ Assert.assertTrue(new File(exportDirectory, "export-geoPoints.shx").exists());
+
+ URL fileUrl = new File(exportDirectory, "export-geoPoints.dbf").toURI().toURL();
+ DbfImport<GeoPoint> dbfImport = new DbfImport<GeoPoint>(new GeoPointImportModel(), fileUrl);
+
+ List<GeoPoint> results = Lists.newArrayList(dbfImport);
+
+ Assert.assertEquals(2, results.size());
+ {
+ GeoPoint result = results.get(0);
+ Flight resultFlight = result.getFlight();
+ Campaign resultCampaign = resultFlight.getCampaign();
+ Region resultRegion = resultCampaign.getRegion();
+ Assert.assertEquals("FRANCE", resultRegion.getCode());
+ Assert.assertEquals("PACOMM", resultCampaign.getCode());
+ Assert.assertEquals(1, resultFlight.getFlightNumber());
+ Assert.assertEquals("A", resultFlight.getSystemId());
+ Assert.assertEquals(DateUtil.createDate(30, 15, 12, 18, 7, 2012), result.getRecordTime());
+ Assert.assertEquals(1., result.getLatitude());
+ Assert.assertEquals(2., result.getLongitude());
+ Assert.assertEquals(0., result.getAltitude());
+ Assert.assertEquals(0., result.getSpeed());
+ }
+ {
+ GeoPoint result = results.get(1);
+ Flight resultFlight = result.getFlight();
+ Campaign resultCampaign = resultFlight.getCampaign();
+ Region resultRegion = resultCampaign.getRegion();
+ Assert.assertEquals("FRANCE", resultRegion.getCode());
+ Assert.assertEquals("PACOMM", resultCampaign.getCode());
+ Assert.assertEquals(1, resultFlight.getFlightNumber());
+ Assert.assertEquals("A", resultFlight.getSystemId());
+ Assert.assertEquals(DateUtil.createDate(39, 18, 12, 18, 7, 2012), result.getRecordTime());
+ Assert.assertEquals(3., result.getLatitude());
+ Assert.assertEquals(4., result.getLongitude());
+ Assert.assertEquals(0., result.getAltitude());
+ Assert.assertEquals(0., result.getSpeed());
+ }
+ }
+
+ protected GeoPoint createGeoPoint(Date date,
+ double latitude,
+ double longitude,
+ Flight flight)
+ throws TopiaException {
+
+ GeoPointDAO transectDAO = SammoaDAOHelper.getGeoPointDAO(transaction);
+ GeoPoint result = transectDAO.create();
+ result.setRecordTime(date);
+ result.setLatitude(latitude);
+ result.setLongitude(longitude);
+ result.setFlight(flight);
+
+ return result;
+ }
+
+ protected class GeoPointImportModel implements ImportModel<GeoPoint> {
+
+ @Override
+ public char getSeparator() {
+ return ' ';
+ }
+
+ @Override
+ public void pushCsvHeaderNames(List<String> headerNames) {
+ }
+
+ @Override
+ public GeoPoint newEmptyInstance() {
+ Region region = new RegionImpl();
+ Campaign campaign = new CampaignImpl();
+ campaign.setRegion(region);
+ Flight flight = new FlightImpl();
+ flight.setCampaign(campaign);
+ GeoPoint result = new GeoPointImpl();
+ result.setFlight(flight);
+ return result;
+ }
+
+ @Override
+ public Iterable<ImportableColumn<GeoPoint, Object>> getColumnsForImport() {
+ ModelBuilder builder = new ModelBuilder();
+ builder.newMandatoryColumn("REGION", "flight.campaign.region.code");
+ builder.newMandatoryColumn("CAMPAIGN", "flight.campaign.code");
+ builder.newMandatoryColumn("FLIGHT", "flight.flightNumber", new DoubleToIntegerValueParser());
+ builder.newMandatoryColumn("COMPUTER", "flight.systemId");
+ builder.newMandatoryColumn("DATE", "recordTime", new Common.DateValue(DbfTableModelBuilder.DATE_FORMAT_PATTERN));
+ builder.newMandatoryColumn("HHMMSS", new Common.DateValue("HHmmss"), new GeoPointTimeValueSetter());
+ builder.newMandatoryColumn("LAT", "latitude", Common.DOUBLE_PRIMITIVE);
+ builder.newMandatoryColumn("LON", "longitude", Common.DOUBLE_PRIMITIVE);
+ builder.newMandatoryColumn("SPEED", "speed", Common.DOUBLE_PRIMITIVE);
+ builder.newMandatoryColumn("ALTITUDE", "altitude", Common.DOUBLE_PRIMITIVE);
+ return builder.getColumnsForImport();
+ }
+ }
+
+ protected class GeoPointTimeValueSetter implements ValueSetter<GeoPoint, Date> {
+
+ @Override
+ public void set(GeoPoint object, Date value) throws Exception {
+ Date recordTime = object.getRecordTime();
+// if (recordTime != null) {
+ Calendar resultCalendar = Calendar.getInstance();
+ resultCalendar.setTime(recordTime);
+
+ Calendar valueCalendar = Calendar.getInstance();
+ valueCalendar.setTime(value);
+ resultCalendar.set(Calendar.HOUR_OF_DAY, valueCalendar.get(Calendar.HOUR_OF_DAY));
+ resultCalendar.set(Calendar.MINUTE, valueCalendar.get(Calendar.MINUTE));
+ resultCalendar.set(Calendar.SECOND, valueCalendar.get(Calendar.SECOND));
+
+ object.setRecordTime(resultCalendar.getTime());
+
+// } else {
+// object.setRecordTime(value);
+// }
+ }
+
+ }
+}
Property changes on: trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/map/ExportMapServiceTest.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/FlightUIHandler.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java 2012-08-08 16:50:09 UTC (rev 371)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java 2012-08-08 18:26:09 UTC (rev 372)
@@ -208,9 +208,9 @@
List<Route> routes = getFlightService().getRoutes(flight);
List<GeoPoint> geoPoints = getFlightService().getFlightGeoPoints(flight);
- if (logger.isDebugEnabled()) {
+ if (logger.isTraceEnabled()) {
for (GeoPoint geoPoint : geoPoints) {
- logger.debug(String.format("GeoPoint={%1$tH:%1$tM:%1$tS,%2$f,%3$f}",
+ logger.trace(String.format("GeoPoint={%1$tH:%1$tM:%1$tS,%2$f,%3$f}",
geoPoint.getRecordTime(),
geoPoint.getLatitude(),
geoPoint.getLongitude())
Deleted: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/DbfImport.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/DbfImport.java 2012-08-08 16:50:09 UTC (rev 371)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/DbfImport.java 2012-08-08 18:26:09 UTC (rev 372)
@@ -1,129 +0,0 @@
-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 com.bbn.openmap.dataAccess.shape.DbfTableModel;
-import com.google.common.base.Throwables;
-import com.google.common.collect.Lists;
-import org.nuiton.util.csv.Import;
-import org.nuiton.util.csv.ImportModel;
-import org.nuiton.util.csv.ImportRuntimeException;
-import org.nuiton.util.csv.ImportableColumn;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.io.Reader;
-import java.net.URL;
-import java.util.Iterator;
-import java.util.List;
-
-import static org.nuiton.i18n.I18n._;
-
-/**
- * Created: 25/07/12
- *
- * @author fdesbois <desbois(a)codelutin.com>
- */
-public class DbfImport<E> extends Import<E> {
-
- private static final Logger logger = LoggerFactory.getLogger(DbfImport.class);
-
- protected DbfTableModel source;
-
- protected Iterator<List<Object>> records;
-
- protected List<Object> record;
-
- public DbfImport(ImportModel<E> model, URL fileUrl) {
- // Use dummy reader for superclass Import that manage by default csv files
- super(model, new Reader() {
-
- @Override
- public int read(char[] cbuf, int off, int len) throws IOException {
- return -1;
- }
-
- @Override
- public void close() throws IOException {
- }
- });
-
- try {
- // FIXME-fdesbois-2012-07-26 : there is an issue with encoding, don't know how to customize it
- this.source = DbfTableModel.read(fileUrl);
-
- } catch (Exception e) {
- throw Throwables.propagate(e);
- }
- this.records = source.getRecords();
- }
-
- @Override
- protected <T> String readValue(ImportableColumn<E, T> field, int lineNumber) {
- try {
-
- int columnNumber = source.getColumnIndexForName(field.getHeaderName());
-
- String value = String.valueOf(record.get(columnNumber));
-
- return value;
-
- } catch (Exception e) {
- throw new ImportRuntimeException(
- _("csv.import.error.unableToReadField",
- field.getHeaderName(), lineNumber), e);
- }
- }
-
- @Override
- public void close() {
- // nothing to do
- }
-
- @Override
- protected boolean readRow() throws ImportRuntimeException {
- boolean result;
- if (records.hasNext()) {
- record = records.next();
- if (logger.isTraceEnabled()) {
- logger.trace("Read record {}", record);
- }
- result = true;
-
- } else {
- result = false;
- }
- return result;
- }
-
- @Override
- protected String[] getHeaders() throws ImportRuntimeException {
- List<String> list = Lists.newArrayList();
- for (int index = 0; index < source.getColumnCount(); index++) {
- list.add(source.getColumnName(index));
- }
- return list.toArray(new String[list.size()]);
- }
-}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/ShpImporter.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/ShpImporter.java 2012-08-08 16:50:09 UTC (rev 371)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/ShpImporter.java 2012-08-08 18:26:09 UTC (rev 372)
@@ -24,6 +24,7 @@
*/
import com.google.common.io.Files;
+import fr.ulr.sammoa.application.map.DbfImport;
import org.apache.commons.io.FileUtils;
import org.nuiton.util.csv.ImportModel;
import org.slf4j.Logger;
1
0
Author: tchemit
Date: 2012-08-08 18:50:09 +0200 (Wed, 08 Aug 2012)
New Revision: 371
Url: http://forge.codelutin.com/repositories/revision/sammoa/371
Log:
updates to nuiton-utils 2.5.3 and jaxx 2.5.4
Modified:
trunk/pom.xml
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2012-08-08 16:00:02 UTC (rev 370)
+++ trunk/pom.xml 2012-08-08 16:50:09 UTC (rev 371)
@@ -109,7 +109,7 @@
<!-- libraries version -->
- <nuitonUtilsVersion>2.5.2</nuitonUtilsVersion>
+ <nuitonUtilsVersion>2.5.3</nuitonUtilsVersion>
<nuitonI18nVersion>2.4.1</nuitonI18nVersion>
<eugenePluginVersion>2.4.2</eugenePluginVersion>
@@ -121,7 +121,7 @@
<h2Version>1.3.168</h2Version>
<postgresqlVersion>9.1-901-1.jdbc4</postgresqlVersion>
- <jaxxVersion>2.5.4-SNAPSHOT</jaxxVersion>
+ <jaxxVersion>2.5.4</jaxxVersion>
<swingXVersion>1.6.4</swingXVersion>
<xworkVersion>2.3.4</xworkVersion>
1
0