r502 - in trunk: . sammoa-application sammoa-application/src/main/java/fr/ulr/sammoa/application sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map sammoa-persistence sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight
Author: fdesbois Date: 2012-09-01 11:50:23 +0200 (Sat, 01 Sep 2012) New Revision: 502 Url: http://forge.codelutin.com/repositories/revision/sammoa/502 Log: refs #1419 : improve time using Joda-Time. PeriodDates is replaced by Joda-Time Interval class. Added: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Dates.java Modified: trunk/pom.xml trunk/sammoa-application/pom.xml trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/FakeGpsHandler.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsHandlerGpsylon.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerValidation.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.java trunk/sammoa-persistence/pom.xml trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Flights.java trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2012-09-01 09:50:03 UTC (rev 501) +++ trunk/pom.xml 2012-09-01 09:50:23 UTC (rev 502) @@ -122,6 +122,8 @@ <swingXVersion>1.6.4</swingXVersion> <xworkVersion>2.3.4</xworkVersion> + <jodaTimeVersion>2.1</jodaTimeVersion> + <slf4jVersion>1.6.6</slf4jVersion> <logbackVersion>1.0.6</logbackVersion> @@ -166,6 +168,12 @@ </dependency> <dependency> + <groupId>joda-time</groupId> + <artifactId>joda-time</artifactId> + <version>${jodaTimeVersion}</version> + </dependency> + + <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>${guavaVersion}</version> Modified: trunk/sammoa-application/pom.xml =================================================================== --- trunk/sammoa-application/pom.xml 2012-09-01 09:50:03 UTC (rev 501) +++ trunk/sammoa-application/pom.xml 2012-09-01 09:50:23 UTC (rev 502) @@ -50,6 +50,11 @@ </dependency> <dependency> + <groupId>joda-time</groupId> + <artifactId>joda-time</artifactId> + </dependency> + + <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java 2012-09-01 09:50:03 UTC (rev 501) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java 2012-09-01 09:50:23 UTC (rev 502) @@ -34,6 +34,7 @@ import fr.ulr.sammoa.application.io.SammoaStorages; import fr.ulr.sammoa.persistence.AutoSaveListener; import fr.ulr.sammoa.persistence.Campaign; +import fr.ulr.sammoa.persistence.Dates; import fr.ulr.sammoa.persistence.Flight; import fr.ulr.sammoa.persistence.FlightDAO; import fr.ulr.sammoa.persistence.Flights; @@ -61,10 +62,10 @@ import fr.ulr.sammoa.persistence.TransectFlights; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.joda.time.Interval; import org.nuiton.topia.TopiaContext; import org.nuiton.topia.TopiaException; import org.nuiton.topia.TopiaRuntimeException; -import org.nuiton.util.PeriodDates; import org.nuiton.util.TimeLog; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -120,7 +121,7 @@ List<Flight> result = dao.findAllByCampaign(campaign); - Collections.sort(result, Flights.onDate()); + Collections.sort(result, Flights.orderByDate()); timeLog.log(start, "getFlights(" + campaign.getCode() + ")"); return result; @@ -165,7 +166,7 @@ FlightDAO dao = SammoaDAOHelper.getFlightDAO(transaction); campaignFlights = dao.findAllByCampaign(campaign); - Collections.sort(campaignFlights, Flights.onDate()); + Collections.sort(campaignFlights, Flights.orderByDate()); } catch (TopiaException e) { throw new TopiaRuntimeException(e); @@ -173,13 +174,12 @@ } // Filter on period - final PeriodDates period = new PeriodDates(beginDate, endDate); + final Interval interval = Dates.toInterval(beginDate, endDate); Iterable<Flight> result = Iterables.filter(campaignFlights, new Predicate<Flight>() { @Override public boolean apply(Flight input) { - return input.getBeginDate() != null && - period.between(input.getBeginDate()); + return Dates.inInterval(input.getBeginDate(), interval); } }); Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/FakeGpsHandler.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/FakeGpsHandler.java 2012-09-01 09:50:03 UTC (rev 501) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/FakeGpsHandler.java 2012-09-01 09:50:23 UTC (rev 502) @@ -26,10 +26,10 @@ import fr.ulr.sammoa.application.device.DeviceState; import fr.ulr.sammoa.application.device.DeviceTechnicalException; +import fr.ulr.sammoa.persistence.Dates; import fr.ulr.sammoa.persistence.GeoPoint; import fr.ulr.sammoa.persistence.GeoPointImpl; import fr.ulr.sammoa.persistence.GeoPoints; -import org.apache.commons.lang3.time.DateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -180,8 +180,7 @@ } protected Date getDate() { - Date result = new Date(); - result = DateUtils.setMilliseconds(result, 0); + Date result = Dates.newDateWithoutMillis(); return result; } Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsHandlerGpsylon.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsHandlerGpsylon.java 2012-09-01 09:50:03 UTC (rev 501) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsHandlerGpsylon.java 2012-09-01 09:50:23 UTC (rev 502) @@ -27,11 +27,11 @@ import fr.ulr.sammoa.application.device.DeviceState; import fr.ulr.sammoa.application.device.DeviceTechnicalException; +import fr.ulr.sammoa.persistence.Dates; import fr.ulr.sammoa.persistence.GeoPoint; import fr.ulr.sammoa.persistence.GeoPointImpl; import fr.ulr.sammoa.persistence.GeoPoints; import gnu.io.CommPortIdentifier; -import org.apache.commons.lang3.time.DateUtils; import org.dinopolis.gpstool.gpsinput.GPSDataProcessor; import org.dinopolis.gpstool.gpsinput.GPSDevice; import org.dinopolis.gpstool.gpsinput.GPSException; @@ -260,8 +260,7 @@ protected Date getDate() { // FIXME-fdesbois-2012-07-02 : ensure time with GPS value and not system timestamp - Date result = new Date(); - result = DateUtils.setMilliseconds(result, 0); + Date result = Dates.newDateWithoutMillis(); return result; } Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerValidation.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerValidation.java 2012-09-01 09:50:03 UTC (rev 501) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerValidation.java 2012-09-01 09:50:23 UTC (rev 502) @@ -26,6 +26,7 @@ import com.google.common.base.Preconditions; import fr.ulr.sammoa.application.device.DeviceManager; import fr.ulr.sammoa.application.device.audio.AudioReader; +import fr.ulr.sammoa.persistence.Dates; import fr.ulr.sammoa.persistence.Flight; import fr.ulr.sammoa.persistence.GeoPoint; import fr.ulr.sammoa.persistence.GeoPointImpl; @@ -34,15 +35,13 @@ import fr.ulr.sammoa.persistence.Routes; import fr.ulr.sammoa.persistence.SammoaDAOHelper; import fr.ulr.sammoa.persistence.TransectFlight; -import org.apache.commons.lang3.time.DateUtils; +import org.joda.time.DateTime; import org.nuiton.topia.TopiaContext; import org.nuiton.topia.TopiaException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; -import java.util.Calendar; -import java.util.Date; import java.util.List; /** @@ -90,25 +89,24 @@ GeoPoint result; - Date previousTime = currentRoute.getBeginTime(); + DateTime previousTime = Dates.toDateTime(currentRoute.getBeginTime()); if (logger.isDebugEnabled()) { logger.debug(String.format("Get location after previousTime %1$tH:%1$tM:%1$tS.%1$tL", - previousTime) + previousTime.toDate()) ); } long position = audioReader.getPosition(); - Date newTime; + DateTime newTime; if (position > 0) { - newTime = DateUtils.addSeconds(previousTime, (int) position); + newTime = previousTime.plus(position); } else { - newTime = new Date(); - newTime.setTime(previousTime.getTime()); + newTime = new DateTime(previousTime); // // Arbitrary add 1 second for the newTime // newTime = DateUtils.addMilliseconds(previousTime, 1000); @@ -134,28 +132,37 @@ if (logger.isDebugEnabled()) { logger.debug(String.format("Get location at newTime %1$tH:%1$tM:%1$tS.%1$tL", - newTime) + newTime.toDate()) ); } // Retrieve the appropriate location - GeoPoint location = GeoPoints.getClosestPoint(geoPoints, newTime); + GeoPoint location = GeoPoints.getClosestPoint(geoPoints, newTime.toDate()); + DateTime locationTime = Dates.toDateTime(location.getRecordTime()); // Create a new location if no one is available for the newTime - if (!location.getRecordTime().equals(newTime)) { + if (!locationTime.equals(newTime)) { result = new GeoPointImpl(location.getLatitude(), location.getLongitude()); result.setSpeed(location.getSpeed()); result.setAltitude(location.getAltitude()); - // Ensure captureDelay of the new recording time - long locationSeconds = DateUtils.getFragmentInSeconds(location.getRecordTime(), Calendar.MINUTE); - long newSeconds = DateUtils.getFragmentInSeconds(newTime, Calendar.MINUTE); - int captureDelay = (int) newSeconds - (int) locationSeconds; +// // Ensure captureDelay of the new recording time +// long locationSeconds = DateUtils.getFragmentInSeconds(location.getRecordTime(), Calendar.MINUTE); +// long newSeconds = DateUtils.getFragmentInSeconds(newTime, Calendar.MINUTE); +// int captureDelay = (int) newSeconds - (int) locationSeconds; +// result.setCaptureDelay(captureDelay); + + int captureDelay = Dates + .toInterval(locationTime, newTime) + .toDuration() + .toStandardSeconds() + .getSeconds(); + result.setCaptureDelay(captureDelay); result.setFlight(flight); - result.setRecordTime(newTime); + result.setRecordTime(newTime.toDate()); SammoaDAOHelper.getGeoPointDAO(tx).create(result); geoPoints.add(result); Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.java 2012-09-01 09:50:03 UTC (rev 501) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.java 2012-09-01 09:50:23 UTC (rev 502) @@ -34,6 +34,7 @@ import fr.ulr.sammoa.application.FlightService; import fr.ulr.sammoa.application.SammoaServiceSupport; import fr.ulr.sammoa.persistence.Campaign; +import fr.ulr.sammoa.persistence.Dates; import fr.ulr.sammoa.persistence.Flight; import fr.ulr.sammoa.persistence.GeoPoint; import fr.ulr.sammoa.persistence.GeoPoints; @@ -50,14 +51,13 @@ import fr.ulr.sammoa.persistence.Strate; import fr.ulr.sammoa.persistence.Transect; import fr.ulr.sammoa.persistence.TransectFlight; +import org.joda.time.DateTime; +import org.joda.time.Interval; import org.nuiton.topia.TopiaContext; -import org.nuiton.util.PeriodDates; import org.nuiton.util.TimeLog; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.text.DateFormat; -import java.text.SimpleDateFormat; import java.util.Date; import java.util.Iterator; import java.util.List; @@ -76,7 +76,7 @@ private static final TimeLog timeLog = new TimeLog(ExportMapService.class); - protected final DateFormat timeFormat = new SimpleDateFormat("HHmmss"); +// protected final DateFormat timeFormat = new SimpleDateFormat("HHmmss"); public int exportEffortsMap(ExportMapModel dataModel) { Preconditions.checkNotNull(dataModel); @@ -435,39 +435,43 @@ effortGroup = null; } - // compute route period - Date beginTime = new Date(route.getBeginTime().getTime()); + // compute route time interval + DateTime beginTime = Dates.toDateTime(route.getBeginTime()); - Date routeEndTime; + DateTime endTime; if (nextRouteIndex < nbRoutes) { // use next route begin time Route nextRoute = routes.get(nextRouteIndex); - routeEndTime = nextRoute.getBeginTime(); + endTime = Dates.toDateTime(nextRoute.getBeginTime()); } else { // use flight end date - routeEndTime = flight.getEndDate(); + endTime = Dates.toDateTime(flight.getEndDate()); } - if (routeEndTime != null) { - routeEndTime = new Date(routeEndTime.getTime()); - Preconditions.checkState(routeEndTime.after(beginTime), - String.format("Route debut de route %s - fin de route %s", beginTime, routeEndTime)); + + if (endTime.equals(beginTime)) { + + // ignore this route, we will use the next one + continue; } - PeriodDates routePeriod = - new PeriodDates(beginTime, routeEndTime); + Preconditions.checkState(endTime.isAfter(beginTime), + String.format("Route debut de route %s - fin de route %s", beginTime, endTime)); + Interval routeInterval = + Dates.toInterval(beginTime, endTime); + // Get observations for this route List<Observation> routeObservations = Observations.retainsObservations(observations, - routePeriod); + routeInterval); if (logger.isDebugEnabled()) { logger.debug("Export Observations from route {} [{}-{}] nb observations {}", new Object[]{beginTime, - routeEndTime, + endTime, routeObservations.size()} ); } @@ -662,7 +666,7 @@ protected void fillDateRecord(Date date, Map<String, Object> record) { record.put("DATE", date); - record.put("HHMMSS", timeFormat.format(date)); + record.put("HHMMSS", Dates.toDateTime(date).toString("HHmmss")); } protected void fillGeoPointRecordAndFlush(GeoPoint geoPoint, Modified: trunk/sammoa-persistence/pom.xml =================================================================== --- trunk/sammoa-persistence/pom.xml 2012-09-01 09:50:03 UTC (rev 501) +++ trunk/sammoa-persistence/pom.xml 2012-09-01 09:50:23 UTC (rev 502) @@ -27,6 +27,11 @@ </dependency> <dependency> + <groupId>joda-time</groupId> + <artifactId>joda-time</artifactId> + </dependency> + + <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> Added: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Dates.java =================================================================== --- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Dates.java (rev 0) +++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Dates.java 2012-09-01 09:50:23 UTC (rev 502) @@ -0,0 +1,62 @@ +package fr.ulr.sammoa.persistence; + +import org.joda.time.DateTime; +import org.joda.time.Interval; + +import java.util.Date; + +/** + * Created: 31/08/12 + * + * @author fdesbois <florian.desbois@codelutin.com> + */ +public final class Dates { + + private Dates() { + // static class do not have instanciation + } + + public static Interval toInterval(DateTime begin, DateTime end) { + return new Interval(begin, end); + } + + public static Interval toInterval(Date begin, Date end) { + return toInterval(toDateTime(begin), toDateTime(end)); + } + + public static DateTime toDateTime(Date date) { + return new DateTime(date); + } + + public static Date newDateWithoutMillis() { + return DateTime.now().withMillisOfSecond(0).toDate(); + } + + public static boolean inInterval(Date date, Date begin, Date end) { + return inInterval(date, toInterval(begin, end)); + } + + public static boolean inInterval(Date date, Interval interval) { + return interval.contains(toDateTime(date)); + } + +// public static Predicate<Date> inInterval(Interval interval) { +// return new InIntervalPredicate(interval); +// } +// +// private static class InIntervalPredicate implements Predicate<Date> { +// +// protected Interval interval; +// +// public InIntervalPredicate(Interval interval) { +// Preconditions.checkNotNull(interval); +// this.interval = interval; +// } +// +// @Override +// public boolean apply(Date input) { +// return inInterval(input, interval); +// } +// } + +} Property changes on: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Dates.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Flights.java =================================================================== --- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Flights.java 2012-09-01 09:50:03 UTC (rev 501) +++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Flights.java 2012-09-01 09:50:23 UTC (rev 502) @@ -41,8 +41,8 @@ // static class do not have instanciation } - public static Comparator<Flight> onDate() { - return ON_DATE_COMPARATOR; + public static Comparator<Flight> orderByDate() { + return ORDER_BY_DATE_COMPARATOR; } public static Function<Flight, String> toSystemId() { @@ -89,7 +89,7 @@ } } - protected static Comparator<Flight> ON_DATE_COMPARATOR = + protected static Comparator<Flight> ORDER_BY_DATE_COMPARATOR = new Comparator<Flight>() { @Override Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java =================================================================== --- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java 2012-09-01 09:50:03 UTC (rev 501) +++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java 2012-09-01 09:50:23 UTC (rev 502) @@ -29,7 +29,7 @@ import com.google.common.collect.FluentIterable; import com.google.common.collect.Iterables; import org.apache.commons.collections.CollectionUtils; -import org.nuiton.util.PeriodDates; +import org.joda.time.Interval; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -95,9 +95,7 @@ Date begin = previousRoute.getBeginTime(); Date end = nextRoute != null ? nextRoute.getBeginTime() : null; - PeriodDates period = new PeriodDates(begin, end); - - return inPeriod(observation, period); + return Dates.inInterval(observation.getObservationTime(), begin, end); } public static Predicate<Observation> inRoute(Route route, @@ -106,24 +104,26 @@ return new InRoutePredicate(route, routes, ignoreDeleted); } - public static boolean inPeriod(Observation observation, PeriodDates periodDate) { +// public static boolean inDateInterval(Observation observation, Interval interval) { +// +// boolean result = Dates.inInterval(observation.getObservationTime(), interval); +// +//// Date thruDate = periodDate.getThruDate(); +//// +//// boolean result; +//// if (thruDate == null) { +//// result = periodDate.afterBegin(observation.getObservationTime()); +//// } else { +//// result = periodDate.between(observation.getObservationTime()) +//// && !thruDate.equals(observation.getObservationTime()); +//// } +// return result; +// } - Date thruDate = periodDate.getThruDate(); - - boolean result; - if (thruDate == null) { - result = periodDate.afterBegin(observation.getObservationTime()); - } else { - result = periodDate.between(observation.getObservationTime()) - && !thruDate.equals(observation.getObservationTime()); - } - return result; + public static Predicate<Observation> inDateInterval(Interval interval) { + return new InDateIntervalPredicate(interval); } - public static Predicate<Observation> inPeriod(PeriodDates periodDate) { - return new InPeriodPredicate(periodDate); - } - public static void removeOtherSpecies(List<Observation> observations, List<Species> species) { if (CollectionUtils.isNotEmpty(species)) { @@ -140,7 +140,7 @@ } public static List<Observation> retainsObservations(List<Observation> observations, - PeriodDates periodDate) { + Interval interval) { // List<Observation> result = Lists.newArrayList(); // Iterator<Observation> itr = observations.iterator(); @@ -168,7 +168,7 @@ List<Observation> result = FluentIterable .from(observations) - .filter(inPeriod(periodDate)) + .filter(inDateInterval(interval)) .toImmutableList(); Iterables.removeAll(observations, result); @@ -208,18 +208,18 @@ } } - private static class InPeriodPredicate implements Predicate<Observation> { + private static class InDateIntervalPredicate implements Predicate<Observation> { - protected PeriodDates periodDate; + protected Interval interval; - public InPeriodPredicate(PeriodDates periodDate) { - Preconditions.checkNotNull(periodDate); - this.periodDate = periodDate; + public InDateIntervalPredicate(Interval interval) { + Preconditions.checkNotNull(interval); + this.interval = interval; } @Override public boolean apply(Observation input) { - return Observations.inPeriod(input, periodDate); + return Dates.inInterval(input.getObservationTime(), interval); } } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java 2012-09-01 09:50:03 UTC (rev 501) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java 2012-09-01 09:50:23 UTC (rev 502) @@ -542,6 +542,7 @@ @Override public void onCloseUI() { transectUi.removeComponentListener(transectUIListener); + flightController.close(); try { context.closeService(flightController);
participants (1)
-
fdesbois@users.forge.codelutin.com