diff --git a/java/com.sap.sailing.domain.common/.classpath b/java/com.sap.sailing.domain.common/.classpath index 2803f249674..40c43964e67 100644 --- a/java/com.sap.sailing.domain.common/.classpath +++ b/java/com.sap.sailing.domain.common/.classpath @@ -3,6 +3,6 @@ - + diff --git a/java/com.sap.sailing.domain.common/.settings/org.eclipse.core.resources.prefs b/java/com.sap.sailing.domain.common/.settings/org.eclipse.core.resources.prefs index 7cb3fc664b4..144431c0d7c 100755 --- a/java/com.sap.sailing.domain.common/.settings/org.eclipse.core.resources.prefs +++ b/java/com.sap.sailing.domain.common/.settings/org.eclipse.core.resources.prefs @@ -1,3 +1,3 @@ eclipse.preferences.version=1 encoding//src/com/sap/sailing/domain/common/AbstractBearing.java=UTF-8 -encoding//src/com/sap/sailing/domain/common/impl/CountryCodeFactoryImpl.java=UTF-8 +encoding//src/com/sap/sailing/domain/common/impl/AbstractSpeedWithAbstractBearingImpl.java=UTF-8 diff --git a/java/com.sap.sailing.domain.common/.settings/org.eclipse.jdt.core.prefs b/java/com.sap.sailing.domain.common/.settings/org.eclipse.jdt.core.prefs index ccf9364eb7a..980b98c1d5f 100755 --- a/java/com.sap.sailing.domain.common/.settings/org.eclipse.jdt.core.prefs +++ b/java/com.sap.sailing.domain.common/.settings/org.eclipse.jdt.core.prefs @@ -1,8 +1,12 @@ -#Thu Jan 19 10:01:03 CET 2012 eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/java/com.sap.sailing.domain.common/META-INF/MANIFEST.MF b/java/com.sap.sailing.domain.common/META-INF/MANIFEST.MF index 97baf73d088..59848e02ac8 100755 --- a/java/com.sap.sailing.domain.common/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.domain.common/META-INF/MANIFEST.MF @@ -4,9 +4,10 @@ Bundle-Name: SAP Sailing Common Bundle-SymbolicName: com.sap.sailing.domain.common Bundle-Version: 1.0.0.qualifier Bundle-Vendor: SAP -Bundle-RequiredExecutionEnvironment: JavaSE-1.6 +Bundle-RequiredExecutionEnvironment: JavaSE-1.7 Bundle-ActivationPolicy: lazy Export-Package: com.sap.sailing.domain.common, + com.sap.sailing.domain.common.abstractlog, com.sap.sailing.domain.common.confidence, com.sap.sailing.domain.common.confidence.impl, com.sap.sailing.domain.common.configuration, @@ -18,9 +19,7 @@ Export-Package: com.sap.sailing.domain.common, com.sap.sailing.domain.common.racelog, com.sap.sailing.domain.common.racelog.tracking, com.sap.sailing.domain.common.racelog.utils, - com.sap.sailing.domain.common.scalablevalue, com.sap.sailing.domain.common.scalablevalue.impl, - com.sap.sailing.domain.common.trackfiles, - com.sap.sailing.domain.common.abstractlog + com.sap.sailing.domain.common.trackfiles Require-Bundle: com.sap.sse.datamining.shared, com.sap.sse.common diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/ColorMap.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/ColorMap.java index 0d3099e045b..5311091434f 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/ColorMap.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/ColorMap.java @@ -1,5 +1,7 @@ package com.sap.sailing.domain.common; +import com.sap.sse.common.Color; + /** * Manages color assignments to objects. * diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/FleetColors.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/FleetColors.java index e0901764e7d..5388a820a86 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/FleetColors.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/FleetColors.java @@ -1,6 +1,7 @@ package com.sap.sailing.domain.common; -import com.sap.sailing.domain.common.impl.RGBColor; +import com.sap.sse.common.Color; +import com.sap.sse.common.impl.RGBColor; public enum FleetColors { GOLD (222, 138, 46, 1), diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/confidence/BearingWithConfidenceCluster.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/confidence/BearingWithConfidenceCluster.java index 13408c857bf..2f4a7b879e7 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/confidence/BearingWithConfidenceCluster.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/confidence/BearingWithConfidenceCluster.java @@ -51,7 +51,7 @@ public class BearingWithConfidenceCluster { * remains empty. * @return two bearing clusters; both empty if this cluster is empty; only the second one empty if this cluster * contains only one bearing. Otherwise, the two bearings farthest apart (greatest absolute - * {@link Bearing#getDifferenceTo(Bearing) difference}) are guaranteed not to be in different clusters, and + * {@link Bearing#getDifferenceTo(Bearing) difference}) are guaranteed to be in different clusters, and * all other bearings contained in this cluster will be contained in the cluster that contains the extreme * bearing to which it's closer. */ diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/confidence/HasConfidence.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/confidence/HasConfidence.java index 88c67b29aa3..63da86f53e3 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/confidence/HasConfidence.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/confidence/HasConfidence.java @@ -3,8 +3,8 @@ package com.sap.sailing.domain.common.confidence; import java.io.Serializable; import com.sap.sailing.domain.common.Distance; -import com.sap.sailing.domain.common.scalablevalue.ScalableValue; import com.sap.sse.common.TimePoint; +import com.sap.sse.common.scalablevalue.ScalableValue; /** * Some values, particularly those obtained from real-world measurements, are not always accurate. Some values are diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/confidence/HasConfidenceAndIsScalable.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/confidence/HasConfidenceAndIsScalable.java index 4600d8b9478..71f940ebbed 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/confidence/HasConfidenceAndIsScalable.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/confidence/HasConfidenceAndIsScalable.java @@ -1,6 +1,6 @@ package com.sap.sailing.domain.common.confidence; -import com.sap.sailing.domain.common.scalablevalue.IsScalable; +import com.sap.sse.common.scalablevalue.IsScalable; public interface HasConfidenceAndIsScalable extends IsScalable, HasConfidence { diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/confidence/impl/BearingWithConfidenceImpl.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/confidence/impl/BearingWithConfidenceImpl.java index b477f602fe8..4a15632a2fa 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/confidence/impl/BearingWithConfidenceImpl.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/confidence/impl/BearingWithConfidenceImpl.java @@ -3,9 +3,9 @@ package com.sap.sailing.domain.common.confidence.impl; import com.sap.sailing.domain.common.Bearing; import com.sap.sailing.domain.common.DoublePair; import com.sap.sailing.domain.common.confidence.BearingWithConfidence; -import com.sap.sailing.domain.common.scalablevalue.IsScalable; -import com.sap.sailing.domain.common.scalablevalue.ScalableValue; import com.sap.sailing.domain.common.scalablevalue.impl.ScalableBearing; +import com.sap.sse.common.scalablevalue.IsScalable; +import com.sap.sse.common.scalablevalue.ScalableValue; public class BearingWithConfidenceImpl extends HasConfidenceImpl implements BearingWithConfidence, IsScalable { diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/confidence/impl/ConfidenceBasedAveragerImpl.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/confidence/impl/ConfidenceBasedAveragerImpl.java index a146589ec23..351e8aa9d41 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/confidence/impl/ConfidenceBasedAveragerImpl.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/confidence/impl/ConfidenceBasedAveragerImpl.java @@ -4,8 +4,8 @@ import com.sap.sailing.domain.common.confidence.ConfidenceBasedAverager; import com.sap.sailing.domain.common.confidence.HasConfidence; import com.sap.sailing.domain.common.confidence.HasConfidenceAndIsScalable; import com.sap.sailing.domain.common.confidence.Weigher; -import com.sap.sailing.domain.common.scalablevalue.ScalableValue; import com.sap.sse.common.Util; +import com.sap.sse.common.scalablevalue.ScalableValue; /** diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/confidence/impl/ScalableDouble.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/confidence/impl/ScalableDouble.java index 55738c06946..e371ee3dcdf 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/confidence/impl/ScalableDouble.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/confidence/impl/ScalableDouble.java @@ -1,7 +1,7 @@ package com.sap.sailing.domain.common.confidence.impl; -import com.sap.sailing.domain.common.scalablevalue.AbstractScalarValue; -import com.sap.sailing.domain.common.scalablevalue.ScalableValue; +import com.sap.sse.common.scalablevalue.AbstractScalarValue; +import com.sap.sse.common.scalablevalue.ScalableValue; public class ScalableDouble implements AbstractScalarValue { private final double value; @@ -11,7 +11,7 @@ public class ScalableDouble implements AbstractScalarValue { } @Override - public ScalableValue multiply(double factor) { + public ScalableDouble multiply(double factor) { return new ScalableDouble(factor*getValue()); } @@ -30,4 +30,18 @@ public class ScalableDouble implements AbstractScalarValue { return value; } + @Override + public double getDistance(Double other) { + return Math.abs(value-other); + } + + @Override + public String toString() { + return new Double(value).toString(); + } + + @Override + public int compareTo(Double o) { + return new Double(value).compareTo(o); + } } diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/CompetitorDTO.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/CompetitorDTO.java index ef37a641a81..7691619ac39 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/CompetitorDTO.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/CompetitorDTO.java @@ -2,8 +2,8 @@ package com.sap.sailing.domain.common.dto; import java.io.Serializable; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.racelog.tracking.MappableToDevice; +import com.sap.sse.common.Color; public interface CompetitorDTO extends Serializable, MappableToDevice { diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/CompetitorDTOImpl.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/CompetitorDTOImpl.java index 93bece9fbff..96d77c6614a 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/CompetitorDTOImpl.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/CompetitorDTOImpl.java @@ -2,7 +2,7 @@ package com.sap.sailing.domain.common.dto; import java.io.Serializable; -import com.sap.sailing.domain.common.Color; +import com.sap.sse.common.Color; /** * Equality and hash code are based on the {@link #getIdAsString() ID}, the {@link #getSailID() sail number}, the diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/FleetDTO.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/FleetDTO.java index ec6215dea08..1a0553be14b 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/FleetDTO.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/FleetDTO.java @@ -1,6 +1,6 @@ package com.sap.sailing.domain.common.dto; -import com.sap.sailing.domain.common.Color; +import com.sap.sse.common.Color; public class FleetDTO extends NamedDTO { private static final long serialVersionUID = 1336494392278190103L; diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/IncrementalLeaderboardDTO.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/IncrementalLeaderboardDTO.java index 0badc8d88e9..4a98fa6d73e 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/IncrementalLeaderboardDTO.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/IncrementalLeaderboardDTO.java @@ -11,7 +11,7 @@ import java.util.List; import java.util.Map; import java.util.Set; -import com.sap.sailing.domain.common.Cloner; +import com.sap.sse.common.Cloner; import com.sap.sse.common.Util; /** diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/PreviousCompetitorDTOImpl.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/PreviousCompetitorDTOImpl.java index 7921749a8f6..0cee29c1a92 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/PreviousCompetitorDTOImpl.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/PreviousCompetitorDTOImpl.java @@ -1,6 +1,6 @@ package com.sap.sailing.domain.common.dto; -import com.sap.sailing.domain.common.Color; +import com.sap.sse.common.Color; /** * Equality and hash code are based on the index pointing into a previous leaderboard's competitors list. diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/ColorMapImpl.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/ColorMapImpl.java index e64431c5488..a79387a97b5 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/ColorMapImpl.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/ColorMapImpl.java @@ -4,9 +4,10 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.ColorMap; +import com.sap.sse.common.Color; import com.sap.sse.common.Util; +import com.sap.sse.common.impl.HSVColor; /** diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/PlacemarkImpl.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/PlacemarkImpl.java index 214d6a61792..b2f4a99784a 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/PlacemarkImpl.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/PlacemarkImpl.java @@ -1,10 +1,10 @@ package com.sap.sailing.domain.common.impl; -import com.sap.sailing.domain.common.CountryCodeFactory; import com.sap.sailing.domain.common.Distance; import com.sap.sailing.domain.common.Placemark; import com.sap.sailing.domain.common.Position; import com.sap.sailing.domain.common.SerializablePosition; +import com.sap.sse.common.CountryCodeFactory; /** * Used to define a populated place in the world.
diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/tracking/MappableToDevice.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/tracking/MappableToDevice.java index e845385d60f..cbccd4880d4 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/tracking/MappableToDevice.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/tracking/MappableToDevice.java @@ -1,5 +1,7 @@ package com.sap.sailing.domain.common.racelog.tracking; +import java.io.Serializable; + /** * Marker interface that can be applied to DTOs that represent domain objects * that can be mapped to a device for racelog-tracking (see {@link DeviceMapping}. diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/scalablevalue/impl/ScalableBearing.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/scalablevalue/impl/ScalableBearing.java index bc9985de895..f833e1ab59b 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/scalablevalue/impl/ScalableBearing.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/scalablevalue/impl/ScalableBearing.java @@ -3,9 +3,10 @@ package com.sap.sailing.domain.common.scalablevalue.impl; import com.sap.sailing.domain.common.Bearing; import com.sap.sailing.domain.common.DoublePair; import com.sap.sailing.domain.common.impl.RadianBearingImpl; -import com.sap.sailing.domain.common.scalablevalue.ScalableValue; +import com.sap.sse.common.scalablevalue.ScalableValue; +import com.sap.sse.common.scalablevalue.ScalableValueWithDistance; -public class ScalableBearing implements ScalableValue { +public class ScalableBearing implements ScalableValueWithDistance { private final double sin; private final double cos; @@ -20,13 +21,13 @@ public class ScalableBearing implements ScalableValue { } @Override - public ScalableValue multiply(double factor) { + public ScalableBearing multiply(double factor) { DoublePair pair = getValue(); return new ScalableBearing(factor*pair.getA(), factor*pair.getB()); } @Override - public ScalableValue add(ScalableValue t) { + public ScalableBearing add(ScalableValue t) { DoublePair value = getValue(); DoublePair tValue = t.getValue(); return new ScalableBearing(value.getA()+tValue.getA(), value.getB()+tValue.getB()); @@ -57,4 +58,9 @@ public class ScalableBearing implements ScalableValue { public DoublePair getValue() { return new DoublePair(sin, cos); } + + @Override + public double getDistance(Bearing other) { + return Math.abs(divide(1).getDifferenceTo(other).getDegrees()); + } } diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/scalablevalue/impl/ScalablePosition.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/scalablevalue/impl/ScalablePosition.java index fe37ec0f32e..2d0ed6be94c 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/scalablevalue/impl/ScalablePosition.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/scalablevalue/impl/ScalablePosition.java @@ -2,9 +2,10 @@ package com.sap.sailing.domain.common.scalablevalue.impl; import com.sap.sailing.domain.common.Position; import com.sap.sailing.domain.common.impl.RadianPosition; -import com.sap.sailing.domain.common.scalablevalue.ScalableValue; +import com.sap.sse.common.scalablevalue.ScalableValue; +import com.sap.sse.common.scalablevalue.ScalableValueWithDistance; -public class ScalablePosition implements ScalableValue { +public class ScalablePosition implements ScalableValueWithDistance { private final double x, y, z; public ScalablePosition(Position position) { @@ -58,5 +59,9 @@ public class ScalablePosition implements ScalableValue { +public class ScalableSpeed implements ScalableValueWithDistance { private final double knots; public ScalableSpeed(Speed speed) { @@ -16,12 +17,12 @@ public class ScalableSpeed implements ScalableValue { } @Override - public ScalableValue multiply(double factor) { + public ScalableSpeed multiply(double factor) { return new ScalableSpeed(factor*knots); } @Override - public ScalableValue add(ScalableValue t) { + public ScalableSpeed add(ScalableValue t) { return new ScalableSpeed(knots+t.getValue()); } @@ -34,4 +35,10 @@ public class ScalableSpeed implements ScalableValue { public Double getValue() { return knots; } + + @Override + public double getDistance(Speed other) { + return Math.abs(knots-other.getKnots()); + } + } diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/scalablevalue/impl/ScalableSpeedWithBearing.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/scalablevalue/impl/ScalableSpeedWithBearing.java index 719d111965f..608a97d3893 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/scalablevalue/impl/ScalableSpeedWithBearing.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/scalablevalue/impl/ScalableSpeedWithBearing.java @@ -6,8 +6,8 @@ import com.sap.sailing.domain.common.SpeedWithBearing; import com.sap.sailing.domain.common.impl.KnotSpeedImpl; import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl; import com.sap.sailing.domain.common.impl.RadianBearingImpl; -import com.sap.sailing.domain.common.scalablevalue.ScalableValue; import com.sap.sse.common.Util; +import com.sap.sse.common.scalablevalue.ScalableValue; /** * Separately scales speed and bearing. Instead of considering speed and bearing a single vector that can be scaled, the diff --git a/java/com.sap.sailing.domain.igtimiadapter/src/com/sap/sailing/domain/igtimiadapter/shared/IgtimiWindReceiver.java b/java/com.sap.sailing.domain.igtimiadapter/src/com/sap/sailing/domain/igtimiadapter/shared/IgtimiWindReceiver.java index 30da1b03e9d..0152708cee3 100755 --- a/java/com.sap.sailing.domain.igtimiadapter/src/com/sap/sailing/domain/igtimiadapter/shared/IgtimiWindReceiver.java +++ b/java/com.sap.sailing.domain.igtimiadapter/src/com/sap/sailing/domain/igtimiadapter/shared/IgtimiWindReceiver.java @@ -18,7 +18,6 @@ import com.sap.sailing.domain.common.Position; import com.sap.sailing.domain.common.Speed; import com.sap.sailing.domain.common.SpeedWithBearing; import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl; -import com.sap.sailing.domain.common.scalablevalue.ScalableValue; import com.sap.sailing.domain.common.scalablevalue.impl.ScalableBearing; import com.sap.sailing.domain.common.scalablevalue.impl.ScalablePosition; import com.sap.sailing.domain.common.scalablevalue.impl.ScalableSpeed; @@ -44,6 +43,7 @@ import com.sap.sailing.domain.tracking.impl.DynamicTrackImpl; import com.sap.sailing.domain.tracking.impl.WindImpl; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; +import com.sap.sse.common.scalablevalue.ScalableValue; /** * Receives Igtimi {@link Fix}es and tries to generate a {@link Wind} object from each {@link AWS} fix. For this to diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java index 84fb3881dfc..608d95eb2b5 100755 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java @@ -104,7 +104,6 @@ import com.sap.sailing.domain.base.impl.RemoteSailingServerReferenceImpl; import com.sap.sailing.domain.base.impl.SeriesImpl; import com.sap.sailing.domain.base.impl.VenueImpl; import com.sap.sailing.domain.base.impl.WaypointImpl; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.MarkType; import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.PassingInstruction; @@ -120,7 +119,6 @@ import com.sap.sailing.domain.common.configuration.DeviceConfigurationMatcherTyp import com.sap.sailing.domain.common.impl.DegreeBearingImpl; import com.sap.sailing.domain.common.impl.DegreePosition; import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl; -import com.sap.sailing.domain.common.impl.RGBColor; import com.sap.sailing.domain.common.impl.WindSourceImpl; import com.sap.sailing.domain.common.impl.WindSourceWithAdditionalID; import com.sap.sailing.domain.common.racelog.Flags; @@ -170,10 +168,12 @@ import com.sap.sailing.server.gateway.deserialization.impl.CompetitorJsonDeseria import com.sap.sailing.server.gateway.deserialization.impl.DeviceConfigurationJsonDeserializer; import com.sap.sailing.server.gateway.deserialization.impl.Helpers; import com.sap.sailing.server.gateway.deserialization.impl.RegattaConfigurationJsonDeserializer; +import com.sap.sse.common.Color; import com.sap.sse.common.TimePoint; import com.sap.sse.common.TimeRange; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; +import com.sap.sse.common.impl.RGBColor; import com.sap.sse.common.impl.TimeRangeImpl; public class DomainObjectFactoryImpl implements DomainObjectFactory { diff --git a/java/com.sap.sailing.domain.shared.android.test/META-INF/MANIFEST.MF b/java/com.sap.sailing.domain.shared.android.test/META-INF/MANIFEST.MF index ed9dc4586e3..3a9de8a9222 100644 --- a/java/com.sap.sailing.domain.shared.android.test/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.domain.shared.android.test/META-INF/MANIFEST.MF @@ -14,4 +14,5 @@ Require-Bundle: com.sap.sailing.domain.common;bundle-version="1.0.0", com.sap.sailing.domain.test, com.sap.sailing.domain.racelogtrackingadapter.testsupport;bundle-version="1.0.0", com.sap.sse.common, - com.sap.sse + com.sap.sse, + com.sap.sse.shared.android diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/util/test/ConcurrentHashBagTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/util/test/ConcurrentHashBagTest.java index 17fb9a83574..a9bc3067ab3 100755 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/util/test/ConcurrentHashBagTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/util/test/ConcurrentHashBagTest.java @@ -11,7 +11,7 @@ import java.util.Random; import org.junit.Before; import org.junit.Test; -import com.sap.sailing.util.impl.ConcurrentHashBag; +import com.sap.sse.concurrent.ConcurrentHashBag; /** * Initiated by bug 2502 (http://bugzilla.sapsailing.com/bugzilla/show_bug.cgi?id=2502), this test tries to reproduce a diff --git a/java/com.sap.sailing.domain.shared.android/.classpath b/java/com.sap.sailing.domain.shared.android/.classpath index 8a8f1668cdc..c8351b0a6bd 100644 --- a/java/com.sap.sailing.domain.shared.android/.classpath +++ b/java/com.sap.sailing.domain.shared.android/.classpath @@ -1,7 +1,7 @@ - + diff --git a/java/com.sap.sailing.domain.shared.android/.settings/org.eclipse.jdt.core.prefs b/java/com.sap.sailing.domain.shared.android/.settings/org.eclipse.jdt.core.prefs index f287d53cf45..980b98c1d5f 100644 --- a/java/com.sap.sailing.domain.shared.android/.settings/org.eclipse.jdt.core.prefs +++ b/java/com.sap.sailing.domain.shared.android/.settings/org.eclipse.jdt.core.prefs @@ -1,7 +1,12 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/java/com.sap.sailing.domain.shared.android/META-INF/MANIFEST.MF b/java/com.sap.sailing.domain.shared.android/META-INF/MANIFEST.MF index 79becdfb95c..faa0eb1a9b0 100644 --- a/java/com.sap.sailing.domain.shared.android/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.domain.shared.android/META-INF/MANIFEST.MF @@ -4,11 +4,11 @@ Bundle-Name: com.sap.sailing.domain.shared.android Bundle-SymbolicName: com.sap.sailing.domain.shared.android Bundle-Version: 1.0.0.qualifier Bundle-Vendor: SAP -Bundle-RequiredExecutionEnvironment: JavaSE-1.6 -Require-Bundle: com.sap.sailing.domain.common;bundle-version="1.0.0", - com.sap.sse.datamining.shared;bundle-version="1.0.0", +Bundle-RequiredExecutionEnvironment: JavaSE-1.7 +Require-Bundle: com.sap.sailing.domain.common, + com.sap.sse.datamining.shared, com.sap.sse.common, - com.sap.sse + com.sap.sse.shared.android Export-Package: com.sap.sailing.domain.abstractlog, com.sap.sailing.domain.abstractlog.impl, com.sap.sailing.domain.abstractlog.race, @@ -47,5 +47,4 @@ Export-Package: com.sap.sailing.domain.abstractlog, com.sap.sailing.domain.racelogtracking, com.sap.sailing.domain.racelogtracking.impl, com.sap.sailing.domain.tracking, - com.sap.sailing.domain.tracking.impl, - com.sap.sailing.util.impl + com.sap.sailing.domain.tracking.impl diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogImpl.java index 4e5685c971f..d0817856cd5 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogImpl.java @@ -28,7 +28,7 @@ import com.sap.sailing.domain.common.abstractlog.NotRevokableException; import com.sap.sailing.domain.tracking.Track; import com.sap.sailing.domain.tracking.impl.PartialNavigableSetView; import com.sap.sailing.domain.tracking.impl.TrackImpl; -import com.sap.sailing.util.impl.ArrayListNavigableSet; +import com.sap.sse.common.ArrayListNavigableSet; /** * {@link Track} implementation for {@link AbstractLogEvent}s. diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AllEventsOfTypeFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AllEventsOfTypeFinder.java index f704293daa2..02f11683e67 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AllEventsOfTypeFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AllEventsOfTypeFinder.java @@ -4,8 +4,8 @@ import java.util.ArrayList; import java.util.List; import com.sap.sailing.domain.abstractlog.AbstractLog; -import com.sap.sailing.domain.abstractlog.BaseLogAnalyzer; import com.sap.sailing.domain.abstractlog.AbstractLogEvent; +import com.sap.sailing.domain.abstractlog.BaseLogAnalyzer; /** * Finds all events in the log which is an {@code instanceof} {@link #ofType}. diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/LastEventOfTypeFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/LastEventOfTypeFinder.java index f44a3a64235..92152af85f9 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/LastEventOfTypeFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/LastEventOfTypeFinder.java @@ -1,8 +1,8 @@ package com.sap.sailing.domain.abstractlog.impl; import com.sap.sailing.domain.abstractlog.AbstractLog; -import com.sap.sailing.domain.abstractlog.BaseLogAnalyzer; import com.sap.sailing.domain.abstractlog.AbstractLogEvent; +import com.sap.sailing.domain.abstractlog.BaseLogAnalyzer; /** * Finds the most recent event in the log which is an {@code instanceof} {@link #ofType}. diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/AdditionalScoringInformationFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/AdditionalScoringInformationFinder.java index d93be127975..690bf160ce6 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/AdditionalScoringInformationFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/AdditionalScoringInformationFinder.java @@ -5,8 +5,8 @@ import java.util.List; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.abstractlog.race.scoring.RaceLogAdditionalScoringInformationEvent; import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationType; +import com.sap.sailing.domain.abstractlog.race.scoring.RaceLogAdditionalScoringInformationEvent; /** * Returns all {@link RaceLogAdditionalScoringInformationEvent}s from the race log diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceStatusAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceStatusAnalyzer.java index d43cba46956..6bf9ba8f3c5 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceStatusAnalyzer.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceStatusAnalyzer.java @@ -8,7 +8,7 @@ import com.sap.sailing.domain.abstractlog.race.impl.BaseRaceLogEventVisitor; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogRaceStatusEventComparator; import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ReadonlyRacingProcedure; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; -import com.sap.sailing.util.impl.ArrayListNavigableSet; +import com.sap.sse.common.ArrayListNavigableSet; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/scoring/impl/RaceLogAdditionalScoringInformationEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/scoring/impl/RaceLogAdditionalScoringInformationEventImpl.java index ba25a697404..f6c54428bc5 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/scoring/impl/RaceLogAdditionalScoringInformationEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/scoring/impl/RaceLogAdditionalScoringInformationEventImpl.java @@ -6,8 +6,8 @@ import java.util.List; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventImpl; -import com.sap.sailing.domain.abstractlog.race.scoring.RaceLogAdditionalScoringInformationEvent; import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationType; +import com.sap.sailing.domain.abstractlog.race.scoring.RaceLogAdditionalScoringInformationEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sse.common.TimePoint; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/RaceState.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/RaceState.java index a0d5f94fb90..ad7b747d640 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/RaceState.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/RaceState.java @@ -4,8 +4,8 @@ import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.race.CompetitorResults; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.abstractlog.race.scoring.RaceLogAdditionalScoringInformationEvent; import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationType; +import com.sap.sailing.domain.abstractlog.race.scoring.RaceLogAdditionalScoringInformationEvent; import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedure; import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedurePrerequisite; import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.RacingProcedurePrerequisiteAutoResolver; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateImpl.java index 5ce66d5c9ce..6b00418fb04 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateImpl.java @@ -10,8 +10,8 @@ import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogEventFactory; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.AdditionalScoringInformationFinder; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceStatusAnalyzer; -import com.sap.sailing.domain.abstractlog.race.scoring.RaceLogAdditionalScoringInformationEvent; import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationType; +import com.sap.sailing.domain.abstractlog.race.scoring.RaceLogAdditionalScoringInformationEvent; import com.sap.sailing.domain.abstractlog.race.state.RaceState; import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedure; import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedureFactory; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/ReadonlyRaceStateImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/ReadonlyRaceStateImpl.java index 02d552065ff..015ea9c72e0 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/ReadonlyRaceStateImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/ReadonlyRaceStateImpl.java @@ -12,9 +12,9 @@ import com.sap.sailing.domain.abstractlog.race.analyzing.impl.LastPublishedCours import com.sap.sailing.domain.abstractlog.race.analyzing.impl.LastWindFixFinder; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.ProtestStartTimeFinder; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceStatusAnalyzer; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceStatusAnalyzer.Clock; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RacingProcedureTypeAnalyzer; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.StartTimeFinder; -import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceStatusAnalyzer.Clock; import com.sap.sailing.domain.abstractlog.race.impl.WeakRaceLogChangedVisitor; import com.sap.sailing.domain.abstractlog.race.state.RaceStateChangedListener; import com.sap.sailing.domain.abstractlog.race.state.RaceStateEvent; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/RegattaLogEventVisitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/RegattaLogEventVisitor.java index 29e64aab4bc..2f84d4f575f 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/RegattaLogEventVisitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/RegattaLogEventVisitor.java @@ -1,10 +1,10 @@ package com.sap.sailing.domain.abstractlog.regatta; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogCloseOpenEndedDeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceCompetitorMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogRevokeEvent; -import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceCompetitorMappingEvent; public interface RegattaLogEventVisitor { void visit(RegattaLogRevokeEvent event); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/impl/RegattaLogImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/impl/RegattaLogImpl.java index f7657424fc1..a806dff41c4 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/impl/RegattaLogImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/impl/RegattaLogImpl.java @@ -3,8 +3,8 @@ package com.sap.sailing.domain.abstractlog.regatta.impl; import java.io.Serializable; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; -import com.sap.sailing.domain.abstractlog.impl.LogEventComparator; import com.sap.sailing.domain.abstractlog.impl.AbstractLogImpl; +import com.sap.sailing.domain.abstractlog.impl.LogEventComparator; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/LastPingMappingEventFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/LastPingMappingEventFinder.java index c69590cca1d..045dbbab2a8 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/LastPingMappingEventFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/LastPingMappingEventFinder.java @@ -1,8 +1,8 @@ package com.sap.sailing.domain.abstractlog.shared.analyzing; import com.sap.sailing.domain.abstractlog.AbstractLog; -import com.sap.sailing.domain.abstractlog.BaseLogAnalyzer; import com.sap.sailing.domain.abstractlog.AbstractLogEvent; +import com.sap.sailing.domain.abstractlog.BaseLogAnalyzer; import com.sap.sailing.domain.abstractlog.shared.events.DeviceMappingEvent; import com.sap.sse.common.WithID; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/OpenEndedDeviceMappingCloser.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/OpenEndedDeviceMappingCloser.java index 0a688c415af..df6d098f905 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/OpenEndedDeviceMappingCloser.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/OpenEndedDeviceMappingCloser.java @@ -5,9 +5,9 @@ import java.util.ArrayList; import java.util.List; import com.sap.sailing.domain.abstractlog.AbstractLog; -import com.sap.sailing.domain.abstractlog.BaseLogAnalyzer; import com.sap.sailing.domain.abstractlog.AbstractLogEvent; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.BaseLogAnalyzer; import com.sap.sailing.domain.abstractlog.shared.events.CloseOpenEndedDeviceMappingEvent; import com.sap.sailing.domain.abstractlog.shared.events.DeviceMappingEvent; import com.sap.sailing.domain.racelogtracking.DeviceMapping; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Competitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Competitor.java index 011f3ccc54a..fea24c2afea 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Competitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Competitor.java @@ -1,10 +1,10 @@ package com.sap.sailing.domain.base; -import com.sap.sailing.domain.common.Color; -import com.sap.sse.datamining.shared.annotations.Connector; +import com.sap.sse.common.Color; import com.sap.sse.common.IsManagedByCache; import com.sap.sse.common.Named; import com.sap.sse.common.WithID; +import com.sap.sse.datamining.shared.annotations.Connector; public interface Competitor extends Named, WithID, IsManagedByCache { @Connector(messageKey="Team", ordinal=9) diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/CompetitorChangeListener.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/CompetitorChangeListener.java index f5a0b722976..35347c8e881 100755 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/CompetitorChangeListener.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/CompetitorChangeListener.java @@ -1,6 +1,6 @@ package com.sap.sailing.domain.base; -import com.sap.sailing.domain.common.Color; +import com.sap.sse.common.Color; public interface CompetitorChangeListener extends BoatChangeListener, NationalityChangeListener { void colorChanged(Color oldColor, Color newColor); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/CompetitorFactory.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/CompetitorFactory.java index 167bc2080ff..a7cc5c0da8a 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/CompetitorFactory.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/CompetitorFactory.java @@ -4,7 +4,7 @@ import java.io.Serializable; import com.sap.sailing.domain.base.impl.DynamicBoat; import com.sap.sailing.domain.base.impl.DynamicTeam; -import com.sap.sailing.domain.common.Color; +import com.sap.sse.common.Color; /** * Base interface for classes managing a set of {@link Competitor} objects. diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/CompetitorStore.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/CompetitorStore.java index 112c1531213..d66e76f9900 100755 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/CompetitorStore.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/CompetitorStore.java @@ -4,8 +4,8 @@ import java.io.Serializable; import com.sap.sailing.domain.base.impl.DynamicBoat; import com.sap.sailing.domain.base.impl.DynamicTeam; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.dto.CompetitorDTO; +import com.sap.sse.common.Color; /** * Manages a set of {@link Competitor} objects. There may be a transient implementation based on a simple cache, diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/CourseBase.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/CourseBase.java index 4ba324f79ed..0473f1cb1c4 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/CourseBase.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/CourseBase.java @@ -37,6 +37,9 @@ public interface CourseBase extends Named { Waypoint getFirstWaypoint(); + /** + * @return the course's last waypoint if not empty, null otherwise. Acquires the course's read lock. + */ Waypoint getLastWaypoint(); void addWaypoint(int zeroBasedPosition, Waypoint waypointToAdd); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Fleet.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Fleet.java index 0c2a2688718..f741bd372b6 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Fleet.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Fleet.java @@ -1,6 +1,6 @@ package com.sap.sailing.domain.base; -import com.sap.sailing.domain.common.Color; +import com.sap.sse.common.Color; import com.sap.sse.common.Named; /** diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Nationality.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Nationality.java index 6a678420548..2f44763054e 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Nationality.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Nationality.java @@ -1,6 +1,6 @@ package com.sap.sailing.domain.base; -import com.sap.sailing.domain.common.CountryCode; +import com.sap.sse.common.CountryCode; import com.sap.sse.common.IsManagedByCache; import com.sap.sse.common.Named; import com.sap.sse.datamining.shared.annotations.Dimension; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/CompetitorImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/CompetitorImpl.java index bbe4932d708..031a50935a1 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/CompetitorImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/CompetitorImpl.java @@ -9,7 +9,7 @@ import java.util.Set; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CompetitorChangeListener; import com.sap.sailing.domain.base.SharedDomainFactory; -import com.sap.sailing.domain.common.Color; +import com.sap.sse.common.Color; import com.sap.sse.common.Util; public class CompetitorImpl implements DynamicCompetitor { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/DynamicCompetitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/DynamicCompetitor.java index c65006c886c..768c6f15255 100755 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/DynamicCompetitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/DynamicCompetitor.java @@ -1,8 +1,8 @@ package com.sap.sailing.domain.base.impl; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.Renamable; +import com.sap.sse.common.Color; public interface DynamicCompetitor extends Competitor, Renamable { DynamicBoat getBoat(); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/FleetImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/FleetImpl.java index 6c1158b2150..dea6c6b2a13 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/FleetImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/FleetImpl.java @@ -1,7 +1,7 @@ package com.sap.sailing.domain.base.impl; import com.sap.sailing.domain.base.Fleet; -import com.sap.sailing.domain.common.Color; +import com.sap.sse.common.Color; import com.sap.sse.common.impl.NamedImpl; /** diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/NationalityImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/NationalityImpl.java index 0c4f53c6169..c7347bbf9c9 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/NationalityImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/NationalityImpl.java @@ -2,8 +2,8 @@ package com.sap.sailing.domain.base.impl; import com.sap.sailing.domain.base.Nationality; import com.sap.sailing.domain.base.SharedDomainFactory; -import com.sap.sailing.domain.common.CountryCode; -import com.sap.sailing.domain.common.CountryCodeFactory; +import com.sap.sse.common.CountryCode; +import com.sap.sse.common.CountryCodeFactory; import com.sap.sse.common.IsManagedByCache; public class NationalityImpl implements Nationality { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/SharedDomainFactoryImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/SharedDomainFactoryImpl.java index de7ca3db024..0d6a8cd5f42 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/SharedDomainFactoryImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/SharedDomainFactoryImpl.java @@ -29,10 +29,10 @@ import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcherMulti; import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcherSingle; import com.sap.sailing.domain.common.BoatClassMasterdata; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.MarkType; import com.sap.sailing.domain.common.PassingInstruction; import com.sap.sailing.domain.common.configuration.DeviceConfigurationMatcherType; +import com.sap.sse.common.Color; import com.sap.sse.common.WithID; public class SharedDomainFactoryImpl implements SharedDomainFactory { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TransientCompetitorStoreImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TransientCompetitorStoreImpl.java index 696f2cc526b..9a9417bd74a 100755 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TransientCompetitorStoreImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TransientCompetitorStoreImpl.java @@ -16,13 +16,13 @@ import java.util.logging.Logger; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CompetitorStore; import com.sap.sailing.domain.base.Nationality; -import com.sap.sailing.domain.common.Color; -import com.sap.sailing.domain.common.CountryCode; import com.sap.sailing.domain.common.dto.BoatClassDTO; import com.sap.sailing.domain.common.dto.CompetitorDTO; import com.sap.sailing.domain.common.dto.CompetitorDTOImpl; -import com.sap.sailing.util.impl.LockUtil; -import com.sap.sailing.util.impl.NamedReentrantReadWriteLock; +import com.sap.sse.common.Color; +import com.sap.sse.common.CountryCode; +import com.sap.sse.concurrent.LockUtil; +import com.sap.sse.concurrent.NamedReentrantReadWriteLock; public class TransientCompetitorStoreImpl implements CompetitorStore, Serializable { private static final Logger logger = Logger.getLogger(TransientCompetitorStoreImpl.class.getName()); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/VenueImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/VenueImpl.java index d33ee69e283..23eb010a8c1 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/VenueImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/VenueImpl.java @@ -8,8 +8,8 @@ import java.util.List; import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.Venue; -import com.sap.sailing.util.impl.LockUtil; -import com.sap.sailing.util.impl.NamedReentrantReadWriteLock; +import com.sap.sse.concurrent.LockUtil; +import com.sap.sse.concurrent.NamedReentrantReadWriteLock; public class VenueImpl implements Venue { private static final long serialVersionUID = 6854152040737643290L; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/tracking/impl/TrackImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/tracking/impl/TrackImpl.java index 6fc368cdcdc..27b7813f2c4 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/tracking/impl/TrackImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/tracking/impl/TrackImpl.java @@ -8,12 +8,12 @@ import java.util.NavigableSet; import com.sap.sailing.domain.base.Timed; import com.sap.sailing.domain.tracking.Track; -import com.sap.sailing.util.impl.ArrayListNavigableSet; -import com.sap.sailing.util.impl.LockUtil; -import com.sap.sailing.util.impl.NamedReentrantReadWriteLock; -import com.sap.sailing.util.impl.UnmodifiableNavigableSet; +import com.sap.sse.common.ArrayListNavigableSet; import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; +import com.sap.sse.concurrent.LockUtil; +import com.sap.sse.concurrent.NamedReentrantReadWriteLock; +import com.sap.sse.util.impl.UnmodifiableNavigableSet; public class TrackImpl implements Track { private static final long serialVersionUID = -4075853657857657528L; diff --git a/java/com.sap.sailing.domain.swisstimingreplayadapter/src/com/sap/sailing/domain/swisstimingreplayadapter/impl/SwissTimingReplayServiceImpl.java b/java/com.sap.sailing.domain.swisstimingreplayadapter/src/com/sap/sailing/domain/swisstimingreplayadapter/impl/SwissTimingReplayServiceImpl.java index e24a8f7bc64..e375689fbfc 100644 --- a/java/com.sap.sailing.domain.swisstimingreplayadapter/src/com/sap/sailing/domain/swisstimingreplayadapter/impl/SwissTimingReplayServiceImpl.java +++ b/java/com.sap.sailing.domain.swisstimingreplayadapter/src/com/sap/sailing/domain/swisstimingreplayadapter/impl/SwissTimingReplayServiceImpl.java @@ -24,7 +24,7 @@ import com.sap.sailing.domain.swisstimingreplayadapter.SwissTimingReplayListener import com.sap.sailing.domain.swisstimingreplayadapter.SwissTimingReplayRace; import com.sap.sailing.domain.swisstimingreplayadapter.SwissTimingReplayService; import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; -import com.sap.sailing.util.ByteArrayOutputStreamWithVisibleBuffer; +import com.sap.sse.util.ByteArrayOutputStreamWithVisibleBuffer; public class SwissTimingReplayServiceImpl implements SwissTimingReplayService { diff --git a/java/com.sap.sailing.domain.test/META-INF/MANIFEST.MF b/java/com.sap.sailing.domain.test/META-INF/MANIFEST.MF index da19bd697d2..321c675e4bb 100644 --- a/java/com.sap.sailing.domain.test/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.domain.test/META-INF/MANIFEST.MF @@ -19,6 +19,7 @@ Require-Bundle: com.sap.sailing.domain, org.json.simple;bundle-version="1.1.0", com.sap.sse.common, com.sap.sse.replication, - com.sap.sse + com.sap.sse, + com.sap.sse.shared.android Export-Package: com.sap.sailing.domain.test, com.sap.sailing.domain.test.mock diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/MediaTrackTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/MediaTrackTest.java index 98de1864113..6d92b840f17 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/MediaTrackTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/MediaTrackTest.java @@ -1,5 +1,8 @@ package com.sap.sailing.domain.common; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + import org.junit.Test; import com.sap.sailing.domain.common.media.MediaTrack; @@ -8,8 +11,6 @@ import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsDurationImpl; import com.sap.sse.common.impl.MillisecondsTimePoint; -import static org.junit.Assert.*; - public class MediaTrackTest { private static final Duration ONE_MILLISECOND = new MillisecondsDurationImpl(1); diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/MediaUtilTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/MediaUtilTest.java index 0d2d862830e..2f502e07a31 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/MediaUtilTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/MediaUtilTest.java @@ -1,13 +1,14 @@ package com.sap.sailing.domain.common; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + import org.junit.Test; import com.sap.sailing.domain.common.media.MediaUtil; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; -import static org.junit.Assert.*; - public class MediaUtilTest { @Test diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/test/DurationTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/test/DurationTest.java index 38fd69cddcf..5994a51a7c4 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/test/DurationTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/test/DurationTest.java @@ -1,7 +1,10 @@ package com.sap.sailing.domain.common.test; -import static org.junit.Assert.*; -import static org.hamcrest.Matchers.*; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; import org.junit.Test; diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/test/LeaderboardDTODiffingTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/test/LeaderboardDTODiffingTest.java index ad54fe6ec89..dd915231da5 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/test/LeaderboardDTODiffingTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/test/LeaderboardDTODiffingTest.java @@ -23,8 +23,6 @@ import java.util.Set; import org.junit.Before; import org.junit.Test; -import com.sap.sailing.domain.common.Cloner; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.dto.BoatClassDTO; import com.sap.sailing.domain.common.dto.CompetitorDTO; import com.sap.sailing.domain.common.dto.CompetitorDTOImpl; @@ -37,9 +35,11 @@ import com.sap.sailing.domain.common.dto.LegEntryDTO; import com.sap.sailing.domain.common.dto.RaceColumnDTO; import com.sap.sailing.domain.common.dto.RaceDTO; import com.sap.sailing.domain.test.StoredTrackBasedTest; -import com.sap.sailing.util.ClonerImpl; +import com.sap.sse.common.Cloner; +import com.sap.sse.common.Color; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; +import com.sap.sse.util.ClonerImpl; /** * Tests the compressing / de-compressing functionality of {@link LeaderboardDTO} and {@link IncrementalLeaderboardDTO}. diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/test/RGBColorTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/test/RGBColorTest.java index f8eba227000..8b5eed8bd0c 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/test/RGBColorTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/test/RGBColorTest.java @@ -4,7 +4,7 @@ import static org.junit.Assert.assertEquals; import org.junit.Test; -import com.sap.sailing.domain.common.impl.RGBColor; +import com.sap.sse.common.impl.RGBColor; public class RGBColorTest { /** diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/test/TimePointTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/test/TimePointTest.java index 6b5fe0ab91c..18393e5eedb 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/test/TimePointTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/test/TimePointTest.java @@ -1,13 +1,15 @@ package com.sap.sailing.domain.common.test; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + import org.junit.Test; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; -import static org.junit.Assert.*; -import static org.hamcrest.Matchers.*; - public class TimePointTest { @Test public void compare() { diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/AbstractLeaderboardTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/AbstractLeaderboardTest.java index b0a69940c42..9870f58ac90 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/AbstractLeaderboardTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/AbstractLeaderboardTest.java @@ -11,7 +11,7 @@ import com.sap.sailing.domain.base.impl.CompetitorImpl; import com.sap.sailing.domain.base.impl.NationalityImpl; import com.sap.sailing.domain.base.impl.PersonImpl; import com.sap.sailing.domain.base.impl.TeamImpl; -import com.sap.sailing.domain.common.Color; +import com.sap.sse.common.Color; public abstract class AbstractLeaderboardTest { public static CompetitorImpl createCompetitor(String competitorName) { diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/AbstractTracTracLiveTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/AbstractTracTracLiveTest.java index 2d55faa233c..901f7dd24a5 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/AbstractTracTracLiveTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/AbstractTracTracLiveTest.java @@ -112,8 +112,7 @@ public abstract class AbstractTracTracLiveTest extends StoredTrackBasedTest { e.printStackTrace(); } } - // TODO Start live and stored data subscribers - // test cases need to start the thread calling startController + // test cases need to start the thread calling addListenersForStoredDataAndStartController // after adding their listeners } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ArrayListNavigableSetTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ArrayListNavigableSetTest.java index 268eb1c8676..c9c0545dfc3 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ArrayListNavigableSetTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ArrayListNavigableSetTest.java @@ -11,7 +11,7 @@ import java.util.Set; import org.junit.Test; -import com.sap.sailing.util.impl.ArrayListNavigableSet; +import com.sap.sse.common.ArrayListNavigableSet; public class ArrayListNavigableSetTest { @Test diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CompetitorListenerTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CompetitorListenerTest.java index a719b7c4496..bdef38602ad 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CompetitorListenerTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CompetitorListenerTest.java @@ -18,8 +18,8 @@ import com.sap.sailing.domain.base.Team; import com.sap.sailing.domain.base.WithNationality; import com.sap.sailing.domain.base.impl.DomainFactoryImpl; import com.sap.sailing.domain.base.impl.DynamicCompetitor; -import com.sap.sailing.domain.common.Color; -import com.sap.sailing.domain.common.impl.RGBColor; +import com.sap.sse.common.Color; +import com.sap.sse.common.impl.RGBColor; /** * Tests the {@link CompetitorChangeListener} stuff including the serialization of the transitive listener diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ConcurrentCollectionsPerformanceTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ConcurrentCollectionsPerformanceTest.java index d3bc8e3d580..5794a18225e 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ConcurrentCollectionsPerformanceTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ConcurrentCollectionsPerformanceTest.java @@ -10,8 +10,8 @@ import java.util.concurrent.ConcurrentLinkedQueue; import org.junit.Test; -import com.sap.sailing.util.impl.ConcurrentHashBag; import com.sap.sse.common.Util; +import com.sap.sse.concurrent.ConcurrentHashBag; /** * Measures the performance of different concurrent collections types and shows their add and remove behavior for diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ConcurrentWeakHashMapTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ConcurrentWeakHashMapTest.java index b9f0cdb1937..89701dd1f2d 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ConcurrentWeakHashMapTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ConcurrentWeakHashMapTest.java @@ -10,7 +10,7 @@ import java.util.Set; import org.junit.Test; -import com.sap.sailing.util.impl.ConcurrentWeakHashMap; +import com.sap.sse.concurrent.ConcurrentWeakHashMap; /** * Tests the class {@link ConcurrentWeakHashMap}. diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ConfidenceTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ConfidenceTest.java index 8a569e74626..7c1e966affa 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ConfidenceTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ConfidenceTest.java @@ -15,10 +15,9 @@ import com.sap.sailing.domain.base.PositionWithConfidence; import com.sap.sailing.domain.base.impl.PositionWithConfidenceImpl; import com.sap.sailing.domain.common.Bearing; import com.sap.sailing.domain.common.Position; -import com.sap.sailing.domain.common.confidence.ConfidenceBasedAverager; -import com.sap.sailing.domain.confidence.ConfidenceFactory; import com.sap.sailing.domain.common.confidence.BearingWithConfidence; import com.sap.sailing.domain.common.confidence.BearingWithConfidenceCluster; +import com.sap.sailing.domain.common.confidence.ConfidenceBasedAverager; import com.sap.sailing.domain.common.confidence.HasConfidence; import com.sap.sailing.domain.common.confidence.HasConfidenceAndIsScalable; import com.sap.sailing.domain.common.confidence.Weigher; @@ -30,9 +29,9 @@ import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl; import com.sap.sailing.domain.common.impl.MeterDistance; import com.sap.sailing.domain.common.impl.NauticalMileDistance; import com.sap.sailing.domain.common.impl.RadianBearingImpl; -import com.sap.sailing.domain.common.scalablevalue.ScalableValue; import com.sap.sailing.domain.common.scalablevalue.impl.ScalablePosition; import com.sap.sailing.domain.confidence.ConfidenceBasedWindAverager; +import com.sap.sailing.domain.confidence.ConfidenceFactory; import com.sap.sailing.domain.tracking.Wind; import com.sap.sailing.domain.tracking.WindWithConfidence; import com.sap.sailing.domain.tracking.impl.ScalableWind; @@ -40,6 +39,7 @@ import com.sap.sailing.domain.tracking.impl.WindImpl; import com.sap.sailing.domain.tracking.impl.WindWithConfidenceImpl; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; +import com.sap.sse.common.scalablevalue.ScalableValue; public class ConfidenceTest { private static class ScalableBearing implements ScalableValue { diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CountryCodeTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CountryCodeTest.java index 7bd0e898fb6..b09a7786a13 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CountryCodeTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CountryCodeTest.java @@ -19,8 +19,8 @@ import java.util.regex.Pattern; import org.junit.Ignore; import org.junit.Test; -import com.sap.sailing.domain.common.CountryCode; -import com.sap.sailing.domain.common.CountryCodeFactory; +import com.sap.sse.common.CountryCode; +import com.sap.sse.common.CountryCodeFactory; import com.sap.sse.common.Util; public class CountryCodeTest { diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/KMeansTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/KMeansTest.java new file mode 100755 index 00000000000..959ddf4f24a --- /dev/null +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/KMeansTest.java @@ -0,0 +1,90 @@ +package com.sap.sailing.domain.test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Random; +import java.util.Set; + +import org.junit.Test; + +import com.sap.sailing.domain.base.ScalableInteger; +import com.sap.sailing.domain.common.confidence.impl.ScalableDouble; +import com.sap.sse.util.kmeans.Cluster; +import com.sap.sse.util.kmeans.KMeansClusterer; +import com.sap.sse.util.kmeans.KMeansClustererWithEquidistantInitialization; +import com.sap.sse.util.kmeans.KMeansMappingClusterer; + +public class KMeansTest { + @Test + public void simpleIntegerTestWithEquidistantInitialization() { + KMeansClustererWithEquidistantInitialization clusterer = new KMeansClustererWithEquidistantInitialization<>(4, + Arrays.asList(new ScalableInteger(1), new ScalableInteger(1), new ScalableInteger(11), new ScalableInteger(11), new ScalableInteger(21), new ScalableInteger(21), new ScalableInteger(31), new ScalableInteger(31))); + Set> clusters = clusterer.getClusters(); + assertEquals(4, clusters.size()); + Set clusterCentroids = new HashSet<>(); + clusters.stream().map((c)->c.getCentroid()).forEach((e)->clusterCentroids.add(e)); + assertEquals(new HashSet(Arrays.asList(1, 11, 21, 31)), clusterCentroids); + } + + @Test + public void doubleTestWithRandomInitialization() { + Random random = new Random(1234); + List elements = new ArrayList<>(); + for (int i=0; i<100000; i++) { + elements.add(new ScalableDouble(random.nextDouble())); + } + KMeansClusterer clusterer = new KMeansClusterer<>(4, elements); + Set> clusters = clusterer.getClusters(); + for (Cluster cluster : clusters) { + for (ScalableDouble element : cluster) { + final Double elementVal = element.divide(1); + final double actualDistanceFromMean = Math.abs(cluster.getMean() - elementVal); + for (Cluster otherCluster : clusters) { + if (otherCluster != cluster) { + Double otherClusterMean = otherCluster.getMean(); + final double distanceToOtherClusterMean = Math.abs(otherClusterMean - elementVal); + // assert that all elements are in the cluster where they are closest to the cluster's mean + assertTrue(distanceToOtherClusterMean >= actualDistanceFromMean); + } + } + } + } + } + + @Test + public void testMappingClusterer() { + List strings = new ArrayList<>(); + Random random = new Random(); + StringBuilder sb = new StringBuilder(); + for (int i=0; i<100000; i++) { + for (int j=random.nextInt(100); j>=0; j--) { + sb.append((char) ('A'+random.nextInt(26))); + } + strings.add(sb.toString()); + sb.delete(0, sb.length()); + } + KMeansMappingClusterer clusterer = new KMeansMappingClusterer<>(5, strings, (s)->new ScalableInteger(s.length()), + Arrays.asList(5, 25, 50, 75, 100).iterator()); + Set> clusters = clusterer.getClusters(); + assertEquals(5, clusters.size()); + for (Cluster cluster : clusters) { + for (String element : cluster) { + final int elementLength = element.length(); + double actualDistanceFromMean = Math.abs(cluster.getMean() - elementLength); + for (Cluster otherCluster : clusters) { + if (otherCluster != cluster) { + final int otherClusterMean = otherCluster.getMean(); + final double distanceToOtherClusterMean = Math.abs(otherClusterMean - elementLength); + // assert that all elements are in the cluster where they are closest to the cluster's mean + assertTrue(distanceToOtherClusterMean >= actualDistanceFromMean); + } + } + } + } + } +} diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardCourseChangeTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardCourseChangeTest.java index cc4c2099aca..c6e4e4711ab 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardCourseChangeTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardCourseChangeTest.java @@ -38,7 +38,6 @@ import com.sap.sailing.domain.base.impl.MarkImpl; import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.base.impl.SeriesImpl; import com.sap.sailing.domain.base.impl.WaypointImpl; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.NoWindException; import com.sap.sailing.domain.common.dto.LeaderboardDTO; import com.sap.sailing.domain.leaderboard.Leaderboard; @@ -54,6 +53,7 @@ import com.sap.sailing.domain.tracking.TrackedRegatta; import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; import com.sap.sailing.domain.tracking.impl.DynamicTrackedRaceImpl; import com.sap.sailing.domain.tracking.impl.EmptyWindStore; +import com.sap.sse.common.Color; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardScoringAndRankingTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardScoringAndRankingTest.java index 23082e5033b..3ad5d6801fa 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardScoringAndRankingTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardScoringAndRankingTest.java @@ -72,7 +72,7 @@ import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; import com.sap.sailing.domain.tracking.impl.MarkPassingImpl; import com.sap.sailing.domain.tracking.impl.TimedComparator; -import com.sap.sailing.util.impl.ArrayListNavigableSet; +import com.sap.sse.common.ArrayListNavigableSet; import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LockAsResourceTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LockAsResourceTest.java index 5f8ec361afc..fc8ff230073 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LockAsResourceTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LockAsResourceTest.java @@ -4,9 +4,9 @@ import static org.junit.Assert.assertEquals; import org.junit.Test; -import com.sap.sailing.util.AutoCloseableReadLock; -import com.sap.sailing.util.AutoCloseableWriteLock; -import com.sap.sailing.util.impl.NamedReentrantReadWriteLock; +import com.sap.sse.concurrent.NamedReentrantReadWriteLock; +import com.sap.sse.util.AutoCloseableReadLock; +import com.sap.sse.util.AutoCloseableWriteLock; public class LockAsResourceTest { @Test diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LockTraceTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LockTraceTest.java index abb276740d0..11bb1099494 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LockTraceTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LockTraceTest.java @@ -14,9 +14,9 @@ import org.junit.Test; import com.sap.sailing.domain.test.measurements.Measurement; import com.sap.sailing.domain.test.measurements.MeasurementCase; import com.sap.sailing.domain.test.measurements.MeasurementXMLFile; -import com.sap.sailing.util.impl.LockUtil; -import com.sap.sailing.util.impl.NamedReentrantReadWriteLock; import com.sap.sse.common.Util; +import com.sap.sse.concurrent.LockUtil; +import com.sap.sse.concurrent.NamedReentrantReadWriteLock; public class LockTraceTest { private static class LockingThread extends Thread { diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/OfflineSerializationTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/OfflineSerializationTest.java index 7e1dc83fbd8..1e34a56762c 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/OfflineSerializationTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/OfflineSerializationTest.java @@ -36,7 +36,6 @@ import com.sap.sailing.domain.base.impl.DomainFactoryImpl; import com.sap.sailing.domain.base.impl.EventImpl; import com.sap.sailing.domain.base.impl.PersonImpl; import com.sap.sailing.domain.base.impl.TeamImpl; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.LeaderboardGroup; import com.sap.sailing.domain.leaderboard.impl.FlexibleLeaderboardImpl; @@ -44,6 +43,7 @@ import com.sap.sailing.domain.leaderboard.impl.HighPoint; import com.sap.sailing.domain.leaderboard.impl.LeaderboardGroupImpl; import com.sap.sailing.domain.leaderboard.impl.ThresholdBasedResultDiscardingRuleImpl; import com.sap.sailing.domain.leaderboard.meta.LeaderboardGroupMetaLeaderboard; +import com.sap.sse.common.Color; import com.sap.sse.common.Duration; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/OnlineTracTracBasedTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/OnlineTracTracBasedTest.java index 42f6551e000..5918eda0c56 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/OnlineTracTracBasedTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/OnlineTracTracBasedTest.java @@ -24,6 +24,7 @@ import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.common.Position; +import com.sap.sailing.domain.common.TrackedRaceStatusEnum; import com.sap.sailing.domain.common.impl.DegreePosition; import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore; import com.sap.sailing.domain.regattalog.impl.EmptyRegattaLogStore; @@ -35,6 +36,7 @@ import com.sap.sailing.domain.tracking.impl.DynamicTrackedRegattaImpl; import com.sap.sailing.domain.tracking.impl.EmptyWindStore; import com.sap.sailing.domain.tracking.impl.GPSFixImpl; import com.sap.sailing.domain.tracking.impl.TrackedLegImpl; +import com.sap.sailing.domain.tracking.impl.TrackedRaceStatusImpl; import com.sap.sailing.domain.tractracadapter.Receiver; import com.sap.sailing.domain.tractracadapter.ReceiverType; import com.sap.sailing.domain.tractracadapter.TracTracConnectionConstants; @@ -109,11 +111,7 @@ public abstract class OnlineTracTracBasedTest extends AbstractTracTracLiveTest { throws InterruptedException { setStoredDataLoaded(false); ArrayList receivers = new ArrayList(); - for (Receiver r : domainFactory.getUpdateReceivers(trackedRegatta, getTracTracRace(), EmptyWindStore.INSTANCE, /* delayToLiveInMillis */0l, /* simulator */null, new DynamicRaceDefinitionSet() { - @Override - public void addRaceDefinition(RaceDefinition race, DynamicTrackedRace trackedRace) { - } - }, + for (Receiver r : domainFactory.getUpdateReceivers(trackedRegatta, getTracTracRace(), EmptyWindStore.INSTANCE, /* delayToLiveInMillis */0l, /* simulator */null, createRaceDefinitionSet(), /* trackedRegattaRegistry */null, /* courseDesignUpdateURI */null, /* tracTracUsername */null, null, /* tracTracPassword */ getEventSubscriber(), getRaceSubscriber(), receiverTypes)) { @@ -125,6 +123,31 @@ public abstract class OnlineTracTracBasedTest extends AbstractTracTracLiveTest { @Override public void gotStoredDataEvent(IStoredDataEvent storedDataEvent) { + TrackedRaceStatusImpl lastStatus; + switch (storedDataEvent.getType()) { + case Begin: + logger.info("Stored data begin"); + lastStatus = new TrackedRaceStatusImpl(TrackedRaceStatusEnum.LOADING, 0); + if (getTrackedRace() != null) { + getTrackedRace().setStatus(lastStatus); + } + break; + case End: + logger.info("Stored data end"); + lastStatus = new TrackedRaceStatusImpl(TrackedRaceStatusEnum.TRACKING, 1); + if (getTrackedRace() != null) { + getTrackedRace().setStatus(lastStatus); + } + break; + case Progress: + lastStatus = new TrackedRaceStatusImpl(TrackedRaceStatusEnum.LOADING, storedDataEvent.getProgress()); + if (getTrackedRace() != null) { + getTrackedRace().setStatus(lastStatus); + } + break; + default: + break; + } if (storedDataEvent.getProgress() == 1.0) { synchronized (semaphor) { storedDataLoaded = true; @@ -164,6 +187,18 @@ public abstract class OnlineTracTracBasedTest extends AbstractTracTracLiveTest { trackedRace = (DynamicTrackedRaceImpl) getTrackedRegatta().getTrackedRace(race); } + /** + * Creates a race definition set that receives a call-back when the tracked race has been created. Subclasses may override this + * in order to be informed at the point in time when the race creation happens. + */ + protected DynamicRaceDefinitionSet createRaceDefinitionSet() { + return new DynamicRaceDefinitionSet() { + @Override + public void addRaceDefinition(RaceDefinition race, DynamicTrackedRace trackedRace) { + } + }; + } + private void setStoredDataLoaded(boolean storedDataLoaded) { this.storedDataLoaded = storedDataLoaded; } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ReadReadDeadlockTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ReadReadDeadlockTest.java index c51a24c2fbc..d46bfb7f71c 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ReadReadDeadlockTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ReadReadDeadlockTest.java @@ -4,8 +4,8 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import org.junit.Test; -import com.sap.sailing.util.impl.LockUtil; -import com.sap.sailing.util.impl.NamedReentrantReadWriteLock; +import com.sap.sse.concurrent.LockUtil; +import com.sap.sse.concurrent.NamedReentrantReadWriteLock; /** * {@link ReentrantReadWriteLock} can produce a lock between readers and other readers if the lock diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RouteAssemblyTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RouteAssemblyTest.java index 7d5b4570aed..f2c16669e08 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RouteAssemblyTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RouteAssemblyTest.java @@ -12,8 +12,8 @@ import org.junit.Test; import com.sap.sailing.domain.base.Course; import com.sap.sailing.domain.tractracadapter.DomainFactory; import com.sap.sailing.domain.tractracadapter.Receiver; -import com.tractrac.model.lib.api.route.IControlRoute; import com.sap.sse.common.Util; +import com.tractrac.model.lib.api.route.IControlRoute; import com.tractrac.subscription.lib.api.control.IControlRouteChangeListener; public class RouteAssemblyTest extends AbstractTracTracLiveTest { diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/SerializationWithOnlineRaceTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/SerializationWithOnlineRaceTest.java index b500ad8b156..aa548ff5c2d 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/SerializationWithOnlineRaceTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/SerializationWithOnlineRaceTest.java @@ -28,9 +28,9 @@ import com.sap.sailing.domain.tracking.DynamicGPSFixTrack; import com.sap.sailing.domain.tracking.GPSFixMoving; import com.sap.sailing.domain.tracking.impl.WindImpl; import com.sap.sailing.domain.tractracadapter.ReceiverType; -import com.tractrac.model.lib.api.event.CreateModelException; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; +import com.tractrac.model.lib.api.event.CreateModelException; import com.tractrac.subscription.lib.api.SubscriberInitializationException; public class SerializationWithOnlineRaceTest extends OnlineTracTracBasedTest { diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/SmartFutureCacheDeadlockTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/SmartFutureCacheDeadlockTest.java index b03b00bd6b9..7a96fbf41f9 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/SmartFutureCacheDeadlockTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/SmartFutureCacheDeadlockTest.java @@ -15,11 +15,11 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; -import com.sap.sailing.util.SmartFutureCache; -import com.sap.sailing.util.SmartFutureCache.EmptyUpdateInterval; -import com.sap.sailing.util.impl.LockUtil; -import com.sap.sailing.util.impl.NamedReentrantReadWriteLock; import com.sap.sse.common.Util; +import com.sap.sse.concurrent.LockUtil; +import com.sap.sse.concurrent.NamedReentrantReadWriteLock; +import com.sap.sse.util.SmartFutureCache; +import com.sap.sse.util.SmartFutureCache.EmptyUpdateInterval; /** * When the thread reading a value from the cache holds a fair read lock, and another thread is trying to obtain the diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/SmartFutureCacheTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/SmartFutureCacheTest.java index 952c595f83f..9222d62fd76 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/SmartFutureCacheTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/SmartFutureCacheTest.java @@ -13,9 +13,9 @@ import java.util.concurrent.ConcurrentSkipListSet; import org.junit.Ignore; import org.junit.Test; -import com.sap.sailing.util.SmartFutureCache; -import com.sap.sailing.util.SmartFutureCache.EmptyUpdateInterval; -import com.sap.sailing.util.SmartFutureCache.UpdateInterval; +import com.sap.sse.util.SmartFutureCache; +import com.sap.sse.util.SmartFutureCache.EmptyUpdateInterval; +import com.sap.sse.util.SmartFutureCache.UpdateInterval; public class SmartFutureCacheTest { @Test diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/StoredTrackBasedTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/StoredTrackBasedTest.java index bc4bf784d0c..9b5bc2dacf6 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/StoredTrackBasedTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/StoredTrackBasedTest.java @@ -24,7 +24,6 @@ import com.sap.sailing.domain.base.impl.DynamicPerson; import com.sap.sailing.domain.base.impl.DynamicTeam; import com.sap.sailing.domain.base.impl.PersonImpl; import com.sap.sailing.domain.base.impl.TeamImpl; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.Position; import com.sap.sailing.domain.common.SpeedWithBearing; import com.sap.sailing.domain.common.impl.DegreeBearingImpl; @@ -34,6 +33,7 @@ import com.sap.sailing.domain.tracking.DynamicGPSFixTrack; import com.sap.sailing.domain.tracking.GPSFixMoving; import com.sap.sailing.domain.tracking.impl.DynamicGPSFixMovingTrackImpl; import com.sap.sailing.domain.tracking.impl.GPSFixMovingImpl; +import com.sap.sse.common.Color; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TackTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TackTest.java index 74404c45d89..414ea94a80f 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TackTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TackTest.java @@ -15,7 +15,6 @@ import com.sap.sailing.domain.base.impl.CompetitorImpl; import com.sap.sailing.domain.base.impl.NationalityImpl; import com.sap.sailing.domain.base.impl.PersonImpl; import com.sap.sailing.domain.base.impl.TeamImpl; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.NoWindException; import com.sap.sailing.domain.common.Tack; import com.sap.sailing.domain.common.impl.DegreeBearingImpl; @@ -25,6 +24,7 @@ import com.sap.sailing.domain.tracking.DynamicGPSFixTrack; import com.sap.sailing.domain.tracking.GPSFixMoving; import com.sap.sailing.domain.tracking.Wind; import com.sap.sailing.domain.tracking.impl.GPSFixMovingImpl; +import com.sap.sse.common.Color; import com.sap.sse.common.impl.MillisecondsTimePoint; diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackBasedTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackBasedTest.java index 944579781b8..99d8ab7bfe9 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackBasedTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackBasedTest.java @@ -27,7 +27,6 @@ import com.sap.sailing.domain.base.impl.RaceDefinitionImpl; import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.base.impl.TeamImpl; import com.sap.sailing.domain.base.impl.WaypointImpl; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.ScoringSchemeType; import com.sap.sailing.domain.common.WindSourceType; import com.sap.sailing.domain.common.impl.DegreeBearingImpl; @@ -45,6 +44,7 @@ import com.sap.sailing.domain.tracking.impl.EmptyWindStore; import com.sap.sailing.domain.tracking.impl.GPSFixImpl; import com.sap.sailing.domain.tracking.impl.MarkPassingImpl; import com.sap.sailing.domain.tracking.impl.WindImpl; +import com.sap.sse.common.Color; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/WindEstimationOnKielerWoche505Race2DataTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/WindEstimationOnKielerWoche505Race2DataTest.java index 7b1c3194c6e..a3b6adfbf20 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/WindEstimationOnKielerWoche505Race2DataTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/WindEstimationOnKielerWoche505Race2DataTest.java @@ -30,10 +30,10 @@ import com.sap.sailing.domain.tracking.WindTrack; import com.sap.sailing.domain.tracking.impl.TrackBasedEstimationWindTrackImpl; import com.sap.sailing.domain.tracking.impl.WindImpl; import com.sap.sailing.domain.tractracadapter.ReceiverType; -import com.tractrac.model.lib.api.event.CreateModelException; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; +import com.tractrac.model.lib.api.event.CreateModelException; import com.tractrac.subscription.lib.api.SubscriberInitializationException; public class WindEstimationOnKielerWoche505Race2DataTest extends OnlineTracTracBasedTest { 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 312757e532a..73397e43197 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 @@ -33,7 +33,6 @@ import com.sap.sailing.domain.base.impl.RaceDefinitionImpl; import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.base.impl.TeamImpl; import com.sap.sailing.domain.common.Bearing; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.Position; import com.sap.sailing.domain.common.ScoringSchemeType; import com.sap.sailing.domain.common.confidence.Weigher; @@ -59,6 +58,7 @@ import com.sap.sailing.domain.tracking.impl.MarkPassingImpl; import com.sap.sailing.domain.tracking.impl.WindImpl; import com.sap.sailing.domain.tracking.impl.WindTrackImpl; import com.sap.sailing.domain.tracking.impl.WindWithConfidenceImpl; +import com.sap.sse.common.Color; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.Util.Pair; diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/markpassing/AbstractMarkPassingTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/markpassing/AbstractMarkPassingTest.java index 8c6074fb0c3..28ee679f364 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/markpassing/AbstractMarkPassingTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/markpassing/AbstractMarkPassingTest.java @@ -37,10 +37,10 @@ import com.sap.sailing.domain.tracking.GPSFixMoving; import com.sap.sailing.domain.tracking.MarkPassing; import com.sap.sailing.domain.tracking.impl.WindImpl; import com.sap.sailing.domain.tractracadapter.ReceiverType; -import com.tractrac.model.lib.api.event.CreateModelException; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; +import com.tractrac.model.lib.api.event.CreateModelException; import com.tractrac.subscription.lib.api.SubscriberInitializationException; public abstract class AbstractMarkPassingTest extends OnlineTracTracBasedTest { diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java index 571579d877f..289ecceb33e 100755 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java @@ -73,11 +73,11 @@ import com.sap.sailing.domain.tractracadapter.ReceiverType; import com.sap.sailing.domain.tractracadapter.TracTracConfiguration; import com.sap.sailing.domain.tractracadapter.TracTracControlPoint; import com.sap.sailing.domain.tractracadapter.TracTracRaceTracker; -import com.sap.sailing.util.WeakIdentityHashMap; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.Util.Pair; import com.sap.sse.common.impl.MillisecondsTimePoint; +import com.sap.sse.util.WeakIdentityHashMap; import com.tractrac.model.lib.api.data.IPosition; import com.tractrac.model.lib.api.event.CreateModelException; import com.tractrac.model.lib.api.event.ICompetitor; diff --git a/java/com.sap.sailing.domain/META-INF/MANIFEST.MF b/java/com.sap.sailing.domain/META-INF/MANIFEST.MF index d019beaf847..81ee7d0a467 100755 --- a/java/com.sap.sailing.domain/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.domain/META-INF/MANIFEST.MF @@ -30,10 +30,11 @@ Export-Package: com.sap.sailing.domain.base, com.sap.sailing.util.impl;x-friends:="com.sap.sailing.server.replication,com.sap.sailing.domain.test" Bundle-ActivationPolicy: lazy Require-Bundle: com.googlecode.java-diff-utils;bundle-version="1.3.0", - com.sap.sailing.domain.shared.android;bundle-version="1.0.0", + com.sap.sailing.domain.shared.android, com.sap.sailing.domain.common, org.json.simple;bundle-version="1.1.0", com.sap.sailing.geocoding, - com.sap.sse.datamining.shared;bundle-version="1.0.0", + com.sap.sse.datamining.shared, com.sap.sse.common, - com.sap.sse + com.sap.sse, + com.sap.sse.shared.android diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/ScalableInteger.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/ScalableInteger.java index 0bde779cb1c..09a30f2ad2f 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/ScalableInteger.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/ScalableInteger.java @@ -1,7 +1,7 @@ package com.sap.sailing.domain.base; -import com.sap.sailing.domain.common.scalablevalue.AbstractScalarValue; -import com.sap.sailing.domain.common.scalablevalue.ScalableValue; +import com.sap.sse.common.scalablevalue.AbstractScalarValue; +import com.sap.sse.common.scalablevalue.ScalableValue; public class ScalableInteger implements AbstractScalarValue { @@ -12,12 +12,12 @@ public class ScalableInteger implements AbstractScalarValue { } @Override - public ScalableValue multiply(double factor) { + public ScalableInteger multiply(double factor) { return new ScalableInteger((int) (getValue() * factor)); } @Override - public ScalableValue add(ScalableValue t) { + public ScalableInteger add(ScalableValue t) { return new ScalableInteger(getValue() + t.getValue()); } @@ -31,4 +31,18 @@ public class ScalableInteger implements AbstractScalarValue { return value; } + @Override + public double getDistance(Integer other) { + return Math.abs(value-other); + } + + @Override + public String toString() { + return value.toString(); + } + + @Override + public int compareTo(Integer o) { + return new Integer(value).compareTo(o); + } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/CourseImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/CourseImpl.java index 9f2e350dbfd..aa862ad14cc 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/CourseImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/CourseImpl.java @@ -23,10 +23,10 @@ import com.sap.sailing.domain.base.Leg; import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.common.PassingInstruction; import com.sap.sailing.util.CourseAsWaypointList; -import com.sap.sailing.util.impl.LockUtil; -import com.sap.sailing.util.impl.NamedReentrantReadWriteLock; import com.sap.sse.common.Util; import com.sap.sse.common.impl.NamedImpl; +import com.sap.sse.concurrent.LockUtil; +import com.sap.sse.concurrent.NamedReentrantReadWriteLock; import difflib.DiffUtils; import difflib.Patch; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/DynamicCompetitorStore.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/DynamicCompetitorStore.java index 5c814750cdd..aafc1d26917 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/DynamicCompetitorStore.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/DynamicCompetitorStore.java @@ -3,7 +3,7 @@ package com.sap.sailing.domain.base.impl; import java.io.Serializable; import com.sap.sailing.domain.base.CompetitorStore; -import com.sap.sailing.domain.common.Color; +import com.sap.sse.common.Color; public interface DynamicCompetitorStore extends CompetitorStore { @Override diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/PositionWithConfidenceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/PositionWithConfidenceImpl.java index 9f0995cec87..390fbe9a2b1 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/PositionWithConfidenceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/PositionWithConfidenceImpl.java @@ -3,8 +3,8 @@ package com.sap.sailing.domain.base.impl; import com.sap.sailing.domain.base.PositionWithConfidence; import com.sap.sailing.domain.common.Position; import com.sap.sailing.domain.common.confidence.impl.HasConfidenceImpl; -import com.sap.sailing.domain.common.scalablevalue.IsScalable; import com.sap.sailing.domain.common.scalablevalue.impl.ScalablePosition; +import com.sap.sse.common.scalablevalue.IsScalable; public class PositionWithConfidenceImpl extends HasConfidenceImpl implements PositionWithConfidence, IsScalable { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SpeedWithBearingWithConfidenceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SpeedWithBearingWithConfidenceImpl.java index b94164d8f21..97d0c1e6951 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SpeedWithBearingWithConfidenceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SpeedWithBearingWithConfidenceImpl.java @@ -4,10 +4,10 @@ import com.sap.sailing.domain.base.SpeedWithBearingWithConfidence; import com.sap.sailing.domain.common.Speed; import com.sap.sailing.domain.common.SpeedWithBearing; import com.sap.sailing.domain.common.confidence.impl.HasConfidenceImpl; -import com.sap.sailing.domain.common.scalablevalue.IsScalable; -import com.sap.sailing.domain.common.scalablevalue.ScalableValue; import com.sap.sailing.domain.common.scalablevalue.impl.ScalableSpeedWithBearing; import com.sap.sse.common.Util; +import com.sap.sse.common.scalablevalue.IsScalable; +import com.sap.sse.common.scalablevalue.ScalableValue; public class SpeedWithBearingWithConfidenceImpl extends HasConfidenceImpl, SpeedWithBearing, RelativeTo> implements diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SpeedWithConfidenceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SpeedWithConfidenceImpl.java index e71a3cbe227..6842a44957d 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SpeedWithConfidenceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SpeedWithConfidenceImpl.java @@ -3,8 +3,8 @@ package com.sap.sailing.domain.base.impl; import com.sap.sailing.domain.base.SpeedWithConfidence; import com.sap.sailing.domain.common.Speed; import com.sap.sailing.domain.common.confidence.impl.HasConfidenceImpl; -import com.sap.sailing.domain.common.scalablevalue.ScalableValue; import com.sap.sailing.domain.common.scalablevalue.impl.ScalableSpeed; +import com.sap.sse.common.scalablevalue.ScalableValue; public class SpeedWithConfidenceImpl extends HasConfidenceImpl implements SpeedWithConfidence { private static final long serialVersionUID = -3122580369653833748L; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/LeaderboardCacheManager.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/LeaderboardCacheManager.java index 93fa4dacce7..481d63b3cc3 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/LeaderboardCacheManager.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/LeaderboardCacheManager.java @@ -15,16 +15,16 @@ import com.sap.sailing.domain.base.Nationality; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.RaceColumnListener; import com.sap.sailing.domain.base.WithNationality; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.leaderboard.caching.LeaderboardCache; import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.tracking.RaceChangeListener; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.impl.AbstractRaceChangeListener; -import com.sap.sailing.util.impl.ConcurrentWeakHashMap; -import com.sap.sailing.util.impl.LockUtil; -import com.sap.sailing.util.impl.NamedReentrantReadWriteLock; +import com.sap.sse.common.Color; +import com.sap.sse.concurrent.ConcurrentWeakHashMap; +import com.sap.sse.concurrent.LockUtil; +import com.sap.sse.concurrent.NamedReentrantReadWriteLock; /** * Manages a {@link LeaderboardCache}. When a {@link Leaderboard} is {@link LeaderboardCache#add added} to the cache, it diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/caching/LeaderboardDTOCache.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/caching/LeaderboardDTOCache.java index d1e6ccdd2b9..1812ae79b8b 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/caching/LeaderboardDTOCache.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/caching/LeaderboardDTOCache.java @@ -24,10 +24,10 @@ import com.sap.sailing.domain.leaderboard.ScoreCorrection; import com.sap.sailing.domain.leaderboard.ScoreCorrectionListener; import com.sap.sailing.domain.tracking.RaceChangeListener; import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; -import com.sap.sailing.util.impl.LockUtil; -import com.sap.sailing.util.impl.NamedReentrantReadWriteLock; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; +import com.sap.sse.concurrent.LockUtil; +import com.sap.sse.concurrent.NamedReentrantReadWriteLock; import com.sap.sse.util.impl.ThreadFactoryWithPriority; /** diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractSimpleLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractSimpleLeaderboardImpl.java index debcdeee01d..d06034ff83f 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractSimpleLeaderboardImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractSimpleLeaderboardImpl.java @@ -80,13 +80,13 @@ import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; import com.sap.sailing.domain.tracking.WindLegTypeAndLegBearingCache; import com.sap.sailing.domain.tracking.WindPositionMode; import com.sap.sailing.domain.tracking.impl.AbstractRaceChangeListener; -import com.sap.sailing.util.impl.LockUtil; -import com.sap.sailing.util.impl.NamedReentrantReadWriteLock; import com.sap.sailing.util.impl.RaceColumnListeners; import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; +import com.sap.sse.concurrent.LockUtil; +import com.sap.sse.concurrent.NamedReentrantReadWriteLock; import com.sap.sse.util.impl.ThreadFactoryWithPriority; /** diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/HighPointFirstGets10Or8AndLastBreaksTie.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/HighPointFirstGets10Or8AndLastBreaksTie.java index ccea8452c6e..8620ef43e54 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/HighPointFirstGets10Or8AndLastBreaksTie.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/HighPointFirstGets10Or8AndLastBreaksTie.java @@ -5,8 +5,8 @@ import java.util.concurrent.Callable; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.AdditionalScoringInformationFinder; -import com.sap.sailing.domain.abstractlog.race.scoring.RaceLogAdditionalScoringInformationEvent; import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationType; +import com.sap.sailing.domain.abstractlog.race.scoring.RaceLogAdditionalScoringInformationEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/FlexibleMetaLeaderboard.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/FlexibleMetaLeaderboard.java index 04b8d549869..a7de5eb4c40 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/FlexibleMetaLeaderboard.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/FlexibleMetaLeaderboard.java @@ -7,8 +7,8 @@ import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.ScoringScheme; import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule; -import com.sap.sailing.util.impl.LockUtil; -import com.sap.sailing.util.impl.NamedReentrantReadWriteLock; +import com.sap.sse.concurrent.LockUtil; +import com.sap.sse.concurrent.NamedReentrantReadWriteLock; public class FlexibleMetaLeaderboard extends AbstractMetaLeaderboard { private static final long serialVersionUID = 789076326144062944L; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRaceWithWindEssentials.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRaceWithWindEssentials.java index 30d6144ef71..1ad8e720f44 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRaceWithWindEssentials.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRaceWithWindEssentials.java @@ -12,8 +12,8 @@ import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.common.WindSource; import com.sap.sailing.domain.common.WindSourceType; import com.sap.sailing.domain.tracking.impl.CombinedWindTrackImpl; -import com.sap.sailing.util.impl.LockUtil; -import com.sap.sailing.util.impl.NamedReentrantReadWriteLock; +import com.sap.sse.concurrent.LockUtil; +import com.sap.sse.concurrent.NamedReentrantReadWriteLock; public abstract class TrackedRaceWithWindEssentials implements TrackedRace { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/CourseBasedWindTrackImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/CourseBasedWindTrackImpl.java index 205a00825da..03e4ef61f09 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/CourseBasedWindTrackImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/CourseBasedWindTrackImpl.java @@ -5,10 +5,10 @@ import java.util.NavigableSet; import com.sap.sailing.domain.common.WindSourceType; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.Wind; -import com.sap.sailing.util.impl.ArrayListNavigableSet; -import com.sap.sailing.util.impl.UnmodifiableNavigableSet; +import com.sap.sse.common.ArrayListNavigableSet; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; +import com.sap.sse.util.impl.UnmodifiableNavigableSet; /** * The only "raw" fix produced by this wind track implementation is based on the course layout of the tracked race to diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/CrossTrackErrorCache.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/CrossTrackErrorCache.java index 7db5e246c46..29cccd854a8 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/CrossTrackErrorCache.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/CrossTrackErrorCache.java @@ -26,11 +26,11 @@ import com.sap.sailing.domain.tracking.RaceChangeListener; import com.sap.sailing.domain.tracking.Track; import com.sap.sailing.domain.tracking.TrackedLeg; import com.sap.sailing.domain.tracking.TrackedRace; -import com.sap.sailing.util.SmartFutureCache; -import com.sap.sailing.util.SmartFutureCache.CacheUpdater; -import com.sap.sailing.util.SmartFutureCache.UpdateInterval; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; +import com.sap.sse.util.SmartFutureCache; +import com.sap.sse.util.SmartFutureCache.CacheUpdater; +import com.sap.sse.util.SmartFutureCache.UpdateInterval; /** * (Re-)computing the cross track error for a competitor causes significant amounts of CPU cycles. The cross track error diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DistanceCache.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DistanceCache.java index 4f5f95b4f9a..a3493dce33c 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DistanceCache.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DistanceCache.java @@ -6,11 +6,11 @@ import java.util.NavigableSet; import com.sap.sailing.domain.common.Distance; import com.sap.sailing.domain.tracking.GPSFix; -import com.sap.sailing.util.impl.ArrayListNavigableSet; -import com.sap.sailing.util.impl.LockUtil; -import com.sap.sailing.util.impl.NamedReentrantReadWriteLock; +import com.sap.sse.common.ArrayListNavigableSet; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; +import com.sap.sse.concurrent.LockUtil; +import com.sap.sse.concurrent.NamedReentrantReadWriteLock; /** * Computing {@link #getDistanceTraveled(TimePoint, TimePoint)} is more expensive the longer the track is and the diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DummyMarkPassingWithTimePointOnly.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DummyMarkPassingWithTimePointOnly.java index 1d465adb17e..41bfb97db8b 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DummyMarkPassingWithTimePointOnly.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DummyMarkPassingWithTimePointOnly.java @@ -6,8 +6,8 @@ import com.sap.sailing.domain.base.CompetitorChangeListener; import com.sap.sailing.domain.base.SharedDomainFactory; import com.sap.sailing.domain.base.Team; import com.sap.sailing.domain.base.Waypoint; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.tracking.MarkPassing; +import com.sap.sse.common.Color; import com.sap.sse.common.IsManagedByCache; import com.sap.sse.common.TimePoint; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java index 87b67934aa1..dbbbfc27dd2 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java @@ -54,11 +54,11 @@ import com.sap.sailing.domain.tracking.TrackedRegatta; import com.sap.sailing.domain.tracking.Wind; import com.sap.sailing.domain.tracking.WindStore; import com.sap.sailing.domain.tracking.WindTrack; -import com.sap.sailing.util.impl.LockUtil; -import com.sap.sailing.util.impl.NamedReentrantReadWriteLock; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; +import com.sap.sse.concurrent.LockUtil; +import com.sap.sse.concurrent.NamedReentrantReadWriteLock; public class DynamicTrackedRaceImpl extends TrackedRaceImpl implements DynamicTrackedRace, GPSTrackListener { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/GPSFixTrackImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/GPSFixTrackImpl.java index eb9f061f4b4..fcda31eda05 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/GPSFixTrackImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/GPSFixTrackImpl.java @@ -42,7 +42,7 @@ import com.sap.sailing.domain.tracking.GPSFixMoving; import com.sap.sailing.domain.tracking.GPSFixTrack; import com.sap.sailing.domain.tracking.GPSTrackListener; import com.sap.sailing.domain.tracking.WithValidityCache; -import com.sap.sailing.util.impl.ArrayListNavigableSet; +import com.sap.sse.common.ArrayListNavigableSet; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/MaxSpeedCache.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/MaxSpeedCache.java index 59ff6c80765..1d6cf98bd90 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/MaxSpeedCache.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/MaxSpeedCache.java @@ -12,12 +12,12 @@ import com.sap.sailing.domain.tracking.GPSFix; import com.sap.sailing.domain.tracking.GPSFixMoving; import com.sap.sailing.domain.tracking.GPSFixTrack; import com.sap.sailing.domain.tracking.GPSTrackListener; -import com.sap.sailing.util.impl.ArrayListNavigableSet; -import com.sap.sailing.util.impl.LockUtil; -import com.sap.sailing.util.impl.NamedReentrantReadWriteLock; +import com.sap.sse.common.ArrayListNavigableSet; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.Util.Pair; +import com.sap.sse.concurrent.LockUtil; +import com.sap.sse.concurrent.NamedReentrantReadWriteLock; /** * Re-calculating the maximum speed over a {@link GPSFixTrack} is time consuming. When the track grows the way it diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/ScalableWind.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/ScalableWind.java index bd8efce45b0..07ae7c5888e 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/ScalableWind.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/ScalableWind.java @@ -2,11 +2,11 @@ package com.sap.sailing.domain.tracking.impl; import com.sap.sailing.domain.common.AbstractPosition; import com.sap.sailing.domain.common.Position; -import com.sap.sailing.domain.common.scalablevalue.ScalableValue; import com.sap.sailing.domain.common.scalablevalue.impl.ScalablePosition; import com.sap.sailing.domain.common.scalablevalue.impl.ScalableSpeedWithBearing; import com.sap.sailing.domain.tracking.Wind; import com.sap.sse.common.impl.MillisecondsTimePoint; +import com.sap.sse.common.scalablevalue.ScalableValue; /** * Wind values are scaled by separately scaling their speed and bearing, and separately scaling their time point, and diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackBasedEstimationWindTrackImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackBasedEstimationWindTrackImpl.java index ea2c8617a65..c193e491c10 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackBasedEstimationWindTrackImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackBasedEstimationWindTrackImpl.java @@ -33,15 +33,15 @@ import com.sap.sailing.domain.tracking.TrackedRaceStatus; import com.sap.sailing.domain.tracking.Wind; import com.sap.sailing.domain.tracking.WindTrack; import com.sap.sailing.domain.tracking.WindWithConfidence; -import com.sap.sailing.util.impl.ArrayListNavigableSet; -import com.sap.sailing.util.impl.LockUtil; -import com.sap.sailing.util.impl.NamedReentrantReadWriteLock; +import com.sap.sse.common.ArrayListNavigableSet; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.Util.Pair; import com.sap.sse.common.impl.AbstractTimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; import com.sap.sse.common.impl.SerializableComparator; +import com.sap.sse.concurrent.LockUtil; +import com.sap.sse.concurrent.NamedReentrantReadWriteLock; /** * A virtual wind track that computes and caches the wind bearing based on the boat tracks recorded in the tracked race diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegOfCompetitorImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegOfCompetitorImpl.java index f10e916b3f1..41815b7871a 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegOfCompetitorImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegOfCompetitorImpl.java @@ -31,7 +31,7 @@ import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.Wind; import com.sap.sailing.domain.tracking.WindLegTypeAndLegBearingCache; import com.sap.sailing.domain.tracking.WindPositionMode; -import com.sap.sailing.util.impl.ArrayListNavigableSet; +import com.sap.sse.common.ArrayListNavigableSet; import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index 88bf04a0147..a710a17d49f 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -48,6 +48,7 @@ import com.sap.sailing.domain.base.SpeedWithBearingWithConfidence; import com.sap.sailing.domain.base.SpeedWithConfidence; import com.sap.sailing.domain.base.Timed; import com.sap.sailing.domain.base.Waypoint; +import com.sap.sailing.domain.base.impl.CourseImpl; import com.sap.sailing.domain.base.impl.DouglasPeucker; import com.sap.sailing.domain.base.impl.SpeedWithConfidenceImpl; import com.sap.sailing.domain.common.Bearing; @@ -102,26 +103,27 @@ import com.sap.sailing.domain.tracking.MarkPassing; import com.sap.sailing.domain.tracking.Track; import com.sap.sailing.domain.tracking.TrackedLeg; import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor; +import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRaceStatus; import com.sap.sailing.domain.tracking.TrackedRaceWithWindEssentials; import com.sap.sailing.domain.tracking.TrackedRegatta; import com.sap.sailing.domain.tracking.Wind; -import com.sap.sailing.domain.tracking.WindPositionMode; import com.sap.sailing.domain.tracking.WindLegTypeAndLegBearingCache; +import com.sap.sailing.domain.tracking.WindPositionMode; import com.sap.sailing.domain.tracking.WindStore; import com.sap.sailing.domain.tracking.WindTrack; import com.sap.sailing.domain.tracking.WindWithConfidence; -import com.sap.sailing.util.SmartFutureCache; -import com.sap.sailing.util.SmartFutureCache.AbstractCacheUpdater; -import com.sap.sailing.util.SmartFutureCache.EmptyUpdateInterval; -import com.sap.sailing.util.impl.ArrayListNavigableSet; -import com.sap.sailing.util.impl.LockUtil; -import com.sap.sailing.util.impl.NamedReentrantReadWriteLock; +import com.sap.sse.common.ArrayListNavigableSet; import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.Util.Pair; import com.sap.sse.common.impl.MillisecondsTimePoint; +import com.sap.sse.concurrent.LockUtil; +import com.sap.sse.concurrent.NamedReentrantReadWriteLock; +import com.sap.sse.util.SmartFutureCache; +import com.sap.sse.util.SmartFutureCache.AbstractCacheUpdater; +import com.sap.sse.util.SmartFutureCache.EmptyUpdateInterval; import difflib.DiffUtils; import difflib.Patch; @@ -2096,23 +2098,29 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl // compute the maneuvers for competitor com.sap.sse.common.Util.Triple> result = null; NavigableSet markPassings = getMarkPassings(competitor); - boolean markPassingsNotEmpty; TimePoint extendedFrom = null; MarkPassing crossedFinishLine = null; // getLastWaypoint() will wait for a read lock on the course; do this outside the synchronized block to avoid // deadlocks final Waypoint lastWaypoint = getRace().getCourse().getLastWaypoint(); - lockForRead(markPassings); - try { - markPassingsNotEmpty = markPassings != null && !markPassings.isEmpty(); - if (markPassingsNotEmpty) { - extendedFrom = markPassings.iterator().next().getTimePoint(); - crossedFinishLine = getMarkPassing(competitor, lastWaypoint); + if (lastWaypoint != null) { + lockForRead(markPassings); + try { + if (markPassings != null && !markPassings.isEmpty()) { + extendedFrom = markPassings.iterator().next().getTimePoint(); + crossedFinishLine = getMarkPassing(competitor, lastWaypoint); + } + } finally { + unlockAfterRead(markPassings); } - } finally { - unlockAfterRead(markPassings); } - if (markPassingsNotEmpty) { + if (extendedFrom == null) { + GPSFixMoving firstRawFix = getTrack(competitor).getFirstRawFix(); + if (firstRawFix != null) { + extendedFrom = firstRawFix.getTimePoint(); + } + } + if (extendedFrom != null) { TimePoint extendedTo; if (crossedFinishLine != null) { extendedTo = crossedFinishLine.getTimePoint(); @@ -2126,9 +2134,10 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl } if (extendedTo != null) { try { - List extendedResultForCache = detectManeuvers(competitor, extendedFrom, extendedTo, /* ignoreMarkPassings */ false); - result = new com.sap.sse.common.Util.Triple>(extendedFrom, extendedTo, - extendedResultForCache); + List extendedResultForCache = detectManeuvers(competitor, extendedFrom, extendedTo, /* ignoreMarkPassings */ + false); + result = new com.sap.sse.common.Util.Triple>(extendedFrom, + extendedTo, extendedResultForCache); } catch (NoWindException ex) { // Catching the NoWindException here without letting it propagate thru other handlers. // This is mainly to avoid having logs flooded with stack traces. It is safe to catch @@ -2140,8 +2149,8 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl // recomputation. logger.fine("NoWindException during computation of maneuvers for " + competitor.getName()); } - } // else competitor has no fixes to consider; remove any maneuver cache entry - } // else competitor hasn't started yet; remove any maneuver cache entry + } + } // else competitor has no fixes to consider; remove any maneuver cache entry logger.finest("computeManeuvers(" + competitor.getName() + ") called in tracked race " + this + " took " + (System.currentTimeMillis() - startedAt) + "ms"); return result; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/VirtualWindFixesAsNavigableSet.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/VirtualWindFixesAsNavigableSet.java index 2aaef3ee163..a880346c946 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/VirtualWindFixesAsNavigableSet.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/VirtualWindFixesAsNavigableSet.java @@ -10,10 +10,10 @@ import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.Wind; import com.sap.sailing.domain.tracking.WindTrack; import com.sap.sailing.domain.tracking.impl.WindTrackImpl.DummyWind; -import com.sap.sailing.util.impl.AbstractUnmodifiableNavigableSet; -import com.sap.sailing.util.impl.DescendingNavigableSet; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; +import com.sap.sse.util.impl.AbstractUnmodifiableNavigableSet; +import com.sap.sse.util.impl.DescendingNavigableSet; /** * Emulates a collection of {@link Wind} fixes for a {@link TrackedRace}. Subclasses have to specify a resolution and a 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 215029a0086..0219e5d6953 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 @@ -25,7 +25,7 @@ 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.domain.tracking.WindWithConfidence; -import com.sap.sailing.util.impl.ArrayListNavigableSet; +import com.sap.sse.common.ArrayListNavigableSet; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; @@ -165,7 +165,7 @@ public class WindTrackImpl extends TrackImpl implements WindTrack { /** * This method implements the functionality of the {@link #getAveragedWind(Position, TimePoint)} interface method. - * It does so by collecting (smoothened, outliers removed)) wind fixes around the at time point up to + * It does so by collecting (smoothened, outliers removed) wind fixes around the at time point up to * an interval length as specified by {@link #getMillisecondsOverWhichToAverageWind()}. At least one fix that is * closest to at will be picked up. If the track is empty, null is returned. Otherwise, * the wind fixes in the interval constructed are averaged using a {@link ConfidenceBasedWindAverager}. diff --git a/java/com.sap.sailing.ess40.resultimport/src/com/sap/sailing/ess40/resultimport/impl/ScoreCorrectionProviderImpl.java b/java/com.sap.sailing.ess40.resultimport/src/com/sap/sailing/ess40/resultimport/impl/ScoreCorrectionProviderImpl.java index a8d5670fd1b..f81a00be99b 100755 --- a/java/com.sap.sailing.ess40.resultimport/src/com/sap/sailing/ess40/resultimport/impl/ScoreCorrectionProviderImpl.java +++ b/java/com.sap.sailing.ess40.resultimport/src/com/sap/sailing/ess40/resultimport/impl/ScoreCorrectionProviderImpl.java @@ -16,9 +16,9 @@ import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; -import com.sap.sailing.domain.common.Base64Utils; import com.sap.sailing.domain.common.RegattaScoreCorrections; import com.sap.sailing.domain.common.ScoreCorrectionProvider; +import com.sap.sse.common.Base64Utils; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; diff --git a/java/com.sap.sailing.expeditionconnector/src/com/sap/sailing/expeditionconnector/impl/HttpServletMessageReceiverReader.java b/java/com.sap.sailing.expeditionconnector/src/com/sap/sailing/expeditionconnector/impl/HttpServletMessageReceiverReader.java index 16453ba16bd..9973d2080a7 100755 --- a/java/com.sap.sailing.expeditionconnector/src/com/sap/sailing/expeditionconnector/impl/HttpServletMessageReceiverReader.java +++ b/java/com.sap.sailing.expeditionconnector/src/com/sap/sailing/expeditionconnector/impl/HttpServletMessageReceiverReader.java @@ -7,9 +7,9 @@ import java.net.HttpURLConnection; import java.net.URL; import java.util.logging.Logger; -import com.sap.sailing.domain.common.Base64Utils; import com.sap.sailing.domain.common.HttpMessageSenderServletConstants; import com.sap.sailing.expeditionconnector.impl.HttpServletMessageReceiver.Receiver; +import com.sap.sse.common.Base64Utils; public class HttpServletMessageReceiverReader implements Runnable { private static final Logger logger = Logger.getLogger(HttpServletMessageReceiverReader.class.getName()); diff --git a/java/com.sap.sailing.feature/feature.xml b/java/com.sap.sailing.feature/feature.xml index 8446dfc486c..04f21d8f929 100755 --- a/java/com.sap.sailing.feature/feature.xml +++ b/java/com.sap.sailing.feature/feature.xml @@ -395,7 +395,14 @@ Computes leaderboard information for sailing races and offers RESTful APIs to al version="0.0.0" unpack="false"/> - + + extends Column { public interface ColorRetriever { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorEditDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorEditDialog.java index 924de2a3998..f6742beb834 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorEditDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorEditDialog.java @@ -11,15 +11,15 @@ import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.domain.common.BoatClassMasterdata; -import com.sap.sailing.domain.common.Color; -import com.sap.sailing.domain.common.CountryCode; -import com.sap.sailing.domain.common.CountryCodeFactory; import com.sap.sailing.domain.common.dto.BoatClassDTO; import com.sap.sailing.domain.common.dto.CompetitorDTO; import com.sap.sailing.domain.common.dto.CompetitorDTOImpl; -import com.sap.sailing.domain.common.impl.RGBColor; import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sse.common.Color; +import com.sap.sse.common.CountryCode; +import com.sap.sse.common.CountryCodeFactory; import com.sap.sse.common.Util; +import com.sap.sse.common.impl.RGBColor; import com.sap.sse.gwt.client.dialog.DataEntryDialog; /** diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java index 1a7d034733b..2f1acd06de2 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java @@ -16,13 +16,13 @@ import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.ImageResourceRenderer; import com.google.gwt.user.client.ui.Label; import com.google.gwt.view.client.SelectionModel; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.dto.CompetitorDTO; import com.sap.sailing.domain.common.impl.NaturalComparator; import com.sap.sailing.gwt.ui.adminconsole.ColorColumn.ColorRetriever; import com.sap.sailing.gwt.ui.client.FlagImageResolver; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sse.common.Color; import com.sap.sse.gwt.client.ErrorReporter; import com.sap.sse.gwt.client.panels.LabeledAbstractFilterablePanel; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/FleetListEditableEditorComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/FleetListEditableEditorComposite.java index 19d53749a93..dbd2046f90f 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/FleetListEditableEditorComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/FleetListEditableEditorComposite.java @@ -12,10 +12,10 @@ import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Widget; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.FleetColors; import com.sap.sailing.domain.common.dto.FleetDTO; import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sse.common.Color; import com.sap.sse.gwt.client.controls.listedit.ExpandedListEditorUi; public class FleetListEditableEditorComposite extends FleetListEditorComposite { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/FleetListEditorComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/FleetListEditorComposite.java index db1ddd78b4e..19b5c522f6f 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/FleetListEditorComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/FleetListEditorComposite.java @@ -14,10 +14,10 @@ import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Widget; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.FleetColors; import com.sap.sailing.domain.common.dto.FleetDTO; import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sse.common.Color; import com.sap.sse.gwt.client.controls.listedit.ExpandedListEditorUi; import com.sap.sse.gwt.client.controls.listedit.ListEditorComposite; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/MarkEditDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/MarkEditDialog.java index ca7d454bbb1..6559e8813ff 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/MarkEditDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/MarkEditDialog.java @@ -10,11 +10,11 @@ import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.domain.common.MarkType; -import com.sap.sailing.domain.common.impl.RGBColor; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.shared.MarkDTO; import com.sap.sailing.gwt.ui.shared.racemap.Pattern; import com.sap.sailing.gwt.ui.shared.racemap.Shape; +import com.sap.sse.common.impl.RGBColor; import com.sap.sse.gwt.client.dialog.DataEntryDialog; public class MarkEditDialog extends DataEntryDialog { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/MarkTableWrapper.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/MarkTableWrapper.java index c525a3eee7b..3b3f9cf5dee 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/MarkTableWrapper.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/MarkTableWrapper.java @@ -9,13 +9,13 @@ import com.google.gwt.user.cellview.client.Column; import com.google.gwt.user.cellview.client.TextColumn; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.view.client.SelectionModel; -import com.sap.sailing.domain.common.Color; -import com.sap.sailing.domain.common.impl.AbstractColor; -import com.sap.sailing.domain.common.impl.RGBColor; import com.sap.sailing.gwt.ui.adminconsole.ColorColumn.ColorRetriever; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.shared.MarkDTO; +import com.sap.sse.common.Color; +import com.sap.sse.common.impl.AbstractColor; +import com.sap.sse.common.impl.RGBColor; import com.sap.sse.gwt.client.ErrorReporter; public class MarkTableWrapper> extends TableWrapper { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompetitorSelectionModel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompetitorSelectionModel.java index 5b43f31e1c1..74cda1efb03 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompetitorSelectionModel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompetitorSelectionModel.java @@ -8,10 +8,10 @@ import java.util.Iterator; import java.util.LinkedHashSet; import java.util.Set; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.ColorMap; import com.sap.sailing.domain.common.dto.CompetitorDTO; import com.sap.sailing.domain.common.impl.ColorMapImpl; +import com.sap.sse.common.Color; import com.sap.sse.common.Util; import com.sap.sse.common.filter.Filter; import com.sap.sse.common.filter.FilterSet; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompetitorSelectionProvider.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompetitorSelectionProvider.java index d3566407a78..77a2e991641 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompetitorSelectionProvider.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompetitorSelectionProvider.java @@ -1,7 +1,7 @@ package com.sap.sailing.gwt.ui.client; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.dto.CompetitorDTO; +import com.sap.sse.common.Color; import com.sap.sse.common.filter.Filter; import com.sap.sse.common.filter.FilterSet; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/BoatOverlay.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/BoatOverlay.java index 846572f5bc4..e38a8cd8e75 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/BoatOverlay.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/BoatOverlay.java @@ -7,7 +7,6 @@ import com.google.gwt.maps.client.MapWidget; import com.google.gwt.maps.client.base.LatLng; import com.google.gwt.maps.client.base.Point; import com.google.gwt.maps.client.base.Size; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.LegType; import com.sap.sailing.domain.common.Tack; import com.sap.sailing.domain.common.dto.BoatClassDTO; @@ -16,6 +15,7 @@ import com.sap.sailing.gwt.ui.shared.GPSFixDTO; import com.sap.sailing.gwt.ui.shared.SpeedWithBearingDTO; import com.sap.sailing.gwt.ui.shared.racemap.BoatClassVectorGraphics; import com.sap.sailing.gwt.ui.shared.racemap.CanvasOverlayV3; +import com.sap.sse.common.Color; import com.sap.sse.common.Util; /** diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/CompetitorInfoOverlay.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/CompetitorInfoOverlay.java index 58b3d32d3e0..402fe290882 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/CompetitorInfoOverlay.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/CompetitorInfoOverlay.java @@ -6,9 +6,9 @@ import com.google.gwt.canvas.dom.client.TextMetrics; import com.google.gwt.maps.client.MapWidget; import com.google.gwt.maps.client.base.LatLng; import com.google.gwt.maps.client.base.Point; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.dto.PositionDTO; import com.sap.sailing.gwt.ui.shared.racemap.CanvasOverlayV3; +import com.sap.sse.common.Color; /** * A google map overlay based on a HTML5 canvas for drawing a competitor info on a map at a given position. diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java index cee1cceeb6d..7be2c3b64a1 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java @@ -79,7 +79,6 @@ import com.sap.sailing.domain.common.dto.CompetitorDTO; import com.sap.sailing.domain.common.dto.PositionDTO; import com.sap.sailing.domain.common.impl.BoundsImpl; import com.sap.sailing.domain.common.impl.DegreeBearingImpl; -import com.sap.sailing.domain.common.impl.RGBColor; import com.sap.sailing.domain.common.scalablevalue.impl.ScalableBearing; import com.sap.sailing.gwt.ui.actions.GetPolarAction; import com.sap.sailing.gwt.ui.actions.GetRaceMapDataAction; @@ -122,6 +121,7 @@ import com.sap.sse.common.Util; import com.sap.sse.common.Util.Triple; import com.sap.sse.common.filter.Filter; import com.sap.sse.common.filter.FilterSet; +import com.sap.sse.common.impl.RGBColor; import com.sap.sse.gwt.client.ErrorReporter; import com.sap.sse.gwt.client.async.AsyncActionsExecutor; import com.sap.sse.gwt.client.async.MarkedAsyncCallback; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/IncrementalLeaderboardDTOCloner.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/IncrementalLeaderboardDTOCloner.java index 0df36930d07..9e8b0d8b880 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/IncrementalLeaderboardDTOCloner.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/IncrementalLeaderboardDTOCloner.java @@ -2,7 +2,7 @@ package com.sap.sailing.gwt.ui.server; import com.sap.sailing.domain.common.dto.IncrementalLeaderboardDTO; import com.sap.sailing.domain.common.dto.LeaderboardDTO; -import com.sap.sailing.util.ClonerImpl; +import com.sap.sse.util.ClonerImpl; /** * Uses reflection to clone all properties of a {@link LeaderboardDTO} into a new instance of type {@link IncrementalLeaderboardDTO}. diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/QuickRanksLiveCache.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/QuickRanksLiveCache.java index 7a5a8d78516..1fdf83b3aeb 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/QuickRanksLiveCache.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/QuickRanksLiveCache.java @@ -14,9 +14,9 @@ import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.impl.AbstractRaceChangeListener; import com.sap.sailing.gwt.ui.shared.QuickRankDTO; import com.sap.sailing.server.masterdata.DummyTrackedRace; -import com.sap.sailing.util.SmartFutureCache; -import com.sap.sailing.util.SmartFutureCache.AbstractCacheUpdater; -import com.sap.sailing.util.SmartFutureCache.UpdateInterval; +import com.sap.sse.util.SmartFutureCache; +import com.sap.sse.util.SmartFutureCache.AbstractCacheUpdater; +import com.sap.sse.util.SmartFutureCache.UpdateInterval; /** * Calculating the quick ranks for many clients for a live race is expensive and therefore benefits from consolidation diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index 2cbafc2bc0c..a9be1f8c45a 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -126,7 +126,6 @@ import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.base.impl.SeriesImpl; import com.sap.sailing.domain.base.impl.TeamImpl; import com.sap.sailing.domain.common.Bearing; -import com.sap.sailing.domain.common.CountryCode; import com.sap.sailing.domain.common.DataImportProgress; import com.sap.sailing.domain.common.DetailType; import com.sap.sailing.domain.common.Distance; @@ -408,6 +407,7 @@ import com.sap.sailing.xrr.structureimport.SeriesParameters; import com.sap.sailing.xrr.structureimport.StructureImporter; import com.sap.sailing.xrr.structureimport.buildstructure.SetRacenumberFromSeries; import com.sap.sse.BuildVersion; +import com.sap.sse.common.CountryCode; import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; import com.sap.sse.common.TimeRange; @@ -465,7 +465,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S private final com.sap.sailing.domain.tractracadapter.persistence.DomainObjectFactory tractracDomainObjectFactory; - private final com.sap.sailing.domain.common.CountryCodeFactory countryCodeFactory; + private final com.sap.sse.common.CountryCodeFactory countryCodeFactory; private final Executor executor; @@ -516,7 +516,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S .getTracTracDomainFactory()); tractracMongoObjectFactory = com.sap.sailing.domain.tractracadapter.persistence.MongoObjectFactory.INSTANCE; swissTimingFactory = SwissTimingFactory.INSTANCE; - countryCodeFactory = com.sap.sailing.domain.common.CountryCodeFactory.INSTANCE; + countryCodeFactory = com.sap.sse.common.CountryCodeFactory.INSTANCE; leaderboardDifferenceCacheByIdPair = new LinkedHashMap, IncrementalLeaderboardDTO>(LEADERBOARD_DIFFERENCE_CACHE_SIZE, 0.75f, /* accessOrder */ true) { private static final long serialVersionUID = 3775119859130148488L; @Override @@ -1048,7 +1048,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S result.add(new TracTracRaceRecordDTO(raceRecord.getID(), raceRecord.getEventName(), raceRecord.getName(), raceRecord.getTrackingStartTime().asDate(), raceRecord - .getTrackingEndTime().asDate(), raceRecord.getRaceStartTime().asDate(), + .getTrackingEndTime().asDate(), raceRecord.getRaceStartTime() == null ? null : raceRecord.getRaceStartTime().asDate(), raceRecord.getBoatClassNames(), raceRecord.getRaceStatus(), raceRecord.getRaceVisibility(), raceRecord.getJsonURL().toString(), hasRememberedRegatta(raceRecord.getID()))); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/EventBaseDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/EventBaseDTO.java index 406132491a2..98df1e4a230 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/EventBaseDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/EventBaseDTO.java @@ -148,45 +148,37 @@ public class EventBaseDTO extends NamedDTO implements IsSerializable { * */ public String getStageImageURL() { - final String result; - if (imageURLs.isEmpty()) { - result = null; - } else { - Comparator stageImageComparator = new Comparator() { - @Override - public int compare(String o1, String o2) { - final int result; - if (o1.toLowerCase().contains(STAGE_IMAGE_URL_SUBSTRING_INDICATOR_CASE_INSENSITIVE)) { - if (o2.toLowerCase().contains(STAGE_IMAGE_URL_SUBSTRING_INDICATOR_CASE_INSENSITIVE)) { - result = compareBySize(o1, o2); - } else { - // o1 has stage indicator substring in its URL but o2 doesn't; o1 ranks greater - result = 1; - } - } else { - if (o2.toLowerCase().contains(STAGE_IMAGE_URL_SUBSTRING_INDICATOR_CASE_INSENSITIVE)) { - result = -1; // o1 does not and o2 does have stage indicator substring, so o2 ranks greater - } else { - // both don't have stage indicator; compare by size - result = compareBySize(o1, o2); - } - } - return result; - } - - private int compareBySize(String o1, String o2) { - final int result; - final ImageSize o1Size = getImageSize(o1); - final ImageSize o2Size = getImageSize(o2); - result = (o1Size == null ? 0 : (o1Size.getWidth() * o1Size.getHeight())) - - (o2Size == null ? 0 : (o2Size.getWidth() * o2Size.getHeight())); - return result; - } - }; - List sortedImageURLs = new ArrayList<>(imageURLs); - Collections.sort(sortedImageURLs, stageImageComparator); - result = sortedImageURLs.get(sortedImageURLs.size() - 1); + String result = null; + List imageCandidates = new ArrayList(); + for(String imageUrl: imageURLs) { + if(imageUrl.toLowerCase().contains(STAGE_IMAGE_URL_SUBSTRING_INDICATOR_CASE_INSENSITIVE)) { + imageCandidates.add(imageUrl); + } } + if(imageCandidates.isEmpty()) { + for(String imageUrl: imageURLs) { + if(!imageUrl.toLowerCase().contains(THUMBNAIL_IMAGE_URL_SUBSTRING_INDICATOR_CASE_INSENSITIVE)) { + imageCandidates.add(imageUrl); + } + } + } + if(!imageCandidates.isEmpty()) { + if(imageCandidates.size() == 1) { + result = imageCandidates.get(0); + } else { + Collections.sort(imageCandidates, new Comparator() { + @Override + public int compare(String o1, String o2) { + ImageSize o1Size = getImageSize(o1); + ImageSize o2Size = getImageSize(o2); + return (o1Size == null ? 0 : (o1Size.getWidth() * o1Size.getHeight())) + - (o2Size == null ? 0 : (o2Size.getWidth() * o2Size.getHeight())); + } + }); + result = imageCandidates.get(imageCandidates.size() - 1); + } + } + return result; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/racemap/BoatClassVectorGraphics.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/racemap/BoatClassVectorGraphics.java index 381a2655c89..83f8f46f4e0 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/racemap/BoatClassVectorGraphics.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/racemap/BoatClassVectorGraphics.java @@ -6,9 +6,9 @@ import java.util.Set; import com.google.gwt.canvas.dom.client.Context2d; import com.sap.sailing.domain.common.BoatClassMasterdata; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.LegType; import com.sap.sailing.domain.common.Tack; +import com.sap.sse.common.Color; /** * The base class for boat graphics based on SVG graphics drawn to a HTML5 canvas. diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/racemap/GoogleMapStyleHelper.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/racemap/GoogleMapStyleHelper.java index f366f8c77fb..6af473f0b8d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/racemap/GoogleMapStyleHelper.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/racemap/GoogleMapStyleHelper.java @@ -4,7 +4,7 @@ import com.google.gwt.maps.client.controls.MapTypeStyle; import com.google.gwt.maps.client.maptypes.MapTypeStyleElementType; import com.google.gwt.maps.client.maptypes.MapTypeStyleFeatureType; import com.google.gwt.maps.client.maptypes.MapTypeStyler; -import com.sap.sailing.domain.common.impl.RGBColor; +import com.sap.sse.common.impl.RGBColor; public class GoogleMapStyleHelper { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/SimulatorMap.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/SimulatorMap.java index c7a5f2a81c7..4871b70ff90 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/SimulatorMap.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/SimulatorMap.java @@ -36,7 +36,6 @@ import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.AbsolutePanel; import com.sap.sailing.domain.common.dto.PositionDTO; -import com.sap.sailing.domain.common.impl.RGBColor; import com.sap.sailing.gwt.ui.client.RequiresDataInitialization; import com.sap.sailing.gwt.ui.client.SimulatorServiceAsync; import com.sap.sailing.gwt.ui.client.StringMessages; @@ -54,6 +53,7 @@ import com.sap.sailing.gwt.ui.simulator.util.ColorPaletteGenerator; import com.sap.sailing.gwt.ui.simulator.util.SimulatorResources; import com.sap.sailing.gwt.ui.simulator.windpattern.WindPatternDisplay; import com.sap.sailing.simulator.util.SailingSimulatorConstants; +import com.sap.sse.common.impl.RGBColor; import com.sap.sse.gwt.client.ErrorReporter; import com.sap.sse.gwt.client.controls.busyindicator.SimpleBusyIndicator; import com.sap.sse.gwt.client.player.Timer; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/spectator/LeaderboardGroupPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/spectator/LeaderboardGroupPanel.java index 9aa2f8199e1..ca7cbffd639 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/spectator/LeaderboardGroupPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/spectator/LeaderboardGroupPanel.java @@ -26,7 +26,6 @@ import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.view.client.NoSelectionModel; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.LeaderboardNameConstants; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.dto.FleetDTO; @@ -43,6 +42,7 @@ import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; import com.sap.sailing.gwt.ui.shared.RegattaDTO; import com.sap.sailing.gwt.ui.shared.SeriesDTO; import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO; +import com.sap.sse.common.Color; import com.sap.sse.common.Util; import com.sap.sse.gwt.client.ErrorReporter; import com.sap.sse.gwt.client.player.Timer; diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndLoadingEventsAndRegattas.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndLoadingEventsAndRegattas.java index dcf1669ceb3..720b868c6db 100755 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndLoadingEventsAndRegattas.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndLoadingEventsAndRegattas.java @@ -48,7 +48,6 @@ import com.sap.sailing.domain.base.impl.RaceDefinitionImpl; import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.base.impl.SeriesImpl; import com.sap.sailing.domain.base.impl.VenueImpl; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; @@ -82,6 +81,7 @@ import com.sap.sailing.server.RacingEventService; import com.sap.sailing.server.impl.RacingEventServiceImpl; import com.sap.sailing.server.operationaltransformation.ConnectTrackedRaceToLeaderboardColumn; import com.sap.sailing.server.operationaltransformation.UpdateLeaderboardMaxPointsReason; +import com.sap.sse.common.Color; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboardGroups.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboardGroups.java index d0a685d870c..63f90f5e010 100755 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboardGroups.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboardGroups.java @@ -28,7 +28,6 @@ import com.sap.sailing.domain.base.impl.CompetitorImpl; import com.sap.sailing.domain.base.impl.NationalityImpl; import com.sap.sailing.domain.base.impl.PersonImpl; import com.sap.sailing.domain.base.impl.TeamImpl; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.NoWindException; import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.RegattaNameAndRaceName; @@ -54,6 +53,7 @@ import com.sap.sailing.domain.tracking.impl.EmptyWindStore; import com.sap.sailing.server.RacingEventService; import com.sap.sailing.server.impl.RacingEventServiceImpl; import com.sap.sailing.server.operationaltransformation.UpdateLeaderboardScoreCorrection; +import com.sap.sse.common.Color; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; import com.sap.sse.mongodb.MongoDBService; diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboards.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboards.java index 6c538210dff..d9fa5489325 100755 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboards.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboards.java @@ -23,7 +23,6 @@ import com.sap.sailing.domain.base.impl.DomainFactoryImpl; import com.sap.sailing.domain.base.impl.NationalityImpl; import com.sap.sailing.domain.base.impl.PersonImpl; import com.sap.sailing.domain.base.impl.TeamImpl; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.ScoringSchemeType; import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; @@ -38,6 +37,7 @@ import com.sap.sailing.domain.persistence.impl.MongoObjectFactoryImpl; import com.sap.sailing.domain.test.mock.MockedTrackedRaceWithFixedRank; import com.sap.sailing.domain.test.mock.MockedTrackedRaceWithFixedRankAndManyCompetitors; import com.sap.sailing.domain.tracking.TrackedRace; +import com.sap.sse.common.Color; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java index b04f3db0f20..ba6a79af120 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java @@ -45,7 +45,6 @@ import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.DomainFactory; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; @@ -61,6 +60,7 @@ import com.sap.sailing.domain.persistence.impl.MongoObjectFactoryImpl; import com.sap.sailing.domain.persistence.impl.MongoUtils; import com.sap.sailing.domain.tracking.Wind; import com.sap.sailing.server.impl.RacingEventServiceImpl; +import com.sap.sse.common.Color; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java index 12e94ca9f90..ede401bb4a2 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java @@ -41,7 +41,6 @@ import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Series; import com.sap.sailing.domain.base.impl.FleetImpl; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; @@ -50,6 +49,7 @@ import com.sap.sailing.domain.persistence.impl.FieldNames; import com.sap.sailing.domain.persistence.impl.MongoObjectFactoryImpl; import com.sap.sailing.domain.persistence.impl.MongoUtils; import com.sap.sailing.domain.tracking.Wind; +import com.sap.sse.common.Color; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; diff --git a/java/com.sap.sailing.polars.test/META-INF/MANIFEST.MF b/java/com.sap.sailing.polars.test/META-INF/MANIFEST.MF index cbea442f396..d997f50d628 100644 --- a/java/com.sap.sailing.polars.test/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.polars.test/META-INF/MANIFEST.MF @@ -11,4 +11,6 @@ Require-Bundle: org.hamcrest;bundle-version="1.1.0", org.mockito.mockito-core;bundle-version="1.10.14", org.junit4;bundle-version="4.8.2", com.sap.sailing.domain.test, - com.sap.sse.common + com.sap.sse.common, + com.sap.sailing.domain.tractracadapter, + com.tractrac.clientmodule;bundle-version="3.0.7" diff --git a/java/com.sap.sailing.polars.test/src/com/sap/sailing/polars/test/PolarSheetGenerationTest.java b/java/com.sap.sailing.polars.test/src/com/sap/sailing/polars/test/PolarSheetGenerationTest.java index 5f8de6f45e7..31622df7ab3 100644 --- a/java/com.sap.sailing.polars.test/src/com/sap/sailing/polars/test/PolarSheetGenerationTest.java +++ b/java/com.sap.sailing.polars.test/src/com/sap/sailing/polars/test/PolarSheetGenerationTest.java @@ -29,7 +29,6 @@ import com.sap.sailing.domain.base.impl.CourseImpl; import com.sap.sailing.domain.base.impl.RaceDefinitionImpl; import com.sap.sailing.domain.base.impl.TeamImpl; import com.sap.sailing.domain.base.impl.WaypointImpl; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.PolarSheetGenerationSettings; import com.sap.sailing.domain.common.PolarSheetsData; import com.sap.sailing.domain.common.PolarSheetsHistogramData; @@ -64,6 +63,7 @@ import com.sap.sailing.polars.data.PolarFix; import com.sap.sailing.polars.data.impl.DataPointWithOriginInfoImpl; import com.sap.sailing.polars.generation.PolarSheetGenerator; import com.sap.sailing.polars.generation.PolarSheetHistogramBuilder; +import com.sap.sse.common.Color; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; diff --git a/java/com.sap.sailing.polars.test/src/com/sap/sailing/polars/test/WindSpeedAndAngleEstimatorTest.java b/java/com.sap.sailing.polars.test/src/com/sap/sailing/polars/test/WindSpeedAndAngleEstimatorTest.java old mode 100644 new mode 100755 index 79fe7beebcb..42f5f6d66eb --- a/java/com.sap.sailing.polars.test/src/com/sap/sailing/polars/test/WindSpeedAndAngleEstimatorTest.java +++ b/java/com.sap.sailing.polars.test/src/com/sap/sailing/polars/test/WindSpeedAndAngleEstimatorTest.java @@ -54,7 +54,6 @@ public class WindSpeedAndAngleEstimatorTest { assertThat(result.getObject().getBearing().getDegrees(), closeTo(47.5, ERROR)); assertThat(result.getConfidence(), closeTo(0.5, ERROR)); - result = estimator.getAverageTrueWindSpeedAndAngle(new KnotSpeedImpl(4.25)); assertThat(result.getObject().getKnots(), closeTo(6.5, ERROR)); assertThat(result.getObject().getBearing().getDegrees(), closeTo(47.25, ERROR)); @@ -74,7 +73,6 @@ public class WindSpeedAndAngleEstimatorTest { assertThat(result.getObject().getKnots(), closeTo(7, ERROR)); assertThat(result.getObject().getBearing().getDegrees(), closeTo(47.5, ERROR)); assertThat(result.getConfidence(), closeTo(0.25, ERROR)); - } /** @@ -109,7 +107,6 @@ public class WindSpeedAndAngleEstimatorTest { assertThat(result.getObject().getBearing().getDegrees(), closeTo(47.5, ERROR)); assertThat(result.getConfidence(), closeTo(0.5, ERROR)); - result = estimator.getAverageTrueWindSpeedAndAngle(new KnotSpeedImpl(4.25)); assertThat(result.getObject().getKnots(), closeTo(5.5, ERROR)); assertThat(result.getObject().getBearing().getDegrees(), closeTo(47.25, ERROR)); @@ -129,7 +126,6 @@ public class WindSpeedAndAngleEstimatorTest { assertThat(result.getObject().getKnots(), closeTo(5, ERROR)); assertThat(result.getObject().getBearing().getDegrees(), closeTo(47.5, ERROR)); assertThat(result.getConfidence(), closeTo(0.25, ERROR)); - } @Test @@ -151,7 +147,6 @@ public class WindSpeedAndAngleEstimatorTest { result = estimator.getAverageTrueWindSpeedAndAngle(new KnotSpeedImpl(5.5)); assertThat(result, nullValue()); - } @Test @@ -175,7 +170,6 @@ public class WindSpeedAndAngleEstimatorTest { assertThat(result.getObject().getKnots(), closeTo(6.5, ERROR)); assertThat(result.getObject().getBearing().getDegrees(), closeTo(47.25, ERROR)); assertThat(result.getConfidence(), closeTo(0.55, ERROR)); - } @Test @@ -263,5 +257,4 @@ public class WindSpeedAndAngleEstimatorTest { assertThat(result.getObject().getBearing().getDegrees(), closeTo(47.5, ERROR)); assertThat(result.getConfidence(), closeTo(0.455555, ERROR)); } - } diff --git a/java/com.sap.sailing.polars.test/src/com/sap/sailing/polars/windestimation/test/TestWindEstimationFromManeuversOnAFew505Races.java b/java/com.sap.sailing.polars.test/src/com/sap/sailing/polars/windestimation/test/TestWindEstimationFromManeuversOnAFew505Races.java new file mode 100755 index 00000000000..e4e19ec6fff --- /dev/null +++ b/java/com.sap.sailing.polars.test/src/com/sap/sailing/polars/windestimation/test/TestWindEstimationFromManeuversOnAFew505Races.java @@ -0,0 +1,93 @@ +package com.sap.sailing.polars.windestimation.test; + +import static org.junit.Assert.assertEquals; + +import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.text.ParseException; +import java.util.concurrent.Executors; + +import org.junit.Ignore; +import org.junit.Test; + +import com.sap.sailing.domain.test.OnlineTracTracBasedTest; +import com.sap.sailing.domain.tracking.Wind; +import com.sap.sailing.domain.tracking.impl.ScalableWind; +import com.sap.sailing.domain.tractracadapter.ReceiverType; +import com.sap.sailing.polars.impl.PolarDataServiceImpl; +import com.sap.sailing.polars.regression.NotEnoughDataHasBeenAddedException; +import com.sap.sailing.polars.windestimation.ManeuverBasedWindEstimationTrackImpl; +import com.tractrac.model.lib.api.event.CreateModelException; +import com.tractrac.subscription.lib.api.SubscriberInitializationException; + +public class TestWindEstimationFromManeuversOnAFew505Races extends OnlineTracTracBasedTest { + + public TestWindEstimationFromManeuversOnAFew505Races() throws URISyntaxException, MalformedURLException { + super(); + } + + public void setUp(final String fileBaseName) throws MalformedURLException, IOException, InterruptedException, URISyntaxException, + ParseException, SubscriberInitializationException, CreateModelException { + super.setUp(); + URI storedUri = new URI("file:///"+new File("../com.sap.sailing.domain.test/resources/"+fileBaseName+".mtb").getCanonicalPath().replace('\\', '/')); + super.setUp(new URL("file:///"+new File("../com.sap.sailing.domain.test/resources/"+fileBaseName+".txt").getCanonicalPath()), + /* liveUri */ null, /* storedUri */ storedUri, + new ReceiverType[] { ReceiverType.RACECOURSE, ReceiverType.RAWPOSITIONS }); // only the tracks; no mark positions, no wind, no mark passings + } + + @Test + public void testWindEstimationFromManeuversOn505KW2011Race2() throws MalformedURLException, IOException, + InterruptedException, URISyntaxException, ParseException, SubscriberInitializationException, + CreateModelException, NotEnoughDataHasBeenAddedException { + setUp("event_20110609_KielerWoch-505_Race_2"); + Wind average = getManeuverBasedAverageWind(); + assertEquals(235, average.getFrom().getDegrees(), 5.0); // wind in this race was from 075deg on average + } + + @Ignore("The test is currently still red because the clustering doesn't work; see bug 1562 comment #8") + @Test + public void testWindEstimationFromManeuversOn505KW2011Race3() throws MalformedURLException, IOException, + InterruptedException, URISyntaxException, ParseException, SubscriberInitializationException, + CreateModelException, NotEnoughDataHasBeenAddedException { + setUp("event_20110609_KielerWoch-505_Race_3"); + Wind average = getManeuverBasedAverageWind(); + assertEquals(245, average.getFrom().getDegrees(), 5.0); // wind in this race was from 075deg on average + } + + @Ignore("The test is currently still red because the clustering doesn't work; see bug 1562 comment #8") + @Test + public void testWindEstimationFromManeuversOn505KW2011Race4() throws MalformedURLException, IOException, + InterruptedException, URISyntaxException, ParseException, SubscriberInitializationException, + CreateModelException, NotEnoughDataHasBeenAddedException { + setUp("event_20110609_KielerWoch-505_Race_4"); + Wind average = getManeuverBasedAverageWind(); + assertEquals(275, average.getFrom().getDegrees(), 5.0); // wind in this race was from 075deg on average + } + + private Wind getManeuverBasedAverageWind() throws NotEnoughDataHasBeenAddedException { + ManeuverBasedWindEstimationTrackImpl windTrack = new ManeuverBasedWindEstimationTrackImpl(new PolarDataServiceImpl(Executors.newFixedThreadPool(4)), + getTrackedRace(), /* millisecondsOverWhichToAverage */ 30000, /* waitForLatest */ true); + ScalableWind windSum = null; + int count = 0; + windTrack.lockForRead(); + try { + for (Wind wind : windTrack.getFixes()) { + final ScalableWind scalableWind = new ScalableWind(wind, /* useSpeed */ true); + if (windSum == null) { + windSum = scalableWind; + } else { + windSum = windSum.add(scalableWind); + } + count++; + } + } finally { + windTrack.unlockAfterRead(); + } + Wind average = windSum.divide(count); + return average; + } +} diff --git a/java/com.sap.sailing.polars/META-INF/MANIFEST.MF b/java/com.sap.sailing.polars/META-INF/MANIFEST.MF index aee02af7ad4..5b89143f5c8 100644 --- a/java/com.sap.sailing.polars/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.polars/META-INF/MANIFEST.MF @@ -19,7 +19,9 @@ Require-Bundle: com.sap.sailing.domain, com.sap.sse.datamining, com.sap.sse.datamining.shared;bundle-version="1.0.0", - com.sap.sse.common + com.sap.sse.common, + com.sap.sse, + com.sap.sse.shared.android Import-Package: com.sap.sailing.util, com.sap.sse.common diff --git a/java/com.sap.sailing.polars/src/com/sap/sailing/polars/impl/PolarDataServiceImpl.java b/java/com.sap.sailing.polars/src/com/sap/sailing/polars/impl/PolarDataServiceImpl.java index 8a2faf779cc..cc9f52f887c 100755 --- a/java/com.sap.sailing.polars/src/com/sap/sailing/polars/impl/PolarDataServiceImpl.java +++ b/java/com.sap.sailing.polars/src/com/sap/sailing/polars/impl/PolarDataServiceImpl.java @@ -27,7 +27,7 @@ import com.sap.sailing.polars.data.PolarFix; import com.sap.sailing.polars.generation.PolarSheetGenerator; import com.sap.sailing.polars.mining.PolarDataMiner; import com.sap.sailing.polars.regression.NotEnoughDataHasBeenAddedException; -import com.sap.sailing.util.SmartFutureCache; +import com.sap.sse.util.SmartFutureCache; /** * Uses two chained {@link SmartFutureCache}s. One to store {@link PolarFix}es extracted from {@link TrackedRace}s and @@ -52,7 +52,7 @@ public class PolarDataServiceImpl implements PolarDataService { public SpeedWithConfidence getSpeed(BoatClass boatClass, Speed windSpeed, Bearing trueWindAngle) throws NotEnoughDataHasBeenAddedException { return polarDataMiner.estimateBoatSpeed(boatClass, windSpeed, trueWindAngle); } - + @Override public Set> getAverageTrueWindSpeedAndAngleCandidates(BoatClass boatClass, Speed speedOverGround, LegType legType, Tack tack) { @@ -65,13 +65,11 @@ public class PolarDataServiceImpl implements PolarDataService { // corresponding angle Set> resultSet = new HashSet<>(); - int tackFactor = (tack.equals(Tack.PORT)) ? -1 : 1; + final int tackFactor = (tack.equals(Tack.PORT)) ? -1 : 1; if (legType.equals(LegType.UPWIND)) { CubicEquation upWindEquation = new CubicEquation(0.0002, -0.0245, 0.7602, -0.0463-speedOverGround.getKnots()); int angle = 49 * tackFactor; solveAndAddResults(resultSet, upWindEquation, angle); - - } else if (legType.equals(LegType.DOWNWIND)) { CubicEquation downWindEquation = new CubicEquation(0.0003, -0.0373, 1.5213, -2.1309-speedOverGround.getKnots()); int angle = 30 * tackFactor; diff --git a/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/IncrementalRegressionProcessor.java b/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/IncrementalRegressionProcessor.java index 5690dde1e2f..054ad5b5842 100755 --- a/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/IncrementalRegressionProcessor.java +++ b/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/IncrementalRegressionProcessor.java @@ -204,7 +204,6 @@ public class IncrementalRegressionProcessor implements Processor estimatedSpeed = estimateBoatSpeed(boatClass, windSpeed, angleToTheWind).getSpeedWithConfidence(); - SpeedWithBearing speedWithBearing = new KnotSpeedWithBearingImpl(estimatedSpeed.getObject().getKnots(), - angleToTheWind); + SpeedWithBearing speedWithBearing = new KnotSpeedWithBearingImpl(estimatedSpeed.getObject().getKnots(), angleToTheWind); return new SpeedWithBearingWithConfidenceImpl(speedWithBearing, estimatedSpeed.getConfidence(), null); } diff --git a/java/com.sap.sailing.polars/src/com/sap/sailing/polars/regression/BoatSpeedEstimator.java b/java/com.sap.sailing.polars/src/com/sap/sailing/polars/regression/BoatSpeedEstimator.java index f54f1bc63a0..8c7e9203674 100644 --- a/java/com.sap.sailing.polars/src/com/sap/sailing/polars/regression/BoatSpeedEstimator.java +++ b/java/com.sap.sailing.polars/src/com/sap/sailing/polars/regression/BoatSpeedEstimator.java @@ -6,8 +6,8 @@ import java.io.Serializable; import com.sap.sailing.domain.common.Speed; import com.sap.sailing.domain.common.impl.KnotSpeedImpl; import com.sap.sailing.polars.mining.IncrementalRegressionProcessor; -import com.sap.sailing.util.impl.LockUtil; -import com.sap.sailing.util.impl.NamedReentrantReadWriteLock; +import com.sap.sse.concurrent.LockUtil; +import com.sap.sse.concurrent.NamedReentrantReadWriteLock; /** * Supplies incremental arithmetic mean for confidence and speed. diff --git a/java/com.sap.sailing.polars/src/com/sap/sailing/polars/regression/impl/WindSpeedAndAngleEstimator.java b/java/com.sap.sailing.polars/src/com/sap/sailing/polars/regression/impl/WindSpeedAndAngleEstimator.java index 3cde6f79ee2..99a5da6472d 100644 --- a/java/com.sap.sailing.polars/src/com/sap/sailing/polars/regression/impl/WindSpeedAndAngleEstimator.java +++ b/java/com.sap.sailing.polars/src/com/sap/sailing/polars/regression/impl/WindSpeedAndAngleEstimator.java @@ -27,7 +27,6 @@ public class WindSpeedAndAngleEstimator { this(averageBoatSpeedAndCourseForWindSpeed, DEFAULT_MAX_DISTANCE_TO_SAMPLING_POINT); } - /** * * @param averageBoatSpeedAndCourseForWindSpeed @@ -126,7 +125,6 @@ public class WindSpeedAndAngleEstimator { return resultCandidates; } - /** * Confidence will be halved in situations where there the requested speed does not lie between any sampling points. * The speed and angle values are equal to the sampling point values. diff --git a/java/com.sap.sailing.polars/src/com/sap/sailing/polars/windestimation/ManeuverBasedWindEstimationTrackImpl.java b/java/com.sap.sailing.polars/src/com/sap/sailing/polars/windestimation/ManeuverBasedWindEstimationTrackImpl.java index f99318fcf45..0e7c5a2830b 100755 --- a/java/com.sap.sailing.polars/src/com/sap/sailing/polars/windestimation/ManeuverBasedWindEstimationTrackImpl.java +++ b/java/com.sap.sailing.polars/src/com/sap/sailing/polars/windestimation/ManeuverBasedWindEstimationTrackImpl.java @@ -1,21 +1,46 @@ package com.sap.sailing.polars.windestimation; +import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.util.Collections; import java.util.HashMap; import java.util.Map; -import java.util.Map.Entry; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; -import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.SpeedWithBearingWithConfidence; +import com.sap.sailing.domain.base.Waypoint; +import com.sap.sailing.domain.base.impl.SpeedWithBearingWithConfidenceImpl; +import com.sap.sailing.domain.common.Bearing; +import com.sap.sailing.domain.common.Distance; +import com.sap.sailing.domain.common.DoublePair; import com.sap.sailing.domain.common.LegType; +import com.sap.sailing.domain.common.ManeuverType; +import com.sap.sailing.domain.common.Position; +import com.sap.sailing.domain.common.Speed; +import com.sap.sailing.domain.common.SpeedWithBearing; import com.sap.sailing.domain.common.Tack; +import com.sap.sailing.domain.common.impl.DegreeBearingImpl; +import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl; +import com.sap.sailing.domain.common.scalablevalue.impl.ScalableBearing; +import com.sap.sailing.domain.common.scalablevalue.impl.ScalableSpeed; import com.sap.sailing.domain.tracking.Maneuver; import com.sap.sailing.domain.tracking.TrackedRace; +import com.sap.sailing.domain.tracking.Wind; +import com.sap.sailing.domain.tracking.impl.WindImpl; import com.sap.sailing.domain.tracking.impl.WindTrackImpl; import com.sap.sailing.polars.PolarDataService; import com.sap.sailing.polars.regression.NotEnoughDataHasBeenAddedException; import com.sap.sse.common.TimePoint; +import com.sap.sse.common.Util; +import com.sap.sse.common.Util.Pair; +import com.sap.sse.common.Util.Triple; import com.sap.sse.common.impl.MillisecondsTimePoint; +import com.sap.sse.util.kmeans.Cluster; +import com.sap.sse.util.kmeans.KMeansMappingClusterer; /** * Implements a wind estimation based on maneuver classifications. @@ -31,52 +56,458 @@ public class ManeuverBasedWindEstimationTrackImpl extends WindTrackImpl { * default and should be superseded by other wind sources easily. */ private static final double DEFAULT_BASE_CONFIDENCE = 0.01; + + /** + * We're trying to find the jibe cluster based on a candidate for the tack cluster. This constant tells how many degrees + * the jibe cluster may be off from the reversed tack cluster's centroid in order to be accepted as jibe cluster candidate. + */ + private static final double THRESHOLD_OPPOSITE_CLUSTER_DIFFERENCE_DEGREES = 20; private final PolarDataService polarService; private final TrackedRace trackedRace; - public ManeuverBasedWindEstimationTrackImpl(PolarDataService polarService, TrackedRace trackedRace, long millisecondsOverWhichToAverage) + /** + * Keeps the clusters that were used during the last {@link #analyzeRace(boolean)} run; this is for debugging, mostly, + * and could be removed/commented again when this class works as expected. + */ + private final Set> clusters; + + /** + * References one element of {@link #clutsers} that was selected as the tack cluster; this is for debugging, mostly, + * and could be removed/commented again when this class works as expected. + */ + private final Cluster tackCluster; + + /** + * References one element of {@link #clusters} that was selected as the jibe cluster; this is for debugging, mostly, + * and could be removed/commented again when this class works as expected. + */ + private final Cluster jibeCluster; + + public ManeuverBasedWindEstimationTrackImpl(PolarDataService polarService, TrackedRace trackedRace, long millisecondsOverWhichToAverage, boolean waitForLatest) throws NotEnoughDataHasBeenAddedException { super(millisecondsOverWhichToAverage, DEFAULT_BASE_CONFIDENCE, /* useSpeed */ false, /* nameForReadWriteLock */ ManeuverBasedWindEstimationTrackImpl.class.getName()); this.polarService = polarService; this.trackedRace = trackedRace; - analyzeRace(); + Triple>, + Cluster, + Cluster> clusterStructure = analyzeRace(waitForLatest); + clusters = clusterStructure.getA(); + tackCluster = clusterStructure.getB(); + jibeCluster = clusterStructure.getC(); } /** - * Fetches all the race's maneuvers and tries to find the tacks and jibes. For each such maneuver identified, a wind fix - * will be created based on the average COG into and out of the maneuver. + * Collects data about a maneuver that will be used to assign probabilities for maneuver types such as tack or + * jibe, looking at a larger set of such objects and finding the most probable overall solution. + * + * @author Axel Uhl (D043530) + * */ - private void analyzeRace() throws NotEnoughDataHasBeenAddedException { - final Map maneuvers = getAllManeuvers(); - for (final Entry maneuverAndBoatClass : maneuvers.entrySet()) { - // Now for each maneuver's starting speed (speed into the maneuver) get the approximated - // wind speed and direction assuming average upwind / downwind performance based on the polar service. - // TODO continue here, asking the polarService for the wind speed based on boat speed, leg type and tack - for (LegType legType : new LegType[] { LegType.UPWIND, LegType.DOWNWIND }) { - for (Tack tack : new Tack[] { Tack.PORT, Tack.STARBOARD }) { - polarService.getAverageTrueWindSpeedAndAngleCandidates(maneuverAndBoatClass.getValue(), - maneuverAndBoatClass.getKey().getSpeedWithBearingBefore(), - legType, tack); + public class ManeuverClassification { + private final Competitor competitor; + private final TimePoint timePoint; + private final Position position; + /** + * Course change implied by the maneuver + */ + private final double maneuverAngleDeg; + private final SpeedWithBearing speedAtManeuverStart; + private final Bearing middleManeuverCourse; + private final Distance maneuverLoss; + private final SpeedWithBearingWithConfidence mostLikelyTackTwsTwa; + private final SpeedWithBearingWithConfidence mostLikelyJibeTwsTwa; + + protected ManeuverClassification(Competitor competitor, Maneuver maneuver) { + super(); + this.competitor = competitor; + this.timePoint = maneuver.getTimePoint(); + this.position = maneuver.getPosition(); + this.maneuverAngleDeg = maneuver.getDirectionChangeInDegrees(); + this.speedAtManeuverStart = maneuver.getSpeedWithBearingBefore(); + this.middleManeuverCourse = maneuver.getSpeedWithBearingBefore().getBearing().middle(maneuver.getSpeedWithBearingAfter().getBearing()); + this.maneuverLoss = maneuver.getManeuverLoss(); + this.mostLikelyTackTwsTwa = getClosestTwaTws(ManeuverType.TACK); + this.mostLikelyJibeTwsTwa = getClosestTwaTws(ManeuverType.JIBE); + } + + private SpeedWithBearingWithConfidence getClosestTwaTws(ManeuverType type) { + assert type == ManeuverType.TACK || type == ManeuverType.JIBE; + double minDiff = Double.MAX_VALUE; + SpeedWithBearingWithConfidence closestTwsTwa = null; + for (SpeedWithBearingWithConfidence trueWindSpeedAndAngle : polarService.getAverageTrueWindSpeedAndAngleCandidates( + getCompetitor().getBoat().getBoatClass(), getSpeedAtManeuverStart(), + type == ManeuverType.TACK ? LegType.UPWIND : LegType.DOWNWIND, + type == ManeuverType.TACK ? getManeuverAngleDeg() >= 0 ? Tack.PORT : Tack.STARBOARD + : getManeuverAngleDeg() >= 0 ? Tack.STARBOARD : Tack.PORT)) { + double diff = Math.abs(trueWindSpeedAndAngle.getObject().getBearing().getDegrees()*2)-Math.abs(getManeuverAngleDeg()); + if (diff < minDiff) { + minDiff = diff; + closestTwsTwa = trueWindSpeedAndAngle; } } + return closestTwsTwa; + } + + public Competitor getCompetitor() { + return competitor; + } + + public TimePoint getTimePoint() { + return timePoint; + } + + public Position getPosition() { + return position; + } + + public double getManeuverAngleDeg() { + return maneuverAngleDeg; + } + + public SpeedWithBearing getSpeedAtManeuverStart() { + return speedAtManeuverStart; + } + + public Bearing getMiddleManeuverCourse() { + return middleManeuverCourse; + } + + public SpeedWithBearingWithConfidence getEstimatedWindSpeedAndBearing(ManeuverType maneuverType) { + Pair> likelihoodAndTWSBasedOnSpeedAndAngle = getLikelihoodAndTWSBasedOnSpeedAndAngle(maneuverType); + final SpeedWithBearingWithConfidenceImpl result; + // if no reasonable wind speed was found for the maneuver speed, return null + if (likelihoodAndTWSBasedOnSpeedAndAngle.getB() == null) { + result = null; + } else { + final Bearing bearing; + final double confidence = likelihoodAndTWSBasedOnSpeedAndAngle.getB().getConfidence() + * likelihoodAndTWSBasedOnSpeedAndAngle.getA(); + final Speed speed = likelihoodAndTWSBasedOnSpeedAndAngle.getB().getObject(); + switch (maneuverType) { + case TACK: + bearing = getMiddleManeuverCourse().reverse(); + break; + case JIBE: + bearing = getMiddleManeuverCourse(); + break; + default: + throw new IllegalStateException("Found leg type " + maneuverType + " but can only handle " + + LegType.UPWIND.name() + " and " + LegType.DOWNWIND.name()); + } + result = new SpeedWithBearingWithConfidenceImpl(new KnotSpeedWithBearingImpl(speed.getKnots(), + bearing), confidence, + /* relativeTo */null); + } + return result; + } + + public Distance getManeuverLoss() { + return maneuverLoss; + } + + /** + * Computes the likelihood that the maneuver represented by this object is of the type requested. The polar + * service may offer more than one possible wind condition for the given speed. In this case, the true wind angle that + * fits the actual {@link #getManeuverAngleDeg() maneuver angle} better is chosen to judge how close the maneuver is to + * the expected angle. The likelihood as well as the estimated true wind speed are returned. + * + * @return a value between 0 and 1 + */ + public Pair> getLikelihoodAndTWSBasedOnSpeedAndAngle(final ManeuverType type) { + assert type == ManeuverType.TACK || type == ManeuverType.JIBE; + SpeedWithBearingWithConfidence closestTwsTwa = type == ManeuverType.TACK ? this.mostLikelyTackTwsTwa : this.mostLikelyJibeTwsTwa; + final Pair> result; + if (closestTwsTwa == null) { + result = new Pair<>(0.0, null); + } else { + double minDiffDeg = Math.abs(Math.abs(Math.abs(closestTwsTwa.getObject().getBearing().getDegrees() * 2) + - Math.abs(getManeuverAngleDeg()))); + // TODO ask polar service how likely this is because the polar service knows how narrow or wide the + // maneuver angle range is + result = new Pair<>(1. / (1. + (minDiffDeg / 10.) * (minDiffDeg / 10.)), closestTwsTwa); + } + return result; + } + + @Override + public String toString() { + return format(this, /* id */ null); + } + + } + + public String getManeuverClassificationColumnHeaders() { + return "datapoint\tcompetitor\ttimePoint\tangleDeg\tboatSpeedKn\tcogDeg\tmiddleManeuverCourse\tlossM"; + } + + public String getManeuverClassificationColumnTypes() { + return "infoitem\tstring\tdate\tfloat\tfloat\tfloat\tfloat\tfloat"; + } + + public String format(ManeuverClassification mc, String id) { + DateFormat df = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss"); + final String prefix = mc.getCompetitor().getName() + "\t" + df.format(mc.getTimePoint().asDate()) + "\t" + mc.getManeuverAngleDeg() + + "\t" + mc.getSpeedAtManeuverStart().getKnots() + "\t" + + mc.getSpeedAtManeuverStart().getBearing().getDegrees(); + final StringBuilder result = new StringBuilder(); + if (id != null) { + result.append("ID"); + result.append(id); + result.append('\t'); + } + result.append(prefix); + result.append("\t"); + result.append(mc.getMiddleManeuverCourse().getDegrees()); + result.append("\t"); + result.append(mc.getManeuverLoss() == null ? 0.0 : mc.getManeuverLoss().getMeters()); + return result.toString(); + } + + /** + * Fetches all the race's maneuvers and tries to find the tacks and jibes. For each such maneuver identified, a wind + * fix will be created based on the average COG into and out of the maneuver. + *

+ * + * All maneuvers of all competitors between start and end time are considered (usually race start and end for that + * competitor, but may be the start of tracking, e.g., in case no course is set, and current time in case no finish + * line mark passing is found for that competitor yet). Clustering the candidates by average COG should give two + * clusters that are approximately 180deg apart from each other: one with the tacks and one with the jibes. A bunch + * of other clusters will emerge for head-up/bear-away maneuvers with small course changes (one for each actual + * tack/leg type combination), making them very unlikely candidates for maneuvers that have distinct wide expected + * maneuver angles. Two more clusters typically emerge that hold the mark rounding maneuvers that have maneuver + * angles similar to that of a typical tack and that would result in estimated wind directions offset by + * approximately 90deg from the correct wind direction. Altogether this makes for eight expected clusters, two of + * which are the interesting ones, four of which are expected to not contain likely candidates for the wide-angle + * maneuvers (head-up/bear-away clusters), and the mark rounding clusters which to each other also tend to have a + * 180deg offset. + *

+ * + * Now for each cluster we check if it's the tack cluster. The tack cluster shows some characteristic features that + * make it a little easier to identify: its maneuver angle is in most cases wider than that of the jibes, resulting + * in two well-defined maneuver angle clusters (one for port-to-starboard and one for starboard-to-port tacks). + * There are usually no other maneuvers with similar middle COG because boats can't sail straight against the wind. + *

+ * + * We evaluate each cluster's likelihood of being the tack cluster by for each of its maneuvers adding up the + * likelihood of that maneuver being a tack, solely based on its maneuver angle, as judged by the polar service. If + * a cluster exists that has approximately the opposite average middle COG (the jibe cluster candidate), the + * likelihoods for its maneuvers being a jibe are added. (TODO adding is statistically not adequate here; however, + * multiplying hundreds if not thousands of probability values would easily lead to a double value going to 0.0 + * quickly. But is adding adequate to estimate the cluster having the maximum likelihood of being the tack cluster? + * We'd only need a monotonous function.) Finally, the resulting likelihood is multiplied by how likely the speed + * ratio between the tack and jibe cluster candidates is, based on the polar diagram. For this task, the cluster's + * maneuvers' average speed (weighted by each maneuver's likelihood of being a tack) is divided by that of the jibe + * cluster's maneuvers' average speed (weighted by each maneuver's likelihood of being a jibe) and assigned a + * likelihood by the polar service. + *

+ * + * The cluster that has the highest likelihood of being the tack cluster is selected. The confidence of the choice + * depends on how clearly this cluster was the favorite among all clusters. For each of its maneuvers a wind fix is + * generated with a confidence defined by the confidence of having picked the correct cluster as the tack cluster, + * multiplied with the likelihood of the maneuver being a tack (as judged by the polar service). Similarly, each + * maneuver from the jibe cluster is turned into a wind fix whose confidence results from the likelihood of the + * maneuver being a jibe (based on the polar service's judgement) and the general confidence of the correct jibe + * cluster having been selected. + *

+ * + * One benefit of looking primarily for the tacks is that boats cannot sail straight against the wind. Therefore, + * there usually are almost no maneuvers that have the same middle COG with a maneuver angle that resembles that of + * the other maneuvers in the cluster. This way, the tack cluster will show two cleanly separated clusters along the + * maneuver angle dimension that show low variance each, compared to all other clusters. + *

+ * + * TODO with enough candidates at hand, apply temporal and spatial segmentation to account for heterogeneous wind fields + */ + private Triple>, + Cluster, + Cluster> analyzeRace(boolean waitForLatest) throws NotEnoughDataHasBeenAddedException { + final Map maneuvers = getAllManeuvers(waitForLatest); + // cluster into eight clusters by middle COG first, then aggregate tack likelihoods for each, and jibe likelihoods for opposite cluster + final int numberOfClusters = 8; + KMeansMappingClusterer clusterer = + new KMeansMappingClusterer<>(numberOfClusters, + getManeuverClassifications(maneuvers), + (mc)->new ScalableBearing(mc.getMiddleManeuverCourse()), // maps maneuver classification to cluster metric + // use an evenly distributed set of cluster seeds for clustering wind direction estimations + IntStream.range(0, numberOfClusters).mapToObj((i)->new DegreeBearingImpl(((double) i)*360./(double) numberOfClusters))); + final Set> clusters = clusterer.getClusters(); + assert maneuvers.size() == clusters.stream().map((c)->c.size()).reduce((s1, s2)->s1+s2).get(); + final Set, Double>> clustersAndLikelihoodOfBeingTackCluster = + clusters.stream().map((c)->new Pair<>(c, getLikelihoodIsTackCluster(c, clusters))).collect(Collectors.toSet()); + // find most likely tack cluster, based on proximity of maneuver angles in cluster and opposite cluster as well as the speed ratio + // between the cluster and its opposite jibe cluster candidate + Pair, Double> dominantClusterAndLikelihoodOfBeingTackCluster = + clustersAndLikelihoodOfBeingTackCluster.stream().max( + (a, b)->(int) Math.signum(a.getB() - b.getB())).get(); + addWindFixes(dominantClusterAndLikelihoodOfBeingTackCluster.getA(), ManeuverType.TACK); + Cluster jibeCluster = getOppositeCluster(dominantClusterAndLikelihoodOfBeingTackCluster.getA(), clusters); + if (jibeCluster != null) { + addWindFixes(jibeCluster, ManeuverType.JIBE); + } + return new Triple<>(clusters, dominantClusterAndLikelihoodOfBeingTackCluster.getA(), jibeCluster); + } + + private void addWindFixes( + Cluster dominantClusterAndLikelihoodOfBeingTackCluster, + final ManeuverType maneuverType) { + // TODO see bug 1562 comment #8: use WindWithConfidenceImpl internally and implement WindTrack.getAveragedWindWithConfidence + for (ManeuverClassification mc : dominantClusterAndLikelihoodOfBeingTackCluster) { + final SpeedWithBearingWithConfidence estimatedWindSpeedAndBearing = mc.getEstimatedWindSpeedAndBearing(maneuverType); + if (estimatedWindSpeedAndBearing != null) { + Wind windFromTack = new WindImpl(mc.getPosition(), mc.getTimePoint(), estimatedWindSpeedAndBearing.getObject()); + add(windFromTack); + } } } + + /** + * For the tackClusterCandidate add up the likelihoods for each maneuver contained that it is a tack. + * If an opposite jibe cluster is found whose centroid middle COG is closer than + * {@link #THRESHOLD_OPPOSITE_CLUSTER_DIFFERENCE_DEGREES} degrees to the expected value, its maneuvers are assessed + * as jibes and their probabilities are added, making the tackClusterCandidate more likely as there are + * more likely jibe candidates in the jibe cluster candidate. + *

+ * + * If a jibe cluster candidate is found, the resulting number is scaled by the likelihood that the average speed + * difference (weighted by the likelihood of being the expected maneuver type) between tack and jibe cluster makes + * sense. Otherwise, the value is scaled down by a factor of .25 as a penalty for not having found a jibe cluster. + * + * @return not a 0..1 likelihood but some scaled value that can grow beyond 1 and represents the sum for all + * relevant tackClusterCandidate maneuvers' likelihood that they are a tack, added to the + * likelihood sum for an opposite cluster that its maneuvers are jibes, scaled by the probability that the + * speed ratio between tack and jibe cluster makes sense (or .25 in case there is no jibe cluster candidate + * found within the threshold). + */ + private double getLikelihoodIsTackCluster(Cluster tackClusterCandidate, + Set> clusters) { + double tackClusterLikelihood = 0; + for (ManeuverClassification mc : tackClusterCandidate) { + tackClusterLikelihood += mc.getLikelihoodAndTWSBasedOnSpeedAndAngle(ManeuverType.TACK).getA(); + } + // TODO the cluster is more likely a tack cluster if two maneuver angle clusters are found that have small variance (no "into-the-wind" maneuvers other than tacks) + Cluster jibeClusterCandidate = getOppositeCluster(tackClusterCandidate, clusters); + final double speedMatchFactor; + double jibeClusterLikelihood = 0; + if (jibeClusterCandidate != null) { + for (ManeuverClassification mc : jibeClusterCandidate) { + jibeClusterLikelihood += mc.getLikelihoodAndTWSBasedOnSpeedAndAngle(ManeuverType.JIBE).getA(); + } + speedMatchFactor = getLikelihoodTackJibeSpeedRatio(tackClusterCandidate, jibeClusterCandidate); + } else { + speedMatchFactor = .25; // no jibe cluster found; penalize for not being able to compare average speeds between tacks and jibes + } + return speedMatchFactor * tackClusterLikelihood * jibeClusterLikelihood; + } - private Map getAllManeuvers() { - Map maneuvers = new HashMap<>(); + private Cluster getOppositeCluster( + Cluster cluster, + Set> clusters) { + final Bearing clusterCentroid = cluster.getCentroid(); + final Bearing opposite = clusterCentroid.reverse(); + Cluster oppositeClusterCandidate = + clusters.stream().min((a, b)-> + (int) Math.signum(Math.abs(opposite.getDifferenceTo(a.getCentroid()).getDegrees()) - + Math.abs(opposite.getDifferenceTo(b.getCentroid()).getDegrees()))).get(); + final Cluster result; + if (Math.abs(opposite.getDifferenceTo(oppositeClusterCandidate.getCentroid()).getDegrees()) < THRESHOLD_OPPOSITE_CLUSTER_DIFFERENCE_DEGREES) { + result = oppositeClusterCandidate; + } else { + result = null; + } + return result; + } + /** + * By looking at the weighted speeds over ground averages, and based on the {@link #polarService} determines how + * likely it is that the tack cluster actually contains tacks and the jibe cluster jibes. This is based on the idea + * that if for the most likely wind speeds the jibes have a different (usually significantly higher) entry speed + * than the tacks then this difference show show in the cluster elements. If they don't, then this should give a + * penalty for the cluster likelihoods. + *

+ * + * The weight of a maneuver for computing the weighted speed average is determined to be the + * {@link ManeuverClassification#getLikelihoodAndTWSBasedOnSpeedAndAngle(ManeuverType) likelihood of the maneuver being + * what it is assumed to be}. + */ + private double getLikelihoodTackJibeSpeedRatio( + Cluster tackClusterCandidate, + Cluster jibeClusterCandidate) { + Speed tackClusterWeightedAverageSpeed = getWeightedAverageSpeed(tackClusterCandidate, ManeuverType.TACK); + Speed jibeClusterWeightedAverageSpeed = getWeightedAverageSpeed(jibeClusterCandidate, ManeuverType.JIBE); + // TODO ask polarService how likely the ratio we found actually is + return Math.min(1., 0.5*jibeClusterWeightedAverageSpeed.getKnots()/tackClusterWeightedAverageSpeed.getKnots()); + } + + private Speed getWeightedAverageSpeed(Cluster cluster, ManeuverType maneuverType) { + double weightSum = 0; + ScalableSpeed scalableSpeed = new ScalableSpeed(Speed.NULL); + for (ManeuverClassification mc : cluster) { + final Double weight = mc.getLikelihoodAndTWSBasedOnSpeedAndAngle(maneuverType).getA(); + weightSum += weight; + scalableSpeed = scalableSpeed.add(new ScalableSpeed(mc.getSpeedAtManeuverStart()).multiply(weight)); + } + return scalableSpeed.divide(weightSum); + } + + /** + * For each maneuver from maneuvers, a {@link ManeuverClassification object} is created. + */ + private Stream getManeuverClassifications(final Map maneuvers) { + return maneuvers.entrySet().stream().map((maneuverAndCompetitor)-> + new ManeuverClassification(maneuverAndCompetitor.getValue(), maneuverAndCompetitor.getKey())); + } + + private Map getAllManeuvers(boolean waitForLatest) { + Map maneuvers = new HashMap<>(); + final Waypoint firstWaypoint = trackedRace.getRace().getCourse().getFirstWaypoint(); + final Waypoint lastWaypoint = trackedRace.getRace().getCourse().getLastWaypoint(); for (Competitor competitor : trackedRace.getRace().getCompetitors()) { - final BoatClass boatClass = competitor.getBoat().getBoatClass(); - final TimePoint from = trackedRace.getStartOfRace() == null ? trackedRace.getStartOfTracking() - : trackedRace.getStartOfRace(); - final TimePoint to = trackedRace.getEndOfRace() == null ? trackedRace.getEndOfTracking() == null ? - MillisecondsTimePoint.now() : trackedRace.getEndOfTracking() : trackedRace.getEndOfRace(); - for (Maneuver maneuver : trackedRace.getManeuvers(competitor, from, to, /* waitForLatest */ false)) { - maneuvers.put(maneuver, boatClass); + final TimePoint from = Util.getFirstNonNull( + firstWaypoint == null ? null : trackedRace.getMarkPassing(competitor, firstWaypoint) == null ? null : trackedRace.getMarkPassing(competitor, firstWaypoint).getTimePoint(), + trackedRace.getStartOfRace(), trackedRace.getStartOfTracking()); + final TimePoint to = Util.getFirstNonNull( + lastWaypoint == null ? null : trackedRace.getMarkPassing(competitor, lastWaypoint) == null ? null : trackedRace.getMarkPassing(competitor, lastWaypoint).getTimePoint(), + trackedRace.getEndOfRace(), trackedRace.getEndOfTracking(), + MillisecondsTimePoint.now()); + for (Maneuver maneuver : trackedRace.getManeuvers(competitor, from, to, waitForLatest)) { + maneuvers.put(maneuver, competitor); } } return Collections.unmodifiableMap(maneuvers); } + + public Set> getClusters() { + return clusters; + } + + public Cluster getTackCluster() { + return tackCluster; + } + + public Cluster getJibeCluster() { + return jibeCluster; + } + + public String getStringRepresentation(boolean waitForLatest) { + return getStringRepresentation(getClusters().stream(), waitForLatest); + } + + public String getStringRepresentation(Stream> clusters, boolean waitForLatest) { + StringBuilder stringRepresentation = new StringBuilder(); + stringRepresentation.delete(0, stringRepresentation.length()); + stringRepresentation.append(getManeuverClassificationColumnHeaders()); + stringRepresentation.append('\n'); + stringRepresentation.append(getManeuverClassificationColumnTypes()); + stringRepresentation.append('\n'); + stringRepresentation.append(getManeuverClassificationColumnHeaders()); + stringRepresentation.append('\n'); + final int[] id = new int[1]; + clusters.map((c)->c.stream()).reduce(Stream::concat).get().forEach((i)->{ + stringRepresentation.append(format(i, ""+id[0]++)); + stringRepresentation.append('\n'); + }); + return stringRepresentation.toString(); + } } diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/impl/ColorDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/impl/ColorDeserializer.java index b78f68f840a..9a5d79a3b36 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/impl/ColorDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/impl/ColorDeserializer.java @@ -2,10 +2,10 @@ package com.sap.sailing.server.gateway.deserialization.impl; import org.json.simple.JSONObject; -import com.sap.sailing.domain.common.Color; -import com.sap.sailing.domain.common.impl.RGBColor; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; +import com.sap.sse.common.Color; +import com.sap.sse.common.impl.RGBColor; public class ColorDeserializer implements JsonDeserializer { diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/impl/CompetitorJsonDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/impl/CompetitorJsonDeserializer.java index ada83dcddf7..dcd7490de68 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/impl/CompetitorJsonDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/impl/CompetitorJsonDeserializer.java @@ -12,11 +12,11 @@ import com.sap.sailing.domain.base.CompetitorStore; import com.sap.sailing.domain.base.SharedDomainFactory; import com.sap.sailing.domain.base.impl.DynamicBoat; import com.sap.sailing.domain.base.impl.DynamicTeam; -import com.sap.sailing.domain.common.Color; -import com.sap.sailing.domain.common.impl.RGBColor; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; import com.sap.sailing.server.gateway.serialization.impl.CompetitorJsonSerializer; +import com.sap.sse.common.Color; +import com.sap.sse.common.impl.RGBColor; public class CompetitorJsonDeserializer implements JsonDeserializer { protected final CompetitorFactory competitorStore; diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/impl/FleetDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/impl/FleetDeserializer.java index fe384773d9a..453e3602118 100755 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/impl/FleetDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/impl/FleetDeserializer.java @@ -4,10 +4,10 @@ import org.json.simple.JSONObject; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.impl.FleetImpl; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; import com.sap.sailing.server.gateway.serialization.impl.FleetJsonSerializer; +import com.sap.sse.common.Color; public class FleetDeserializer implements JsonDeserializer { private JsonDeserializer colorDeserializer; diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/impl/CompetitorJsonSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/impl/CompetitorJsonSerializer.java index 68c01c8ce15..8a42dcb3b06 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/impl/CompetitorJsonSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/impl/CompetitorJsonSerializer.java @@ -10,8 +10,8 @@ import com.sap.sailing.domain.base.Boat; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Nationality; import com.sap.sailing.domain.base.Team; -import com.sap.sailing.domain.common.CountryCode; import com.sap.sailing.server.gateway.serialization.JsonSerializer; +import com.sap.sse.common.CountryCode; public class CompetitorJsonSerializer implements JsonSerializer { public static final String FIELD_ID = "id"; diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/impl/FleetJsonSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/impl/FleetJsonSerializer.java index a517cfa1e61..14f883e8ca8 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/impl/FleetJsonSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/impl/FleetJsonSerializer.java @@ -3,8 +3,8 @@ package com.sap.sailing.server.gateway.serialization.impl; import org.json.simple.JSONObject; import com.sap.sailing.domain.base.Fleet; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.server.gateway.serialization.JsonSerializer; +import com.sap.sse.common.Color; public class FleetJsonSerializer implements JsonSerializer { public static final String FIELD_NAME = "name"; diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/ColorJsonSerializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/ColorJsonSerializer.java index 6202db3c072..34b97dc2bac 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/ColorJsonSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/ColorJsonSerializer.java @@ -2,8 +2,8 @@ package com.sap.sailing.server.gateway.serialization.impl; import org.json.simple.JSONObject; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.server.gateway.serialization.JsonSerializer; +import com.sap.sse.common.Color; import com.sap.sse.common.Util; public class ColorJsonSerializer implements JsonSerializer { diff --git a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/AbstractJsonExportTest.java b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/AbstractJsonExportTest.java index 3622f14ea39..9cbc93bc25a 100644 --- a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/AbstractJsonExportTest.java +++ b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/AbstractJsonExportTest.java @@ -27,10 +27,10 @@ import com.sap.sailing.domain.base.impl.CompetitorImpl; import com.sap.sailing.domain.base.impl.NationalityImpl; import com.sap.sailing.domain.base.impl.PersonImpl; import com.sap.sailing.domain.base.impl.TeamImpl; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.server.RacingEventService; import com.sap.sailing.server.gateway.AbstractJsonHttpServlet; import com.sap.sailing.server.impl.RacingEventServiceImpl; +import com.sap.sse.common.Color; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; import com.sap.sse.mongodb.MongoDBConfiguration; diff --git a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/AbstractJaxRsApiTest.java b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/AbstractJaxRsApiTest.java index 9104b802747..308954f2376 100644 --- a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/AbstractJaxRsApiTest.java +++ b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/AbstractJaxRsApiTest.java @@ -21,10 +21,10 @@ import com.sap.sailing.domain.base.impl.CompetitorImpl; import com.sap.sailing.domain.base.impl.NationalityImpl; import com.sap.sailing.domain.base.impl.PersonImpl; import com.sap.sailing.domain.base.impl.TeamImpl; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.server.RacingEventService; import com.sap.sailing.server.gateway.jaxrs.AbstractSailingServerResource; import com.sap.sailing.server.impl.RacingEventServiceImpl; +import com.sap.sse.common.Color; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; import com.sap.sse.mongodb.MongoDBConfiguration; diff --git a/java/com.sap.sailing.server.gateway/META-INF/MANIFEST.MF b/java/com.sap.sailing.server.gateway/META-INF/MANIFEST.MF index 69c688d9d13..efbd733e9ec 100644 --- a/java/com.sap.sailing.server.gateway/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.server.gateway/META-INF/MANIFEST.MF @@ -46,7 +46,8 @@ Require-Bundle: com.sap.sailing.domain, com.sap.sse.common, com.sap.sse.replication, com.sap.sse, - com.sap.sailing.server.gateway.serialization.shared.android + com.sap.sailing.server.gateway.serialization.shared.android, + com.sap.sse.shared.android Bundle-ClassPath: . Web-ContextPath: /sailingserver Export-Package: com.sap.sailing.server.gateway, diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/HttpMessageSenderServletRequestHandler.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/HttpMessageSenderServletRequestHandler.java index ce47d02c8ff..697329316be 100755 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/HttpMessageSenderServletRequestHandler.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/HttpMessageSenderServletRequestHandler.java @@ -11,9 +11,9 @@ import javax.servlet.http.HttpServletResponse; import org.osgi.framework.BundleContext; -import com.sap.sailing.domain.common.Base64Utils; import com.sap.sailing.domain.common.HttpMessageSenderServletConstants; import com.sap.sailing.server.RacingEventService; +import com.sap.sse.common.Base64Utils; public abstract class HttpMessageSenderServletRequestHandler { private static final Logger logger = Logger.getLogger(AbstractHttpPostServlet.class.getName()); diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/LeaderboardJsonGetServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/LeaderboardJsonGetServlet.java index 1d0799c9b52..d020065d275 100755 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/LeaderboardJsonGetServlet.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/LeaderboardJsonGetServlet.java @@ -9,8 +9,8 @@ import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.Map.Entry; +import java.util.Set; import java.util.logging.Logger; import javax.servlet.ServletException; @@ -36,12 +36,12 @@ import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.server.gateway.AbstractJsonHttpServlet; import com.sap.sailing.server.gateway.HttpRequestUtils; import com.sap.sailing.server.gateway.ParseHttpParameterException; -import com.sap.sailing.util.SmartFutureCache; -import com.sap.sailing.util.SmartFutureCache.CacheUpdater; -import com.sap.sailing.util.SmartFutureCache.UpdateInterval; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; +import com.sap.sse.util.SmartFutureCache; +import com.sap.sse.util.SmartFutureCache.CacheUpdater; +import com.sap.sse.util.SmartFutureCache.UpdateInterval; /** * Exports a leaderboard to the JSON format. Uses a {@link SmartFutureCache}. diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/RegattaAndRaceDataJsonGetServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/RegattaAndRaceDataJsonGetServlet.java index ca80609670d..6b9ff74828d 100755 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/RegattaAndRaceDataJsonGetServlet.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/RegattaAndRaceDataJsonGetServlet.java @@ -20,7 +20,6 @@ import com.sap.sailing.domain.base.Person; import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Waypoint; -import com.sap.sailing.domain.common.CountryCode; import com.sap.sailing.domain.common.Distance; import com.sap.sailing.domain.common.NoWindException; import com.sap.sailing.domain.common.Position; @@ -36,6 +35,7 @@ import com.sap.sailing.domain.tracking.Wind; import com.sap.sailing.domain.tracking.WindPositionMode; import com.sap.sailing.server.gateway.AbstractJsonHttpServlet; import com.sap.sse.InvalidDateException; +import com.sap.sse.common.CountryCode; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/PolarResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/PolarResource.java index 97876cb43c5..8b758124930 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/PolarResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/PolarResource.java @@ -1,5 +1,8 @@ package com.sap.sailing.server.gateway.jaxrs.api; +import java.util.ArrayList; +import java.util.stream.Stream; + import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; @@ -17,19 +20,24 @@ import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.SpeedWithBearingWithConfidence; import com.sap.sailing.domain.base.SpeedWithConfidence; +import com.sap.sailing.domain.common.Bearing; +import com.sap.sailing.domain.common.DoublePair; import com.sap.sailing.domain.common.LegType; import com.sap.sailing.domain.common.Speed; import com.sap.sailing.domain.common.Tack; import com.sap.sailing.domain.common.impl.DegreeBearingImpl; import com.sap.sailing.domain.common.impl.KnotSpeedImpl; +import com.sap.sailing.domain.common.scalablevalue.impl.ScalableBearing; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.Wind; import com.sap.sailing.polars.PolarDataService; import com.sap.sailing.polars.regression.NotEnoughDataHasBeenAddedException; import com.sap.sailing.polars.windestimation.ManeuverBasedWindEstimationTrackImpl; +import com.sap.sailing.polars.windestimation.ManeuverBasedWindEstimationTrackImpl.ManeuverClassification; import com.sap.sailing.server.gateway.jaxrs.AbstractSailingServerResource; import com.sap.sailing.server.gateway.serialization.impl.PositionJsonSerializer; import com.sap.sailing.server.gateway.serialization.impl.WindJsonSerializer; +import com.sap.sse.util.kmeans.Cluster; /** * Right now this service is only used for quick debugging and testing of the polar api. It used plain text responses. @@ -95,7 +103,7 @@ public class PolarResource extends AbstractSailingServerResource { } @GET - @Produces("text/plain;charset=UTF-8") + @Produces("application/json;charset=UTF-8") @Path("windestimation/{regattaname}/races/{racename}") public Response getCompetitorPositions(@PathParam("regattaname") String regattaName, @PathParam("racename") String raceName) throws NotEnoughDataHasBeenAddedException { Regatta regatta = findRegattaByName(regattaName); @@ -112,7 +120,7 @@ public class PolarResource extends AbstractSailingServerResource { WindJsonSerializer serializer = new WindJsonSerializer(new PositionJsonSerializer()); PolarDataService service = getService().getPolarDataService(); ManeuverBasedWindEstimationTrackImpl maneuverBasedWindEstimationTrackImpl = new ManeuverBasedWindEstimationTrackImpl( - service, trackedRace, /* millisecondsOverWhichToAverage */ 30000); + service, trackedRace, /* millisecondsOverWhichToAverage */ 30000, /* waitForLatest */ false); maneuverBasedWindEstimationTrackImpl.lockForRead(); try { for (Wind wind : maneuverBasedWindEstimationTrackImpl.getFixes()) { @@ -121,8 +129,43 @@ public class PolarResource extends AbstractSailingServerResource { } finally { maneuverBasedWindEstimationTrackImpl.unlockAfterRead(); } - ResponseBuilder responseBuilder = Response.ok(resultAsJson.toJSONString(), MediaType.TEXT_PLAIN); - response = responseBuilder.build(); + response = Response.ok(resultAsJson.toJSONString(), MediaType.APPLICATION_JSON).build(); + } + } + return response; + } + + @GET + @Produces("text/plain;charset=UTF-8") + @Path("maneuvers/{regattaname}/races/{racename}") + public Response getManeuvers(@PathParam("regattaname") String regattaName, @PathParam("racename") String raceName, + @QueryParam("cluster") String cluster) + throws NotEnoughDataHasBeenAddedException { + Regatta regatta = findRegattaByName(regattaName); + Response response; + if (regatta == null) { + response = getBadRegattaErrorResponse(regattaName); + } else { + RaceDefinition race = findRaceByName(regatta, raceName); + if (race == null) { + response = getBadRaceErrorResponse(regattaName, raceName); + } else { + TrackedRace trackedRace = findTrackedRace(regattaName, raceName); + PolarDataService service = getService().getPolarDataService(); + ManeuverBasedWindEstimationTrackImpl maneuverBasedWindEstimationTrackImpl = new ManeuverBasedWindEstimationTrackImpl( + service, trackedRace, /* millisecondsOverWhichToAverage */ 30000, /* waitForLatest */ false); + final Stream> clusters; + if ("tack".equals(cluster)) { + clusters = Stream.of(maneuverBasedWindEstimationTrackImpl.getTackCluster()); + } else if ("jibe".equals(cluster)) { + clusters = Stream.of(maneuverBasedWindEstimationTrackImpl.getJibeCluster()); + } else if (cluster != null && cluster.matches("[0-9][0-9]*")) { + clusters = Stream.of(new ArrayList<>(maneuverBasedWindEstimationTrackImpl.getClusters()).get(Integer.valueOf(cluster))); + } else { + clusters = maneuverBasedWindEstimationTrackImpl.getClusters().stream(); + } + response = Response.ok(maneuverBasedWindEstimationTrackImpl.getStringRepresentation(clusters, /* waitForLatest */ true), + MediaType.TEXT_PLAIN).build(); } } return response; diff --git a/java/com.sap.sailing.server.replication.test/META-INF/MANIFEST.MF b/java/com.sap.sailing.server.replication.test/META-INF/MANIFEST.MF index e62721228be..197b35bc5a2 100755 --- a/java/com.sap.sailing.server.replication.test/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.server.replication.test/META-INF/MANIFEST.MF @@ -25,4 +25,5 @@ Require-Bundle: com.sap.sailing.server, com.sap.sse.common, org.mockito.mockito-core;bundle-version="1.9.5", com.sap.sailing.domain.shared.android, - com.sap.sse.replication.testsupport + com.sap.sse.replication.testsupport, + com.sap.sse.shared.android diff --git a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/AbstractLogReplicationTest.java b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/AbstractLogReplicationTest.java index f913d8cd1e6..522b32f12a4 100644 --- a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/AbstractLogReplicationTest.java +++ b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/AbstractLogReplicationTest.java @@ -15,7 +15,6 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogRaceStatusEvent; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Series; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.RegattaName; import com.sap.sailing.domain.common.dto.FleetDTO; import com.sap.sailing.domain.common.dto.RegattaCreationParametersDTO; @@ -28,6 +27,7 @@ import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.server.impl.RacingEventServiceImpl; import com.sap.sailing.server.operationaltransformation.AddSpecificRegatta; import com.sap.sailing.server.operationaltransformation.CreateFlexibleLeaderboard; +import com.sap.sse.common.Color; import com.sap.sse.common.Util; public abstract class AbstractLogReplicationTest, EventT extends AbstractLogEvent, VisitorT> diff --git a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/CompetitorReplicationTest.java b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/CompetitorReplicationTest.java index 2c77345bf82..07553232562 100755 --- a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/CompetitorReplicationTest.java +++ b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/CompetitorReplicationTest.java @@ -25,7 +25,6 @@ import com.sap.sailing.domain.base.impl.PersonImpl; import com.sap.sailing.domain.base.impl.RaceDefinitionImpl; import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.base.impl.TeamImpl; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.RegattaName; import com.sap.sailing.domain.common.ScoringSchemeType; @@ -41,6 +40,7 @@ import com.sap.sailing.server.operationaltransformation.AddRaceDefinition; import com.sap.sailing.server.operationaltransformation.AllowCompetitorResetToDefaults; import com.sap.sailing.server.operationaltransformation.CreateTrackedRace; import com.sap.sailing.server.operationaltransformation.UpdateCompetitor; +import com.sap.sse.common.Color; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; diff --git a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/RegattaReplicationTest.java b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/RegattaReplicationTest.java index 450f4b9561a..9a5800a95ec 100755 --- a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/RegattaReplicationTest.java +++ b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/RegattaReplicationTest.java @@ -25,13 +25,13 @@ import com.sap.sailing.domain.base.configuration.impl.RegattaConfigurationImpl; import com.sap.sailing.domain.base.impl.FleetImpl; import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.base.impl.SeriesImpl; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.CourseDesignerMode; import com.sap.sailing.domain.common.RegattaName; import com.sap.sailing.domain.common.ScoringSchemeType; import com.sap.sailing.domain.common.dto.FleetDTO; import com.sap.sailing.server.operationaltransformation.UpdateSeries; import com.sap.sailing.server.operationaltransformation.UpdateSpecificRegatta; +import com.sap.sse.common.Color; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; diff --git a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/TrackedRaceContentsReplicationTest.java b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/TrackedRaceContentsReplicationTest.java index 12762e73aca..047ecd2589c 100755 --- a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/TrackedRaceContentsReplicationTest.java +++ b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/TrackedRaceContentsReplicationTest.java @@ -28,7 +28,6 @@ import com.sap.sailing.domain.base.impl.PersonImpl; import com.sap.sailing.domain.base.impl.RaceDefinitionImpl; import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.base.impl.TeamImpl; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.RegattaName; import com.sap.sailing.domain.common.RegattaNameAndRaceName; import com.sap.sailing.domain.common.WindSource; @@ -55,6 +54,7 @@ import com.sap.sailing.server.operationaltransformation.AddDefaultRegatta; import com.sap.sailing.server.operationaltransformation.AddRaceDefinition; import com.sap.sailing.server.operationaltransformation.CreateTrackedRace; import com.sap.sailing.server.operationaltransformation.TrackRegatta; +import com.sap.sse.common.Color; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java index 44148bcbca3..24bdb4998e0 100755 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java @@ -71,7 +71,6 @@ import com.sap.sailing.domain.base.impl.PersonImpl; import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.base.impl.SeriesImpl; import com.sap.sailing.domain.base.impl.TeamImpl; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.CourseDesignerMode; import com.sap.sailing.domain.common.MasterDataImportObjectCreationCount; import com.sap.sailing.domain.common.MaxPointsReason; @@ -111,6 +110,7 @@ import com.sap.sailing.server.gateway.jaxrs.spi.MasterDataResource; import com.sap.sailing.server.impl.RacingEventServiceImpl; import com.sap.sailing.server.masterdata.DummyTrackedRace; import com.sap.sailing.server.masterdata.MasterDataImporter; +import com.sap.sse.common.Color; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsDurationImpl; diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/SearchServiceTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/SearchServiceTest.java index fe8a2866b87..a8c5a7a71e7 100755 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/SearchServiceTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/SearchServiceTest.java @@ -34,7 +34,6 @@ import com.sap.sailing.domain.base.impl.CourseAreaImpl; import com.sap.sailing.domain.base.impl.CourseImpl; import com.sap.sailing.domain.base.impl.RaceDefinitionImpl; import com.sap.sailing.domain.base.impl.RegattaImpl; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.RegattaName; import com.sap.sailing.domain.common.dto.FleetDTO; import com.sap.sailing.domain.common.dto.RegattaCreationParametersDTO; @@ -69,6 +68,7 @@ import com.sap.sailing.server.operationaltransformation.CreateTrackedRace; import com.sap.sailing.server.operationaltransformation.RemoveEvent; import com.sap.sailing.server.operationaltransformation.RemoveLeaderboard; import com.sap.sailing.server.operationaltransformation.RemoveRegatta; +import com.sap.sse.common.Color; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/WindByRaceLogTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/WindByRaceLogTest.java index 2865d2bda36..c400a3a1df3 100644 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/WindByRaceLogTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/WindByRaceLogTest.java @@ -31,7 +31,6 @@ import com.sap.sailing.domain.base.impl.PersonImpl; import com.sap.sailing.domain.base.impl.RaceDefinitionImpl; import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.base.impl.TeamImpl; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.RegattaName; import com.sap.sailing.domain.common.RegattaNameAndRaceName; import com.sap.sailing.domain.common.WindSource; @@ -57,6 +56,7 @@ import com.sap.sailing.server.operationaltransformation.CreateFlexibleLeaderboar import com.sap.sailing.server.operationaltransformation.CreateTrackedRace; import com.sap.sailing.server.operationaltransformation.DisconnectLeaderboardColumnFromTrackedRace; import com.sap.sailing.server.operationaltransformation.TrackRegatta; +import com.sap.sse.common.Color; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; diff --git a/java/com.sap.sailing.server/META-INF/MANIFEST.MF b/java/com.sap.sailing.server/META-INF/MANIFEST.MF index 33f058df7cb..1f88a62205c 100755 --- a/java/com.sap.sailing.server/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.server/META-INF/MANIFEST.MF @@ -29,7 +29,8 @@ Require-Bundle: com.sap.sailing.domain, com.sap.sse.operationaltransformation, com.sap.sse.replication, com.sap.sse, - com.sap.sailing.server.gateway.serialization.shared.android + com.sap.sailing.server.gateway.serialization.shared.android, + com.sap.sse.shared.android Bundle-ClassPath: . Export-Package: com.sap.sailing.server, com.sap.sailing.server.impl; diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy).launch b/java/com.sap.sailing.server/SailingServer (No Proxy).launch index 5be12174f71..2c4007d528e 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy).launch @@ -33,5 +33,5 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch index 2a6259980f1..a67d08acad6 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch @@ -32,5 +32,5 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch index 648f2821999..6ab6f8a17ab 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch @@ -26,6 +26,6 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch index 4f6187aa41b..31bfbb52380 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch @@ -27,6 +27,6 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch index de11e6d6cb5..e1350cf0639 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch @@ -26,5 +26,5 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch index e0c271095ac..c52a1ceba8a 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch @@ -32,5 +32,5 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (Proxy).launch b/java/com.sap.sailing.server/SailingServer (Proxy).launch index 27c8c29adc5..e9faedde69f 100755 --- a/java/com.sap.sailing.server/SailingServer (Proxy).launch +++ b/java/com.sap.sailing.server/SailingServer (Proxy).launch @@ -33,6 +33,6 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889).launch b/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889).launch index d8cb087c747..4c9e5998b00 100755 --- a/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889).launch +++ b/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889).launch @@ -26,6 +26,6 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (Proxy, Remote Debug SAP VM).launch b/java/com.sap.sailing.server/SailingServer (Proxy, Remote Debug SAP VM).launch index 258749ce4ba..d67a1da4bfd 100755 --- a/java/com.sap.sailing.server/SailingServer (Proxy, Remote Debug SAP VM).launch +++ b/java/com.sap.sailing.server/SailingServer (Proxy, Remote Debug SAP VM).launch @@ -26,5 +26,5 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (Proxy, SwissTiming Live Simulation).launch b/java/com.sap.sailing.server/SailingServer (Proxy, SwissTiming Live Simulation).launch index 7ddb1c014fb..0b56116f9e4 100755 --- a/java/com.sap.sailing.server/SailingServer (Proxy, SwissTiming Live Simulation).launch +++ b/java/com.sap.sailing.server/SailingServer (Proxy, SwissTiming Live Simulation).launch @@ -25,5 +25,5 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (Proxy, winddbTest).launch b/java/com.sap.sailing.server/SailingServer (Proxy, winddbTest).launch index 896bd1a0fac..a337c9bd920 100755 --- a/java/com.sap.sailing.server/SailingServer (Proxy, winddbTest).launch +++ b/java/com.sap.sailing.server/SailingServer (Proxy, winddbTest).launch @@ -26,6 +26,6 @@ - + diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java index 84182e335d3..48a8efafed8 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java @@ -56,6 +56,7 @@ import com.sap.sailing.domain.persistence.DomainObjectFactory; import com.sap.sailing.domain.persistence.MongoObjectFactory; import com.sap.sailing.domain.racelog.tracking.GPSFixStore; import com.sap.sailing.domain.tracking.DynamicTrackedRace; +import com.sap.sailing.domain.tracking.RaceListener; import com.sap.sailing.domain.tracking.RaceTracker; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRegatta; diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/MediaLibrary.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/MediaLibrary.java index fcd2e4f8a60..1186cc2384c 100644 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/MediaLibrary.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/MediaLibrary.java @@ -16,9 +16,9 @@ import java.util.concurrent.ConcurrentMap; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.media.MediaTrack; -import com.sap.sailing.util.impl.LockUtil; -import com.sap.sailing.util.impl.NamedReentrantReadWriteLock; import com.sap.sse.common.TimePoint; +import com.sap.sse.concurrent.LockUtil; +import com.sap.sse.concurrent.NamedReentrantReadWriteLock; class MediaLibrary { diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/PersistentCompetitorStore.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/PersistentCompetitorStore.java index 143c4144c4c..c352f1637bc 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/PersistentCompetitorStore.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/PersistentCompetitorStore.java @@ -10,11 +10,11 @@ import com.sap.sailing.domain.base.DomainFactory; import com.sap.sailing.domain.base.Nationality; import com.sap.sailing.domain.base.impl.DomainFactoryImpl; import com.sap.sailing.domain.base.impl.TransientCompetitorStoreImpl; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.racelog.tracking.TypeBasedServiceFinderFactory; import com.sap.sailing.domain.persistence.DomainObjectFactory; import com.sap.sailing.domain.persistence.MongoObjectFactory; import com.sap.sailing.domain.persistence.PersistenceFactory; +import com.sap.sse.common.Color; import com.sap.sse.mongodb.MongoDBService; /** diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java index ea70cf04535..22300c0aadb 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java @@ -191,8 +191,6 @@ import com.sap.sailing.server.operationaltransformation.UpdateStartTimeReceived; import com.sap.sailing.server.operationaltransformation.UpdateTrackedRaceStatus; import com.sap.sailing.server.operationaltransformation.UpdateWindAveragingTime; import com.sap.sailing.server.operationaltransformation.UpdateWindSourcesToExclude; -import com.sap.sailing.util.impl.LockUtil; -import com.sap.sailing.util.impl.NamedReentrantReadWriteLock; import com.sap.sse.BuildVersion; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; @@ -200,6 +198,8 @@ import com.sap.sse.common.impl.MillisecondsTimePoint; import com.sap.sse.common.search.KeywordQuery; import com.sap.sse.common.search.Result; import com.sap.sse.common.search.ResultImpl; +import com.sap.sse.concurrent.LockUtil; +import com.sap.sse.concurrent.NamedReentrantReadWriteLock; import com.sap.sse.replication.OperationExecutionListener; import com.sap.sse.replication.OperationWithResult; import com.sap.sse.replication.ReplicationMasterDescriptor; diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DataImportLockWithProgress.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DataImportLockWithProgress.java index 23675ba9466..e1df3fffe09 100644 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DataImportLockWithProgress.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DataImportLockWithProgress.java @@ -11,8 +11,8 @@ import com.sap.sailing.server.operationaltransformation.CreateOrUpdateDataImport import com.sap.sailing.server.operationaltransformation.DataImportFailed; import com.sap.sailing.server.operationaltransformation.ImportMasterDataOperation; import com.sap.sailing.server.operationaltransformation.SetDataImportDeleteProgressFromMapTimer; -import com.sap.sailing.util.impl.LockUtil; -import com.sap.sailing.util.impl.NamedReentrantReadWriteLock; +import com.sap.sse.concurrent.LockUtil; +import com.sap.sse.concurrent.NamedReentrantReadWriteLock; /** * This lock is used to allow only one master data import operation be performed at once. It also keeps information diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/ImportMasterDataOperation.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/ImportMasterDataOperation.java index 840aa2b0380..39a1e449f9c 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/ImportMasterDataOperation.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/ImportMasterDataOperation.java @@ -50,8 +50,8 @@ import com.sap.sailing.server.RacingEventService; import com.sap.sailing.server.RacingEventServiceOperation; import com.sap.sailing.server.masterdata.DataImportLockWithProgress; import com.sap.sailing.server.masterdata.DummyTrackedRace; -import com.sap.sailing.util.impl.LockUtil; import com.sap.sse.common.Util; +import com.sap.sse.concurrent.LockUtil; public class ImportMasterDataOperation extends AbstractRacingEventServiceOperation { diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateCompetitor.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateCompetitor.java index 749c6557e94..0b63f0c2c75 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateCompetitor.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateCompetitor.java @@ -2,9 +2,9 @@ package com.sap.sailing.server.operationaltransformation; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Nationality; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.server.RacingEventService; import com.sap.sailing.server.RacingEventServiceOperation; +import com.sap.sse.common.Color; public class UpdateCompetitor extends AbstractRacingEventServiceOperation { private static final long serialVersionUID = 1172181354320184263L; diff --git a/java/com.sap.sailing.xrr.structureimport/src/com/sap/sailing/xrr/structureimport/StructureImporter.java b/java/com.sap.sailing.xrr.structureimport/src/com/sap/sailing/xrr/structureimport/StructureImporter.java index b5558943b64..c27ee51992d 100755 --- a/java/com.sap.sailing.xrr.structureimport/src/com/sap/sailing/xrr/structureimport/StructureImporter.java +++ b/java/com.sap.sailing.xrr.structureimport/src/com/sap/sailing/xrr/structureimport/StructureImporter.java @@ -29,10 +29,8 @@ import com.sap.sailing.domain.base.impl.PersonImpl; import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.base.impl.SeriesImpl; import com.sap.sailing.domain.base.impl.TeamImpl; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.FleetColors; import com.sap.sailing.domain.common.ScoringSchemeType; -import com.sap.sailing.domain.common.impl.AbstractColor; import com.sap.sailing.xrr.resultimport.ParserFactory; import com.sap.sailing.xrr.schema.Boat; import com.sap.sailing.xrr.schema.Crew; @@ -49,7 +47,9 @@ import com.sap.sailing.xrr.structureimport.buildstructure.GuessFleetOrderingStra import com.sap.sailing.xrr.structureimport.buildstructure.RegattaStructure; import com.sap.sailing.xrr.structureimport.buildstructure.Series; import com.sap.sailing.xrr.structureimport.buildstructure.SetRacenumberStrategy; +import com.sap.sse.common.Color; import com.sap.sse.common.TimePoint; +import com.sap.sse.common.impl.AbstractColor; import com.sapsailing.xrr.structureimport.eventimport.EventImport; import com.sapsailing.xrr.structureimport.eventimport.RegattaJSON; diff --git a/java/com.sap.sailing.xrr.structureimport/src/com/sap/sailing/xrr/structureimport/buildstructure/Competitors.java b/java/com.sap.sailing.xrr.structureimport/src/com/sap/sailing/xrr/structureimport/buildstructure/Competitors.java index 59e3d4a9255..8f6d9ea85c8 100755 --- a/java/com.sap.sailing.xrr.structureimport/src/com/sap/sailing/xrr/structureimport/buildstructure/Competitors.java +++ b/java/com.sap.sailing.xrr.structureimport/src/com/sap/sailing/xrr/structureimport/buildstructure/Competitors.java @@ -1,7 +1,7 @@ package com.sap.sailing.xrr.structureimport.buildstructure; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.dto.BoatClassDTO; +import com.sap.sse.common.Color; public class Competitors { private String countryCode = ""; diff --git a/java/com.sap.sse.common/.classpath b/java/com.sap.sse.common/.classpath index d0c701c89d6..dcc01746046 100644 --- a/java/com.sap.sse.common/.classpath +++ b/java/com.sap.sse.common/.classpath @@ -1,8 +1,8 @@ - - - - - - - - + + + + + + + + diff --git a/java/com.sap.sse.common/.settings/org.eclipse.jdt.core.prefs b/java/com.sap.sse.common/.settings/org.eclipse.jdt.core.prefs index c537b63063c..d17b6724d17 100644 --- a/java/com.sap.sse.common/.settings/org.eclipse.jdt.core.prefs +++ b/java/com.sap.sse.common/.settings/org.eclipse.jdt.core.prefs @@ -1,7 +1,12 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/java/com.sap.sse.common/META-INF/MANIFEST.MF b/java/com.sap.sse.common/META-INF/MANIFEST.MF index 50e1fe41905..56290d7ee65 100644 --- a/java/com.sap.sse.common/META-INF/MANIFEST.MF +++ b/java/com.sap.sse.common/META-INF/MANIFEST.MF @@ -4,10 +4,11 @@ Bundle-Name: SSE Common Bundle-SymbolicName: com.sap.sse.common Bundle-Version: 1.0.0.qualifier Bundle-Vendor: SAP -Bundle-RequiredExecutionEnvironment: JavaSE-1.6 +Bundle-RequiredExecutionEnvironment: JavaSE-1.7 Export-Package: com.sap.sse.common, com.sap.sse.common.filter, com.sap.sse.common.impl, + com.sap.sse.common.scalablevalue, com.sap.sse.common.search Require-Bundle: com.sap.sse.datamining.shared;bundle-version="1.0.0" Bundle-ActivationPolicy: lazy diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/util/impl/ArrayListNavigableSet.java b/java/com.sap.sse.common/src/com/sap/sse/common/ArrayListNavigableSet.java similarity index 96% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/util/impl/ArrayListNavigableSet.java rename to java/com.sap.sse.common/src/com/sap/sse/common/ArrayListNavigableSet.java index 481181beb5f..7945b1139e3 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/util/impl/ArrayListNavigableSet.java +++ b/java/com.sap.sse.common/src/com/sap/sse/common/ArrayListNavigableSet.java @@ -1,4 +1,4 @@ -package com.sap.sailing.util.impl; +package com.sap.sse.common; import java.io.Serializable; import java.util.ArrayList; diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/Base64Utils.java b/java/com.sap.sse.common/src/com/sap/sse/common/Base64Utils.java similarity index 96% rename from java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/Base64Utils.java rename to java/com.sap.sse.common/src/com/sap/sse/common/Base64Utils.java index c1efa411e14..0d2081737eb 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/Base64Utils.java +++ b/java/com.sap.sse.common/src/com/sap/sse/common/Base64Utils.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.common; +package com.sap.sse.common; /* * Copyright 2009 Google Inc. diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/Cloner.java b/java/com.sap.sse.common/src/com/sap/sse/common/Cloner.java similarity index 63% rename from java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/Cloner.java rename to java/com.sap.sse.common/src/com/sap/sse/common/Cloner.java index f1bc4002919..3265c2a544b 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/Cloner.java +++ b/java/com.sap.sse.common/src/com/sap/sse/common/Cloner.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.common; +package com.sap.sse.common; public interface Cloner { void clone(Object from, Object to); diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/Color.java b/java/com.sap.sse.common/src/com/sap/sse/common/Color.java similarity index 87% rename from java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/Color.java rename to java/com.sap.sse.common/src/com/sap/sse/common/Color.java index da4f7ab2555..5eb74f763f5 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/Color.java +++ b/java/com.sap.sse.common/src/com/sap/sse/common/Color.java @@ -1,8 +1,8 @@ -package com.sap.sailing.domain.common; +package com.sap.sse.common; import java.io.Serializable; -import com.sap.sailing.domain.common.impl.RGBColor; +import com.sap.sse.common.impl.RGBColor; public interface Color extends Serializable { final Color WHITE = new RGBColor(255, 255, 255); diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/CountryCode.java b/java/com.sap.sse.common/src/com/sap/sse/common/CountryCode.java similarity index 82% rename from java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/CountryCode.java rename to java/com.sap.sse.common/src/com/sap/sse/common/CountryCode.java index 57ca803b4cf..6bb75ffeedf 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/CountryCode.java +++ b/java/com.sap.sse.common/src/com/sap/sse/common/CountryCode.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.common; +package com.sap.sse.common; public interface CountryCode { diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/CountryCodeFactory.java b/java/com.sap.sse.common/src/com/sap/sse/common/CountryCodeFactory.java similarity index 84% rename from java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/CountryCodeFactory.java rename to java/com.sap.sse.common/src/com/sap/sse/common/CountryCodeFactory.java index 29d7cdbc4fb..eff4a2589c5 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/CountryCodeFactory.java +++ b/java/com.sap.sse.common/src/com/sap/sse/common/CountryCodeFactory.java @@ -1,6 +1,6 @@ -package com.sap.sailing.domain.common; +package com.sap.sse.common; -import com.sap.sailing.domain.common.impl.CountryCodeFactoryImpl; +import com.sap.sse.common.impl.CountryCodeFactoryImpl; public interface CountryCodeFactory { CountryCodeFactory INSTANCE = new CountryCodeFactoryImpl(); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/util/impl/ReverseRandomAccessList.java b/java/com.sap.sse.common/src/com/sap/sse/common/ReverseRandomAccessList.java similarity index 89% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/util/impl/ReverseRandomAccessList.java rename to java/com.sap.sse.common/src/com/sap/sse/common/ReverseRandomAccessList.java index 9dc280dc06d..562aa477b66 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/util/impl/ReverseRandomAccessList.java +++ b/java/com.sap.sse.common/src/com/sap/sse/common/ReverseRandomAccessList.java @@ -1,4 +1,4 @@ -package com.sap.sailing.util.impl; +package com.sap.sse.common; import java.util.AbstractList; import java.util.List; diff --git a/java/com.sap.sse.common/src/com/sap/sse/common/Util.java b/java/com.sap.sse.common/src/com/sap/sse/common/Util.java index d27ffffbff5..75230764cee 100755 --- a/java/com.sap.sse.common/src/com/sap/sse/common/Util.java +++ b/java/com.sap.sse.common/src/com/sap/sse/common/Util.java @@ -348,4 +348,18 @@ public class Util { } return join(separator, strings); } + + /** + * Returns the first non-null object in objects or null + * if no such object exists. + */ + @SafeVarargs + public static T getFirstNonNull(T... objects) { + for (T t : objects) { + if (t != null) { + return t; + } + } + return null; + } } \ No newline at end of file diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/AbstractColor.java b/java/com.sap.sse.common/src/com/sap/sse/common/impl/AbstractColor.java similarity index 95% rename from java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/AbstractColor.java rename to java/com.sap.sse.common/src/com/sap/sse/common/impl/AbstractColor.java index 218eed21d46..e421ddea801 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/AbstractColor.java +++ b/java/com.sap.sse.common/src/com/sap/sse/common/impl/AbstractColor.java @@ -1,6 +1,6 @@ -package com.sap.sailing.domain.common.impl; +package com.sap.sse.common.impl; -import com.sap.sailing.domain.common.Color; +import com.sap.sse.common.Color; import com.sap.sse.common.Util; public abstract class AbstractColor implements Color { diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/CountryCodeFactoryImpl.java b/java/com.sap.sse.common/src/com/sap/sse/common/impl/CountryCodeFactoryImpl.java similarity index 98% rename from java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/CountryCodeFactoryImpl.java rename to java/com.sap.sse.common/src/com/sap/sse/common/impl/CountryCodeFactoryImpl.java index fc3a111d2e6..acf7452f781 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/CountryCodeFactoryImpl.java +++ b/java/com.sap.sse.common/src/com/sap/sse/common/impl/CountryCodeFactoryImpl.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.common.impl; +package com.sap.sse.common.impl; import java.util.Collections; import java.util.HashMap; @@ -6,8 +6,8 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; -import com.sap.sailing.domain.common.CountryCode; -import com.sap.sailing.domain.common.CountryCodeFactory; +import com.sap.sse.common.CountryCode; +import com.sap.sse.common.CountryCodeFactory; public class CountryCodeFactoryImpl implements CountryCodeFactory { private final Map byThreeLetterIOCName; diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/CountryCodeImpl.java b/java/com.sap.sse.common/src/com/sap/sse/common/impl/CountryCodeImpl.java similarity index 91% rename from java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/CountryCodeImpl.java rename to java/com.sap.sse.common/src/com/sap/sse/common/impl/CountryCodeImpl.java index c9330618272..807145e63a2 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/CountryCodeImpl.java +++ b/java/com.sap.sse.common/src/com/sap/sse/common/impl/CountryCodeImpl.java @@ -1,6 +1,6 @@ -package com.sap.sailing.domain.common.impl; +package com.sap.sse.common.impl; -import com.sap.sailing.domain.common.CountryCode; +import com.sap.sse.common.CountryCode; public class CountryCodeImpl implements CountryCode { private final String name; diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/HSVColor.java b/java/com.sap.sse.common/src/com/sap/sse/common/impl/HSVColor.java similarity index 95% rename from java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/HSVColor.java rename to java/com.sap.sse.common/src/com/sap/sse/common/impl/HSVColor.java index 5d6e45ceb0c..d831b89af52 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/HSVColor.java +++ b/java/com.sap.sse.common/src/com/sap/sse/common/impl/HSVColor.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.common.impl; +package com.sap.sse.common.impl; import com.sap.sse.common.Util; diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/RGBColor.java b/java/com.sap.sse.common/src/com/sap/sse/common/impl/RGBColor.java similarity index 95% rename from java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/RGBColor.java rename to java/com.sap.sse.common/src/com/sap/sse/common/impl/RGBColor.java index 4944b479304..ddd26f55ee4 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/RGBColor.java +++ b/java/com.sap.sse.common/src/com/sap/sse/common/impl/RGBColor.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.common.impl; +package com.sap.sse.common.impl; import com.sap.sse.common.Util; diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/scalablevalue/AbstractScalarValue.java b/java/com.sap.sse.common/src/com/sap/sse/common/scalablevalue/AbstractScalarValue.java similarity index 59% rename from java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/scalablevalue/AbstractScalarValue.java rename to java/com.sap.sse.common/src/com/sap/sse/common/scalablevalue/AbstractScalarValue.java index c14cc01883c..33fc7a9c721 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/scalablevalue/AbstractScalarValue.java +++ b/java/com.sap.sse.common/src/com/sap/sse/common/scalablevalue/AbstractScalarValue.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.common.scalablevalue; +package com.sap.sse.common.scalablevalue; /** @@ -8,5 +8,6 @@ package com.sap.sailing.domain.common.scalablevalue; * @author Axel Uhl (d043530) * */ -public interface AbstractScalarValue extends ScalableValue { +public interface AbstractScalarValue> extends ComparableScalableValueWithDistance { + } diff --git a/java/com.sap.sse.common/src/com/sap/sse/common/scalablevalue/ComparableScalableValueWithDistance.java b/java/com.sap.sse.common/src/com/sap/sse/common/scalablevalue/ComparableScalableValueWithDistance.java new file mode 100755 index 00000000000..cb773c07cd4 --- /dev/null +++ b/java/com.sap.sse.common/src/com/sap/sse/common/scalablevalue/ComparableScalableValueWithDistance.java @@ -0,0 +1,5 @@ +package com.sap.sse.common.scalablevalue; + +public interface ComparableScalableValueWithDistance> + extends ScalableValueWithDistance, Comparable { +} diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/scalablevalue/IsScalable.java b/java/com.sap.sse.common/src/com/sap/sse/common/scalablevalue/IsScalable.java similarity index 73% rename from java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/scalablevalue/IsScalable.java rename to java/com.sap.sse.common/src/com/sap/sse/common/scalablevalue/IsScalable.java index 4789e8a2a3d..2372c51620f 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/scalablevalue/IsScalable.java +++ b/java/com.sap.sse.common/src/com/sap/sse/common/scalablevalue/IsScalable.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.common.scalablevalue; +package com.sap.sse.common.scalablevalue; import java.io.Serializable; diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/scalablevalue/ScalableValue.java b/java/com.sap.sse.common/src/com/sap/sse/common/scalablevalue/ScalableValue.java similarity index 81% rename from java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/scalablevalue/ScalableValue.java rename to java/com.sap.sse.common/src/com/sap/sse/common/scalablevalue/ScalableValue.java index 61ae9bbf7ca..be59a56d8bb 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/scalablevalue/ScalableValue.java +++ b/java/com.sap.sse.common/src/com/sap/sse/common/scalablevalue/ScalableValue.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.common.scalablevalue; +package com.sap.sse.common.scalablevalue; public interface ScalableValue { ScalableValue multiply(double factor); diff --git a/java/com.sap.sse.common/src/com/sap/sse/common/scalablevalue/ScalableValueWithDistance.java b/java/com.sap.sse.common/src/com/sap/sse/common/scalablevalue/ScalableValueWithDistance.java new file mode 100755 index 00000000000..ceaf9e752d6 --- /dev/null +++ b/java/com.sap.sse.common/src/com/sap/sse/common/scalablevalue/ScalableValueWithDistance.java @@ -0,0 +1,22 @@ +package com.sap.sse.common.scalablevalue; + +/** + * In addition to being a {@link ScalableValue}, specifies the {@link #getDistance} method which determines + * a non-negative double value as a measure for the distances between two values of this type. + * + * @author Axel Uhl (D043530) + * + * @param + * @param + */ +public interface ScalableValueWithDistance extends ScalableValue { + /** + * @return a non-negative distance measure; 0.0 in case this and other are + * equal. + */ + double getDistance(AveragesTo other); + + ScalableValueWithDistance add(ScalableValue t); + + ScalableValueWithDistance multiply(double factor); +} diff --git a/java/com.sap.sse.replication.testsupport/src/com/sap/sse/replication/testsupport/AbstractServerReplicationTest.java b/java/com.sap.sse.replication.testsupport/src/com/sap/sse/replication/testsupport/AbstractServerReplicationTest.java index 17cc684c58d..001315e97a8 100755 --- a/java/com.sap.sse.replication.testsupport/src/com/sap/sse/replication/testsupport/AbstractServerReplicationTest.java +++ b/java/com.sap.sse.replication.testsupport/src/com/sap/sse/replication/testsupport/AbstractServerReplicationTest.java @@ -18,6 +18,8 @@ import java.net.Socket; import java.net.URL; import java.net.URLConnection; import java.util.UUID; +import java.util.logging.Level; +import java.util.logging.Logger; import java.util.zip.GZIPOutputStream; import org.junit.After; @@ -36,11 +38,13 @@ import com.sap.sse.replication.impl.RabbitOutputStream; import com.sap.sse.replication.impl.ReplicaDescriptor; import com.sap.sse.replication.impl.ReplicationInstancesManager; import com.sap.sse.replication.impl.ReplicationMasterDescriptorImpl; -import com.sap.sse.replication.impl.ReplicationServiceImpl; import com.sap.sse.replication.impl.ReplicationReceiver; +import com.sap.sse.replication.impl.ReplicationServiceImpl; import com.sap.sse.replication.impl.SingletonReplicablesProvider; public abstract class AbstractServerReplicationTest, ReplicableImpl extends ReplicableInterface> { + private static final Logger logger = Logger.getLogger(AbstractServerReplicationTest.class.getName()); + protected static final int SERVLET_PORT = 9990; protected ReplicableImpl replica; protected ReplicableImpl master; @@ -92,6 +96,7 @@ public abstract class AbstractServerReplicationTest, ReplicationMasterDescriptor> basicSetUp(boolean dropDB, ReplicableImpl master, ReplicableImpl replica) throws Exception { + logger.info("basicSetUp for test class "+getClass().getName()); persistenceSetUp(dropDB); String exchangeName = "test-sapsailinganalytics-exchange"; String exchangeHost = "localhost"; @@ -119,8 +124,10 @@ public abstract class AbstractServerReplicationTest replicaReplicator = new ReplicationServiceTestImpl(exchangeName, exchangeHost, rim, replicaDescriptor, this.replica, this.master, masterReplicator, masterDescriptor); Pair, ReplicationMasterDescriptor> result = new Pair<>(replicaReplicator, masterDescriptor); + logger.info("starting initial load transmission servlet for "+getClass().getName()); initialLoadTestServerThread = replicaReplicator.startInitialLoadTransmissionServlet(); this.replicaReplicator = replicaReplicator; + logger.info("basicSetUp for test class "+getClass().getName()+" finished"); return result; } @@ -140,25 +147,31 @@ public abstract class AbstractServerReplicationTest + + + + + + diff --git a/java/com.sap.sse.shared.android/.project b/java/com.sap.sse.shared.android/.project new file mode 100755 index 00000000000..dd31c4112a7 --- /dev/null +++ b/java/com.sap.sse.shared.android/.project @@ -0,0 +1,28 @@ + + + com.sap.sse.shared.android + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/java/com.sap.sse.shared.android/.settings/org.eclipse.jdt.core.prefs b/java/com.sap.sse.shared.android/.settings/org.eclipse.jdt.core.prefs new file mode 100755 index 00000000000..11f6e462df7 --- /dev/null +++ b/java/com.sap.sse.shared.android/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/java/com.sap.sse.shared.android/.settings/org.eclipse.pde.core.prefs b/java/com.sap.sse.shared.android/.settings/org.eclipse.pde.core.prefs new file mode 100755 index 00000000000..b7e72d019c2 --- /dev/null +++ b/java/com.sap.sse.shared.android/.settings/org.eclipse.pde.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +pluginProject.extensions=false +resolve.requirebundle=false diff --git a/java/com.sap.sse.shared.android/META-INF/MANIFEST.MF b/java/com.sap.sse.shared.android/META-INF/MANIFEST.MF new file mode 100755 index 00000000000..e7ad05c7f81 --- /dev/null +++ b/java/com.sap.sse.shared.android/META-INF/MANIFEST.MF @@ -0,0 +1,10 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Android +Bundle-SymbolicName: com.sap.sse.shared.android +Bundle-Version: 1.0.0.qualifier +Bundle-Vendor: SAP +Bundle-RequiredExecutionEnvironment: JavaSE-1.7 +Require-Bundle: com.sap.sse.common +Export-Package: com.sap.sse.concurrent, + com.sap.sse.util.impl diff --git a/java/com.sap.sse.shared.android/build.properties b/java/com.sap.sse.shared.android/build.properties new file mode 100755 index 00000000000..41eb6ade2b4 --- /dev/null +++ b/java/com.sap.sse.shared.android/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/java/com.sap.sse.shared.android/pom.xml b/java/com.sap.sse.shared.android/pom.xml new file mode 100644 index 00000000000..379df04767b --- /dev/null +++ b/java/com.sap.sse.shared.android/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + root + com.sap.sailing + 1.0.0-SNAPSHOT + + com.sap.sse.shared.android + eclipse-plugin + diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/util/impl/ConcurrentHashBag.java b/java/com.sap.sse.shared.android/src/com/sap/sse/concurrent/ConcurrentHashBag.java similarity index 98% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/util/impl/ConcurrentHashBag.java rename to java/com.sap.sse.shared.android/src/com/sap/sse/concurrent/ConcurrentHashBag.java index dc3c045e655..aedd9a45784 100755 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/util/impl/ConcurrentHashBag.java +++ b/java/com.sap.sse.shared.android/src/com/sap/sse/concurrent/ConcurrentHashBag.java @@ -1,4 +1,4 @@ -package com.sap.sailing.util.impl; +package com.sap.sse.concurrent; import java.util.AbstractCollection; import java.util.Map.Entry; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/util/impl/ConcurrentWeakHashMap.java b/java/com.sap.sse.shared.android/src/com/sap/sse/concurrent/ConcurrentWeakHashMap.java similarity index 99% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/util/impl/ConcurrentWeakHashMap.java rename to java/com.sap.sse.shared.android/src/com/sap/sse/concurrent/ConcurrentWeakHashMap.java index 1e71a2f8cca..609a3ba4dbc 100755 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/util/impl/ConcurrentWeakHashMap.java +++ b/java/com.sap.sse.shared.android/src/com/sap/sse/concurrent/ConcurrentWeakHashMap.java @@ -1,4 +1,4 @@ -package com.sap.sailing.util.impl; +package com.sap.sse.concurrent; import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/util/impl/LockUtil.java b/java/com.sap.sse.shared.android/src/com/sap/sse/concurrent/LockUtil.java similarity index 97% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/util/impl/LockUtil.java rename to java/com.sap.sse.shared.android/src/com/sap/sse/concurrent/LockUtil.java index c3c5061fa4a..be927203809 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/util/impl/LockUtil.java +++ b/java/com.sap.sse.shared.android/src/com/sap/sse/concurrent/LockUtil.java @@ -1,4 +1,4 @@ -package com.sap.sailing.util.impl; +package com.sap.sse.concurrent; import java.util.HashMap; import java.util.HashSet; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/util/impl/NamedReentrantReadWriteLock.java b/java/com.sap.sse.shared.android/src/com/sap/sse/concurrent/NamedReentrantReadWriteLock.java similarity index 96% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/util/impl/NamedReentrantReadWriteLock.java rename to java/com.sap.sse.shared.android/src/com/sap/sse/concurrent/NamedReentrantReadWriteLock.java index 4f2e2efc65d..3e6c39dad6d 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/util/impl/NamedReentrantReadWriteLock.java +++ b/java/com.sap.sse.shared.android/src/com/sap/sse/concurrent/NamedReentrantReadWriteLock.java @@ -1,4 +1,4 @@ -package com.sap.sailing.util.impl; +package com.sap.sse.concurrent; import java.io.IOException; import java.io.ObjectInputStream; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/util/impl/AbstractUnmodifiableNavigableSet.java b/java/com.sap.sse.shared.android/src/com/sap/sse/util/impl/AbstractUnmodifiableNavigableSet.java similarity index 93% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/util/impl/AbstractUnmodifiableNavigableSet.java rename to java/com.sap.sse.shared.android/src/com/sap/sse/util/impl/AbstractUnmodifiableNavigableSet.java index b1bfda134df..353807d8dc7 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/util/impl/AbstractUnmodifiableNavigableSet.java +++ b/java/com.sap.sse.shared.android/src/com/sap/sse/util/impl/AbstractUnmodifiableNavigableSet.java @@ -1,4 +1,4 @@ -package com.sap.sailing.util.impl; +package com.sap.sse.util.impl; import java.io.Serializable; import java.util.Collection; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/util/impl/DescendingNavigableSet.java b/java/com.sap.sse.shared.android/src/com/sap/sse/util/impl/DescendingNavigableSet.java similarity index 94% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/util/impl/DescendingNavigableSet.java rename to java/com.sap.sse.shared.android/src/com/sap/sse/util/impl/DescendingNavigableSet.java index d7cb7eeee7a..c0f802a4575 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/util/impl/DescendingNavigableSet.java +++ b/java/com.sap.sse.shared.android/src/com/sap/sse/util/impl/DescendingNavigableSet.java @@ -1,4 +1,4 @@ -package com.sap.sailing.util.impl; +package com.sap.sse.util.impl; import java.util.Collection; import java.util.Collections; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/util/impl/UnmodifiableNavigableSet.java b/java/com.sap.sse.shared.android/src/com/sap/sse/util/impl/UnmodifiableNavigableSet.java similarity index 95% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/util/impl/UnmodifiableNavigableSet.java rename to java/com.sap.sse.shared.android/src/com/sap/sse/util/impl/UnmodifiableNavigableSet.java index bdd5de00f65..d3867e2d655 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/util/impl/UnmodifiableNavigableSet.java +++ b/java/com.sap.sse.shared.android/src/com/sap/sse/util/impl/UnmodifiableNavigableSet.java @@ -1,4 +1,4 @@ -package com.sap.sailing.util.impl; +package com.sap.sse.util.impl; import java.util.Collection; import java.util.Collections; diff --git a/java/com.sap.sse/META-INF/MANIFEST.MF b/java/com.sap.sse/META-INF/MANIFEST.MF index a8e8f94cf1e..cc68d229206 100755 --- a/java/com.sap.sse/META-INF/MANIFEST.MF +++ b/java/com.sap.sse/META-INF/MANIFEST.MF @@ -7,6 +7,8 @@ Bundle-Vendor: SAP Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Export-Package: com.sap.sse, com.sap.sse.util, - com.sap.sse.util.impl + com.sap.sse.util.impl, + com.sap.sse.util.kmeans Bundle-ActivationPolicy: lazy -Require-Bundle: com.sap.sse.common +Require-Bundle: com.sap.sse.common, + com.sap.sse.shared.android diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/util/AutoCloseableReadLock.java b/java/com.sap.sse/src/com/sap/sse/util/AutoCloseableReadLock.java similarity index 72% rename from java/com.sap.sailing.domain/src/com/sap/sailing/util/AutoCloseableReadLock.java rename to java/com.sap.sse/src/com/sap/sse/util/AutoCloseableReadLock.java index cdce95659e1..92e5f66c578 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/util/AutoCloseableReadLock.java +++ b/java/com.sap.sse/src/com/sap/sse/util/AutoCloseableReadLock.java @@ -1,7 +1,8 @@ -package com.sap.sailing.util; +package com.sap.sse.util; + +import com.sap.sse.concurrent.LockUtil; +import com.sap.sse.concurrent.NamedReentrantReadWriteLock; -import com.sap.sailing.util.impl.LockUtil; -import com.sap.sailing.util.impl.NamedReentrantReadWriteLock; public class AutoCloseableReadLock implements AutoCloseable { private final NamedReentrantReadWriteLock lock; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/util/AutoCloseableWriteLock.java b/java/com.sap.sse/src/com/sap/sse/util/AutoCloseableWriteLock.java similarity index 72% rename from java/com.sap.sailing.domain/src/com/sap/sailing/util/AutoCloseableWriteLock.java rename to java/com.sap.sse/src/com/sap/sse/util/AutoCloseableWriteLock.java index 3b9570f16c4..558dc41a706 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/util/AutoCloseableWriteLock.java +++ b/java/com.sap.sse/src/com/sap/sse/util/AutoCloseableWriteLock.java @@ -1,7 +1,8 @@ -package com.sap.sailing.util; +package com.sap.sse.util; + +import com.sap.sse.concurrent.LockUtil; +import com.sap.sse.concurrent.NamedReentrantReadWriteLock; -import com.sap.sailing.util.impl.LockUtil; -import com.sap.sailing.util.impl.NamedReentrantReadWriteLock; public class AutoCloseableWriteLock implements AutoCloseable { private final NamedReentrantReadWriteLock lock; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/util/ByteArrayOutputStreamWithVisibleBuffer.java b/java/com.sap.sse/src/com/sap/sse/util/ByteArrayOutputStreamWithVisibleBuffer.java similarity index 85% rename from java/com.sap.sailing.domain/src/com/sap/sailing/util/ByteArrayOutputStreamWithVisibleBuffer.java rename to java/com.sap.sse/src/com/sap/sse/util/ByteArrayOutputStreamWithVisibleBuffer.java index d6f60ca7bfb..63f2101fc36 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/util/ByteArrayOutputStreamWithVisibleBuffer.java +++ b/java/com.sap.sse/src/com/sap/sse/util/ByteArrayOutputStreamWithVisibleBuffer.java @@ -1,4 +1,4 @@ -package com.sap.sailing.util; +package com.sap.sse.util; import java.io.ByteArrayOutputStream; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/util/ClonerImpl.java b/java/com.sap.sse/src/com/sap/sse/util/ClonerImpl.java similarity index 91% rename from java/com.sap.sailing.domain/src/com/sap/sailing/util/ClonerImpl.java rename to java/com.sap.sse/src/com/sap/sse/util/ClonerImpl.java index ac5b1bc3080..95882b3f0eb 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/util/ClonerImpl.java +++ b/java/com.sap.sse/src/com/sap/sse/util/ClonerImpl.java @@ -1,9 +1,9 @@ -package com.sap.sailing.util; +package com.sap.sse.util; import java.lang.reflect.Field; import java.lang.reflect.Modifier; -import com.sap.sailing.domain.common.Cloner; +import com.sap.sse.common.Cloner; public class ClonerImpl implements Cloner { public void clone(Object from, Object to) { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/util/SmartFutureCache.java b/java/com.sap.sse/src/com/sap/sse/util/SmartFutureCache.java similarity index 97% rename from java/com.sap.sailing.domain/src/com/sap/sailing/util/SmartFutureCache.java rename to java/com.sap.sse/src/com/sap/sse/util/SmartFutureCache.java index b800ca87e9a..c0792b23c3f 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/util/SmartFutureCache.java +++ b/java/com.sap.sse/src/com/sap/sse/util/SmartFutureCache.java @@ -1,4 +1,4 @@ -package com.sap.sailing.util; +package com.sap.sse.util; import java.util.HashMap; import java.util.HashSet; @@ -19,9 +19,9 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.logging.Level; import java.util.logging.Logger; -import com.sap.sailing.util.SmartFutureCache.UpdateInterval; -import com.sap.sailing.util.impl.LockUtil; -import com.sap.sailing.util.impl.NamedReentrantReadWriteLock; +import com.sap.sse.concurrent.LockUtil; +import com.sap.sse.concurrent.NamedReentrantReadWriteLock; +import com.sap.sse.util.SmartFutureCache.UpdateInterval; import com.sap.sse.util.impl.ThreadFactoryWithPriority; /** diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/util/WeakIdentityHashMap.java b/java/com.sap.sse/src/com/sap/sse/util/WeakIdentityHashMap.java similarity index 96% rename from java/com.sap.sailing.domain/src/com/sap/sailing/util/WeakIdentityHashMap.java rename to java/com.sap.sse/src/com/sap/sse/util/WeakIdentityHashMap.java index efaf06a3cba..9ec3ba5f898 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/util/WeakIdentityHashMap.java +++ b/java/com.sap.sse/src/com/sap/sse/util/WeakIdentityHashMap.java @@ -2,7 +2,7 @@ * Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ -package com.sap.sailing.util; +package com.sap.sse.util; import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; diff --git a/java/com.sap.sse/src/com/sap/sse/util/kmeans/Cluster.java b/java/com.sap.sse/src/com/sap/sse/util/kmeans/Cluster.java new file mode 100755 index 00000000000..a2d280f62c8 --- /dev/null +++ b/java/com.sap.sse/src/com/sap/sse/util/kmeans/Cluster.java @@ -0,0 +1,124 @@ +package com.sap.sse.util.kmeans; + +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; +import java.util.Spliterator; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Stream; + +import com.sap.sse.common.scalablevalue.ScalableValueWithDistance; + +/** + * A k-means cluster that can determine its centroid (arithmetic mean of all its values) and for each element the + * distance to that centroid. + *

+ * + * Two clusters are equal and therefore in particular have equal hash codes if their element set is equal. This equality + * definition explicitly ignores the {@link #mean} to which this cluster was initialized. + * + * @author Axel Uhl (D043530) + * + * @param + */ +public class Cluster> implements Iterable { + private final Set elements; + private final Function mapper; + private final AveragesTo mean; + private ScalableValueWithDistance sum; + + public Cluster(final AveragesTo mean, Function mapper) { + this.mapper = mapper; + elements = new HashSet<>(); + this.mean = mean; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((elements == null) ? 0 : elements.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Cluster other = (Cluster) obj; + if (elements == null) { + if (other.elements != null) + return false; + } else if (!elements.equals(other.elements)) + return false; + return true; + } + + public void add(final E e) { + elements.add(e); + final T t = mapper.apply(e); + if (sum == null) { + sum = t; + } else { + sum = sum.add(t); + } + } + + /** + * Determines the {@link ScalableValueWithDistance#getDistance(Object) distance} of the element e to + * this cluster's {@link #mean} value. + */ + public double getDistanceFromMean(final E e) { + return mapper.apply(e).getDistance(mean); + } + + /** + * @return null for an empty cluster; otherwise the average obtained by dividing the element + * {@link ScalableValueWithDistance#add(com.sap.sse.common.scalablevalue.ScalableValue) sum} by + * the number of elements that have been added to this cluster so far + */ + public AveragesTo getCentroid() { + return sum == null ? null : sum.divide(elements.size()); + } + + public AveragesTo getMean() { + return mean; + } + + public int size() { + return elements.size(); + } + + public boolean isEmpty() { + return elements.isEmpty(); + } + + @Override + public Iterator iterator() { + return elements.iterator(); + } + + @Override + public Spliterator spliterator() { + return elements.spliterator(); + } + + @Override + public void forEach(Consumer action) { + elements.forEach(action); + } + + @Override + public String toString() { + return "{mean: "+getMean()+", centroid: "+getCentroid()+", elements: "+elements+"}"; + } + + public Stream stream() { + return elements.stream(); + } +} diff --git a/java/com.sap.sse/src/com/sap/sse/util/kmeans/KMeansClusterer.java b/java/com.sap.sse/src/com/sap/sse/util/kmeans/KMeansClusterer.java new file mode 100755 index 00000000000..a5c4fb7244a --- /dev/null +++ b/java/com.sap.sse/src/com/sap/sse/util/kmeans/KMeansClusterer.java @@ -0,0 +1,26 @@ +package com.sap.sse.util.kmeans; + +import java.util.Iterator; + +import com.sap.sse.common.scalablevalue.ScalableValueWithDistance; + +/** + * Clusters elements of type T into a pre-defined number of clusters such that after clustering the sum of + * square distances of each element to its cluster mean is minimized. See also http://en.wikipedia.org/wiki/K-means_clustering. + * + * @author Axel Uhl (D043530) + * + * @param + */ +public class KMeansClusterer> extends + KMeansMappingClusterer { + + protected KMeansClusterer(int numberOfClusters, Iterable elements, Iterator seeds) { + super(numberOfClusters, elements, (e) -> e, seeds); + } + + public KMeansClusterer(int numberOfClusters, Iterable elements) { + super(numberOfClusters, elements, (e) -> e); + } +} \ No newline at end of file diff --git a/java/com.sap.sse/src/com/sap/sse/util/kmeans/KMeansClustererWithEquidistantInitialization.java b/java/com.sap.sse/src/com/sap/sse/util/kmeans/KMeansClustererWithEquidistantInitialization.java new file mode 100755 index 00000000000..4483b8586aa --- /dev/null +++ b/java/com.sap.sse/src/com/sap/sse/util/kmeans/KMeansClustererWithEquidistantInitialization.java @@ -0,0 +1,58 @@ +package com.sap.sse.util.kmeans; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import com.sap.sse.common.scalablevalue.ComparableScalableValueWithDistance; +import com.sap.sse.common.scalablevalue.ScalableValueWithDistance; + +/** + * Requires {@link ComparableScalableValueWithDistance comparable scalable values} as elements for which then + * the minimum and maximum elements are calculated. The given number of clusters is then initialized with mean values + * that are equidistantly distributed between the minimum and maximum value. + * + * @author Axel Uhl (D043530) + * + * @param + * @param + * @param + */ +public class KMeansClustererWithEquidistantInitialization, T extends ComparableScalableValueWithDistance> + extends KMeansClusterer { + + public KMeansClustererWithEquidistantInitialization(int numberOfClusters, Iterable elements) { + super(numberOfClusters, elements, getEquiDistantSeeds(numberOfClusters, elements)); + } + + /** + * Based on the elements being mutually comparable, min and max are determined and elements in between are calculated + * so that numberOfClusters-1 equal distances are created. + */ + private static , T extends ComparableScalableValueWithDistance> Iterator getEquiDistantSeeds( + int numberOfClusters, Iterable elements) { + AveragesTo min = null; + T minElement = null; + AveragesTo max = null; + T maxElement = null; + for (T t : elements) { + final AveragesTo tVal = t.divide(1); + if (min == null || min.compareTo(tVal) > 0) { + minElement = t; + min = tVal; + } + if (max == null || max.compareTo(tVal) < 0) { + maxElement = t; + max = tVal; + } + } + ScalableValueWithDistance step = maxElement.add(minElement.multiply(-1)).multiply(1./(double) (numberOfClusters-1)); + List seeds = new ArrayList<>(); + ScalableValueWithDistance a = minElement; + for (int i = 0; i E into a pre-defined number of clusters such that after clustering the sum of + * square distances of each element to its cluster mean is minimized. See also http://en.wikipedia.org/wiki/K-means_clustering. + * + * @author Axel Uhl (D043530) + * + * @param + * the element type that can be mapped using a mapping {@link Function} to a + * @param + * auxiliary type required for the scalable value type T + * @param + * auxiliary type required for the scalable value type T + * @param + * elements of this type can be obtained through a mapping from elements of type E and can hence + * be scaled and a distance between them can be computed which enables the clustering process + */ +public class KMeansMappingClusterer> { + private List> clusters; + private final Function mapper; + + /** + * Clusters the elements into numberOfClusters clusters such that the sum of squared + * distances to the elements' assigned cluster centroid is minimized. After the constructor has returned, clients + * can query the clusters and their centroids. + *

+ * + * To determine the seeds for the clusters, all elements will be distributed randomly across the + * numberOfClusters clusters, and the resulting cluster centroids are used as seeds. + * + * @param numberOfClusters + * this is the "k" in the k-means algorithm, defining how many clusters are expected. + * @param elements + * the elements to cluster + * @param mapper + * maps elements to type T + */ + public KMeansMappingClusterer(int numberOfClusters, Iterable elements, Function mapper) { + this(numberOfClusters, elements, mapper, randomizedSeeds(numberOfClusters, elements, mapper)); + } + + /** + * Same as {@link #KMeansMappingClusterer(int, Iterable, Function)}, only that a stream instead of an iterable + * is used to provide the elements. + * + * @param elements the stream must not be {@link Stream#isParallel() a parallel stream} + */ + public KMeansMappingClusterer(int numberOfClusters, Stream elements, Function mapper) { + this(numberOfClusters, streamToList(elements), mapper); + } + + private static Iterable streamToList(Stream elements) { + assert !elements.isParallel(); + final List result = new ArrayList<>(); + elements.forEach((e)->result.add(e)); + return result; + } + + /** + * Constructs numberOfClusters (or as many as elements are provided if those are fewer + * than numberOfClusters) clusters and randomly assigns the elements to them. The + * {@link Cluster#getCentroid() centroids} of those clusters are returned as initial means. + */ + private static > Iterator randomizedSeeds( + int numberOfClusters, Iterable elements, Function mapper) { + ArrayList> clusters = new ArrayList<>(numberOfClusters); + Random random = new Random(); + int i=0; + for (E e : elements) { + if (i < numberOfClusters) { + Cluster cluster = new Cluster<>(null, mapper); + clusters.add(cluster); + cluster.add(e); + } else { + clusters.get(random.nextInt(numberOfClusters)).add(e); + } + i++; + }; + return clusters.stream().map((c)->c.getCentroid()).iterator(); + } + + /** + * Same as {@link #KMeansMappingClusterer(int, Iterable, Function, Iterator)}, only that the elements and the seeds are + * provided by streams instead of iterables and iterators. + */ + public KMeansMappingClusterer(int numberOfClusters, Stream elements, Function mapper, Stream seeds) { + this(numberOfClusters, streamToList(elements), mapper, seeds.iterator()); + } + + /** + * Like {@link #KMeansMappingClusterer(int, Iterable)}, additionally providing the seeds to use for the cluster centroids + * during the first iteration. + * + * @param seeds + * elements to use as the seeds; if fewer than numberOfClusters seeds are provided, the + * number of clusters is reduced to the number of seeds provided. + */ + public KMeansMappingClusterer(int numberOfClusters, Iterable elements, Function mapper, Iterator seeds) { + this.mapper = mapper; + clusters = new ArrayList<>(); + initClusters(elements, seeds); + if (!clusters.isEmpty()) { + addElementsToNearestCluster(elements); + iterate(elements); + } + } + + /** + * Creates the clusters using the seeds as their initial mean. Won't create more clusters than + * elements provided; in case fewer elements are provided, only a prefix of the seeds + * iterator will be used. + */ + private void initClusters(Iterable elements, Iterator seeds) { + Iterator elementsIter = elements.iterator(); + while (elementsIter.hasNext() && seeds.hasNext()) { + elementsIter.next(); + clusters.add(new Cluster(seeds.next(), mapper)); + } + } + + /** + * Computes the next iteration by creating new clusters that use as their mean the centroids of the + * current clusters; then, assigns all elements to these clusters and repeats this process until + * the latest iteration produces the same clustering that the previous iteration produced. + */ + private void iterate(Iterable elements) { + List> oldClusters; + do { + List> newClusters = new ArrayList<>(clusters.size()); + for (Cluster c : clusters) { + AveragesTo newMean = c.getCentroid(); + if (newMean == null) { + newMean = c.getMean(); // use old mean instead + } + newClusters.add(new Cluster(newMean, mapper)); + } + oldClusters = clusters; + clusters = newClusters; + addElementsToNearestCluster(elements); + } while (!clusters.equals(oldClusters)); + } + + /** + * adds all elements to their nearest cluster + */ + private void addElementsToNearestCluster(Iterable elements) { + assert !clusters.isEmpty(); + for (E e : elements) { + Iterator> clusterIter = clusters.iterator(); + Cluster nearestCluster = clusterIter.next(); + double leastDistance = nearestCluster.getDistanceFromMean(e); + while (clusterIter.hasNext()) { + Cluster nextCluster = clusterIter.next(); + double distance = nextCluster.getDistanceFromMean(e); + if (distance < leastDistance) { + leastDistance = distance; + nearestCluster = nextCluster; + } + } + nearestCluster.add(e); + } + } + + public Set> getClusters() { + Set> result = new LinkedHashSet<>(); + for (Cluster i : clusters) { + if (!i.isEmpty()) { + result.add(i); + } + } + return result; + } +} diff --git a/java/pom.xml b/java/pom.xml index a27e35d94d8..c5233bdebd6 100755 --- a/java/pom.xml +++ b/java/pom.xml @@ -16,6 +16,7 @@ com.sap.sse com.sap.sse.common + com.sap.sse.shared.android com.sap.sse.mongodb com.sap.sse.gateway com.sap.sse.gwt @@ -141,7 +142,7 @@ If so the IP of the host would be the same for all profiles. --> - -Dfile.encoding=cp1252 -Dreplication.brokerURL=tcp://localhost:61615 -Dmongo.dbName=winddbTest -DspatialWind=true + -Dfile.encoding=cp1252 -Dmongo.dbName=winddbTest -DspatialWind=true -ea -Xmx1024m -XX:PermSize=256m -XX:+UseG1GC diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OfflineDataManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OfflineDataManager.java index a95ec009cfa..17a2e2fbb73 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OfflineDataManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OfflineDataManager.java @@ -42,7 +42,6 @@ import com.sap.sailing.domain.base.racegroup.RaceGroup; import com.sap.sailing.domain.base.racegroup.SeriesWithRows; import com.sap.sailing.domain.base.racegroup.impl.RaceGroupImpl; import com.sap.sailing.domain.base.racegroup.impl.SeriesWithRowsImpl; -import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.racecommittee.app.AppPreferences; import com.sap.sailing.racecommittee.app.data.clients.LoadClient; @@ -52,6 +51,7 @@ import com.sap.sailing.racecommittee.app.domain.ManagedRace; import com.sap.sailing.racecommittee.app.domain.configuration.impl.PreferencesRegattaConfigurationLoader; import com.sap.sailing.racecommittee.app.domain.impl.ManagedRaceIdentifierImpl; import com.sap.sailing.racecommittee.app.domain.impl.ManagedRaceImpl; +import com.sap.sse.common.Color; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; diff --git a/wiki/onboarding.md b/wiki/onboarding.md index ce26b086fe3..1ddad5eeb0b 100644 --- a/wiki/onboarding.md +++ b/wiki/onboarding.md @@ -14,10 +14,9 @@ First of all, make sure you've looked at http://www.amazon.de/Patterns-Elements- 3. Git (e.g. msysGit for Windows v1.7.10), http://git-scm.com 4. MongoDB (e.g. Production Release 2.0.4), download: http://www.mongodb.org/ 5. RabbitMQ, download from http://www.rabbitmq.com/. Requires Erlang to be installed. RabbitMQ installer will assist in installing Erlang. -6. JDK 1.6 (Java SE 6), http://jdk6.java.net (for Android) -7. JDK 1.7 (Java SE 7), http://jdk7.java.net -8. JDK 1.8 (Java SE 8), http://jdk8.java.net -9. Maven 3.1.1 (or higher), http://maven.apache.org +6. JDK 1.7 (Java SE 7), http://jdk7.java.net +7. JDK 1.8 (Java SE 8), http://jdk8.java.net +8. Maven 3.1.1 (or higher), http://maven.apache.org #### Further optional but recommended installations @@ -53,10 +52,10 @@ First of all, make sure you've looked at http://www.amazon.de/Patterns-Elements- * Install the Eclipse GWT-Plugin (now called Google Plugin for Eclipse, you need the Google WebToolkit SDK from the same update site, too) * Install the Google Android SDK from the same Google Plugin for Eclipse update site * Install Eclipse eGit (optional) - * Check that JDK 1.7 is available and has been set for compilation in Eclipse + * Check that JDK 1.8 is available and has been set for compilation in Eclipse * Check that the both JDKs are available (Windows->Preferences->Java->Installed JREs) - * Check that JDK 1.6 has been matched to JavaSE-1.6 and that JDK 1.7 has been matched to JavaSE-1.7 (...>Installed JREs>Execution Environments) - * It is also possible to match the SAPJVM 6 or 7 to the JavaSE-1.6 (for profiling purposes) + * Check that JDK 1.7 has been matched to JavaSE-1.7 and that JDK 1.8 has been matched to JavaSE-1.8 (...>Installed JREs>Execution Environments) + * It is also possible to match the SAPJVM 7 or 8 to JavaSE-1.7 / JavaSE-1.8 (for profiling purposes) * Go to Windows->Preferences->Google->Errors/Warnings and set "Missing SDK" to "Ignore" * Import all Race Analysis projects from the `java/` subdirectory of the git main folder * Import all projects from the `mobile/` subdirectory of the git main folder; this in particular contains the race committee app projects diff --git a/wiki/tracking-app-api-v1-draft.md b/wiki/tracking-app-api-v1-draft.md index c31ef1a442b..191a220a6e5 100644 --- a/wiki/tracking-app-api-v1-draft.md +++ b/wiki/tracking-app-api-v1-draft.md @@ -234,15 +234,21 @@ Allows to retrieve team information for the team of a certain competitor Set the team image of a certain competitor -**Path:** ``{competitor-id}/team/image`` +**Path:** ``competitors/{competitor-id}/team/image`` **Verb:** ``POST`` -Multipart message with ``image`` part containing encoded JPEG or PNG image. +Binary data (not multipart) with ``Content-Type`` of ``image/jpeg`` or ``image/png`` + +e.g. +``` +$ curl -H "Content-Type:image/jpeg" --data-binary @ \ + http://127.0.0.1:8888/sailingserver/api/v1/competitors//team/image +``` **Response:** ``` { - "teamImageUrl" : "http://training.sapsailing.com/team_images/9871d3a2c554b27151cacf1422eec048.jpeg" + "teamImageUri" : "http://training.sapsailing.com/team_images/9871d3a2c554b27151cacf1422eec048.jpeg" } ``` \ No newline at end of file