diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/WindTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/WindTest.java index 2e7a1072166..ebeb746720a 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/WindTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/WindTest.java @@ -5,6 +5,8 @@ import static org.junit.Assert.assertNull; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.HashSet; +import java.util.Set; import org.junit.Test; @@ -17,10 +19,32 @@ import com.sap.sailing.domain.tracking.Wind; import com.sap.sailing.domain.tracking.WindTrack; import com.sap.sailing.domain.tracking.impl.WindImpl; import com.sap.sailing.domain.tracking.impl.WindTrackImpl; +import com.sap.sailing.util.Util; public class WindTest { private static final int AVERAGING_INTERVAL_MILLIS = 30000 /* 30s averaging interval */; + @Test + public void testMultipleWindFixesWithSameTimestampInSameWindTrack() { + WindTrack track = new WindTrackImpl(AVERAGING_INTERVAL_MILLIS); + TimePoint now = MillisecondsTimePoint.now(); + DegreePosition pos1 = new DegreePosition(0, 0); + DegreePosition pos2 = new DegreePosition(1, 1); + Wind wind1 = new WindImpl(pos1, now, new KnotSpeedWithBearingImpl(10, new DegreeBearingImpl(0))); + Wind wind2 = new WindImpl(pos2, now, new KnotSpeedWithBearingImpl(20, new DegreeBearingImpl(0))); + track.add(wind1); + track.add(wind2); + assertEquals(2, Util.size(track.getFixes())); + Set expectedWind = new HashSet(); + expectedWind.add(wind1); + expectedWind.add(wind2); + Set actualWind = new HashSet(); + for (Wind wind : track.getFixes()) { + actualWind.add(wind); + } + assertEquals(expectedWind, actualWind); + } + @Test public void testEmptyTrackYieldsNullAsWindEstimate() { WindTrack track = new WindTrackImpl(AVERAGING_INTERVAL_MILLIS); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackImpl.java index a2134fa71b3..e1261fb3b31 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackImpl.java @@ -32,10 +32,13 @@ public abstract class TrackImpl implements Track } public TrackImpl() { - super(); - this.fixes = new ArrayListNavigableSet(TimedComparator.INSTANCE); + this(new ArrayListNavigableSet(TimedComparator.INSTANCE)); } + protected TrackImpl(NavigableSet fixes) { + this.fixes = fixes; + } + protected NavigableSet getInternalRawFixes() { @SuppressWarnings("unchecked") NavigableSet result = (NavigableSet) fixes; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/WindComparator.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/WindComparator.java new file mode 100755 index 00000000000..3b4fd539ea5 --- /dev/null +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/WindComparator.java @@ -0,0 +1,36 @@ +package com.sap.sailing.domain.tracking.impl; + +import java.util.Comparator; + +import com.sap.sailing.domain.base.Timed; +import com.sap.sailing.domain.tracking.Wind; + +/** + * Compares two {@link Wind} objects first by their {@link Wind#getTimePoint() time point}. Only if both + * wind fixes were taken at the same time, their position is used as a secondary criteria. A more or less + * arbitrary ordering is used, sorting first by latitude, and if that is equal too, sorting by longitude. + * + * @author Axel Uhl (d043530) + * + */ +public class WindComparator implements Comparator { + public static final Comparator INSTANCE = new WindComparator(); + + @Override + public int compare(Timed o1, Timed o2) { + int result = o1.getTimePoint().compareTo(o2.getTimePoint()); + if (result == 0) { + if (o1 instanceof Wind && o2 instanceof Wind) { + Wind o1Wind = (Wind) o1; + Wind o2Wind = (Wind) o2; + // use the coordinates as secondary criteria: + result = Double.compare(o1Wind.getPosition().getLatDeg(), o2Wind.getPosition().getLatDeg()); + if (result == 0) { + result = Double.compare(o1Wind.getPosition().getLngDeg(), o2Wind.getPosition().getLngDeg()); + } + } + } + return result; + } +} + diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/WindTrackImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/WindTrackImpl.java index 538f76e4aeb..384c81fe91c 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/WindTrackImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/WindTrackImpl.java @@ -13,11 +13,13 @@ import com.sap.sailing.domain.base.Position; import com.sap.sailing.domain.base.Speed; import com.sap.sailing.domain.base.SpeedWithBearing; import com.sap.sailing.domain.base.TimePoint; +import com.sap.sailing.domain.base.Timed; import com.sap.sailing.domain.base.impl.DegreeBearingImpl; import com.sap.sailing.domain.base.impl.KnotSpeedWithBearingImpl; import com.sap.sailing.domain.tracking.Wind; import com.sap.sailing.domain.tracking.WindListener; import com.sap.sailing.domain.tracking.WindTrack; +import com.sap.sailing.util.impl.ArrayListNavigableSet; /** * Records {@link Wind} objects over time and offers to average the last so many of them into an @@ -35,6 +37,7 @@ public class WindTrackImpl extends TrackImpl implements WindTrack { private final Set listeners; public WindTrackImpl(long millisecondsOverWhichToAverage) { + super(new ArrayListNavigableSet(WindComparator.INSTANCE)); this.millisecondsOverWhichToAverage = millisecondsOverWhichToAverage; listeners = new HashSet(); } diff --git a/java/com.sap.sailing.gwt.ui.test/bin/com/sap/sailing/gwt/ui/test/TestConsole.gwt.xml b/java/com.sap.sailing.gwt.ui.test/bin/com/sap/sailing/gwt/ui/test/TestConsole.gwt.xml index f631a5cb7e4..58d318e4601 100755 --- a/java/com.sap.sailing.gwt.ui.test/bin/com/sap/sailing/gwt/ui/test/TestConsole.gwt.xml +++ b/java/com.sap.sailing.gwt.ui.test/bin/com/sap/sailing/gwt/ui/test/TestConsole.gwt.xml @@ -1,9 +1,9 @@ - - - - - - - - + + + + + + + + \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui.test/build.properties b/java/com.sap.sailing.gwt.ui.test/build.properties index 6f5a2d6a64f..efef09aff6d 100755 --- a/java/com.sap.sailing.gwt.ui.test/build.properties +++ b/java/com.sap.sailing.gwt.ui.test/build.properties @@ -2,8 +2,7 @@ source.. = src/,\ resources/ output.. = bin bin.includes = META-INF/,\ - .,\ - war/ + . jars.compile.order = . source.. = src/,\ resources/ diff --git a/java/com.sap.sailing.gwt.ui/META-INF/MANIFEST.MF b/java/com.sap.sailing.gwt.ui/META-INF/MANIFEST.MF index 9e472e7d012..d2386d779ee 100755 --- a/java/com.sap.sailing.gwt.ui/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.gwt.ui/META-INF/MANIFEST.MF @@ -28,7 +28,7 @@ Bundle-ClassPath: lib/gwt-maps.jar, Bundle-Activator: com.sap.sailing.gwt.ui.server.Activator Bundle-ActivationPolicy: lazy Export-Package: com.sap.sailing.gwt.ui.client;x-friends:="com.sap.sailing.gwt.ui.test", - com.sap.sailing.gwt.ui.server;x-friends:="com.sap.sailing.gwt.ui.test", + com.sap.sailing.gwt.ui.server;x-friends:="com.sap.sailing.gwt.ui.test,com.sap.ui.phoenix.resource-osgi", com.sap.sailing.gwt.ui.shared;x-friends:="com.sap.sailing.gwt.ui.test" Import-Package: org.osgi.framework, org.osgi.util.tracker,