diff --git a/java/com.sap.sailing.domain.swisstimingadapter/META-INF/MANIFEST.MF b/java/com.sap.sailing.domain.swisstimingadapter/META-INF/MANIFEST.MF
index a85b2eda984..4d2d250eeed 100755
--- a/java/com.sap.sailing.domain.swisstimingadapter/META-INF/MANIFEST.MF
+++ b/java/com.sap.sailing.domain.swisstimingadapter/META-INF/MANIFEST.MF
@@ -13,3 +13,4 @@ Require-Bundle: com.sap.sailing.domain,
Export-Package: com.sap.sailing.domain.swisstimingadapter,
com.sap.sailing.domain.swisstimingadapter.impl;x-friends:="com.sap.sailing.server.test"
Import-Package: org.osgi.framework;version="1.7.0"
+Bundle-Activator: com.sap.sailing.domain.swisstimingadapter.impl.Activator
diff --git a/java/com.sap.sailing.domain.swisstimingreplayadapter/META-INF/MANIFEST.MF b/java/com.sap.sailing.domain.swisstimingreplayadapter/META-INF/MANIFEST.MF
index 3e47f0df5da..0e38d9c32a7 100644
--- a/java/com.sap.sailing.domain.swisstimingreplayadapter/META-INF/MANIFEST.MF
+++ b/java/com.sap.sailing.domain.swisstimingreplayadapter/META-INF/MANIFEST.MF
@@ -13,3 +13,4 @@ Require-Bundle: com.sap.sailing.domain.common,
com.googlecode.java-diff-utils;bundle-version="1.3.0"
Export-Package: com.sap.sailing.domain.swisstimingreplayadapter
Import-Package: org.osgi.framework;version="1.7.0"
+Bundle-Activator: com.sap.sailing.domain.swisstimingreplayadapter.impl.Activator
diff --git a/java/com.sap.sailing.gwt.ui/SailingGWT.launch b/java/com.sap.sailing.gwt.ui/SailingGWT.launch
index 2796f953d03..d3acf8a9e01 100755
--- a/java/com.sap.sailing.gwt.ui/SailingGWT.launch
+++ b/java/com.sap.sailing.gwt.ui/SailingGWT.launch
@@ -4,7 +4,7 @@
-
+
@@ -48,7 +48,7 @@
-
+
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java
index 78d41b57312..858d69b3ffc 100755
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java
@@ -816,4 +816,5 @@ public interface StringMessages extends Messages {
String raceTimeDownwindTooltip();
String raceTimeReachingTooltip();
String raceTimeUpwindTooltip();
+ String lineAngleToWindAndAdvantage(String startLineLength, String startLineAngleToCombinedWind, String startLineAdvantageousSide, String startLineAdvantageInMeters);
}
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties
index 4006686f349..dcd9f85f6ed 100755
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties
@@ -808,4 +808,5 @@ timeUpwind=Time Upwind
raceTimeTooltip=Total time traveled in this race
raceTimeDownwindTooltip=Total time traveled downwind in this race
raceTimeReachingTooltip=Total time traveled reaching in this race
-raceTimeUpwindTooltip=Total time traveled upwind in this race
\ No newline at end of file
+raceTimeUpwindTooltip=Total time traveled upwind in this race
+lineAngleToWindAndAdvantage=length: {0}m; angle to wind: {1}deg; {2} side is {3}m ahead
\ No newline at end of file
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties
index a1922cbc5ef..5176ff6e020 100755
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties
@@ -804,4 +804,5 @@ timeUpwind=Zeit Kreuz
raceTimeTooltip=Die für dieses Rennen benötigte Zeit
raceTimeDownwindTooltip=Die in diesem Rennen auf Vorwind gesegelte Zeit
raceTimeReachingTooltip=Die in diesem Rennen auf Holeschlage gesegelte Zeit
-raceTimeUpwindTooltip=Diw in diesem Rennen auf Kreuz gesegelte Zeit
\ No newline at end of file
+raceTimeUpwindTooltip=Diw in diesem Rennen auf Kreuz gesegelte Zeit
+lineAngleToWindAndAdvantage=LängeÖ {0}m; Winkel zum Wind: {1}°; {2}-Seite ist {3}m bevorteilt
\ No newline at end of file
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 c1b0aa18ea6..d22bfd11479 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
@@ -54,7 +54,6 @@ import com.google.gwt.user.client.ui.RequiresResize;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.ManeuverType;
-import com.sap.sailing.domain.common.NauticalSide;
import com.sap.sailing.domain.common.RaceIdentifier;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.Tack;
@@ -843,19 +842,6 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe
}
}
- /**
- * If {@link #lastCombinedWindTrackInfoDTO} is valid and has a wind fix, the first fix is delivered, null otherwise.
- */
- private WindDTO getCombinedWind() {
- final WindDTO result;
- if (lastCombinedWindTrackInfoDTO != null && lastCombinedWindTrackInfoDTO.windFixes != null && !lastCombinedWindTrackInfoDTO.windFixes.isEmpty()) {
- result = lastCombinedWindTrackInfoDTO.windFixes.get(0);
- } else {
- result = null;
- }
- return result;
- }
-
private void showStartAndFinishLines(final CoursePositionsDTO courseDTO) {
if (map != null && courseDTO != null && lastRaceTimesInfo != null) {
Pair leadingVisibleCompetitorInfo = getLeadingVisibleCompetitorInfo(getCompetitorsToShow());
@@ -884,13 +870,17 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe
startLine.addMouseOverHandler(new MouseOverMapHandler() {
@Override
public void onEvent(MouseOverMapEvent event) {
- // TODO bug 1026: add start line bias to tool tip; wind data is available from lastCombinedWindTrackInfoDTO
- final Triple angleToWindAndAdvantage;
- WindDTO combinedWind = getCombinedWind();
- if (combinedWind != null) {
- angleToWindAndAdvantage = getAngleToWindAndAdvantage(combinedWind, courseDTO.startMarkPositions.get(0), courseDTO.startMarkPositions.get(1));
+ final String advantageText;
+ if (courseDTO.startLineAngleToCombinedWind != null) {
+ advantageText = " "+stringMessages.lineAngleToWindAndAdvantage(
+ NumberFormat.getFormat("0.0").format(courseDTO.startLineLengthInMeters),
+ NumberFormat.getFormat("0.0").format(courseDTO.startLineAngleToCombinedWind),
+ courseDTO.startLineAdvantageousSide.name().charAt(0)+courseDTO.startLineAdvantageousSide.name().substring(1).toLowerCase(),
+ NumberFormat.getFormat("0.0").format(courseDTO.startLineAdvantageInMeters));
+ } else {
+ advantageText = "";
}
- map.setTitle(stringMessages.startLine());
+ map.setTitle(stringMessages.startLine()+advantageText);
}
});
startLine.addMouseOutMoveHandler(new MouseOutMapHandler() {
@@ -936,8 +926,17 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe
finishLine.addMouseOverHandler(new MouseOverMapHandler() {
@Override
public void onEvent(MouseOverMapEvent event) {
- // TODO bug 1026: add start (and finish) line bias to tool tip; wind data is available from lastCombinedWindTrackInfoDTO
- map.setTitle(stringMessages.finishLine());
+ final String advantageText;
+ if (courseDTO.startLineAngleToCombinedWind != null) {
+ advantageText = " "+stringMessages.lineAngleToWindAndAdvantage(
+ NumberFormat.getFormat("0.0").format(courseDTO.finishLineLengthInMeters),
+ NumberFormat.getFormat("0.0").format(courseDTO.finishLineAngleToCombinedWind),
+ courseDTO.startLineAdvantageousSide.name().charAt(0)+courseDTO.finishLineAdvantageousSide.name().substring(1).toLowerCase(),
+ NumberFormat.getFormat("0.0").format(courseDTO.finishLineAdvantageInMeters));
+ } else {
+ advantageText = "";
+ }
+ map.setTitle(stringMessages.finishLine()+advantageText);
}
});
finishLine.addMouseOutMoveHandler(new MouseOutMapHandler() {
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 e3fb46b0cff..16ddd79b5a4 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
@@ -346,11 +346,11 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
public SailingServiceImpl() {
BundleContext context = Activator.getDefault();
- baseDomainFactory = getService().getBaseDomainFactory();
mongoObjectFactory = MongoFactory.INSTANCE.getDefaultMongoObjectFactory();
domainObjectFactory = MongoFactory.INSTANCE.getDefaultDomainObjectFactory();
racingEventServiceTracker = createAndOpenRacingEventServiceTracker(context);
replicationServiceTracker = createAndOpenReplicationServiceTracker(context);
+ baseDomainFactory = getService().getBaseDomainFactory();
tracTracAdapter = createAndOpenTracTracAdapterTracker(context).getService().getOrCreateTracTracAdapter(baseDomainFactory);
swissTimingAdapterPersistence = SwissTimingAdapterPersistence.INSTANCE;
swissTimingAdapter = createAndOpenSwissTimingAdapterTracker(context).getService().getOrCreateSwissTimingAdapter(baseDomainFactory, swissTimingAdapterPersistence);
@@ -847,7 +847,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
} else {
effectiveStoredURI = storedURI;
}
- final RacesHandle raceHandle = getTracTracAdapter().addTracTracRace(null, regattaToAddTo,
+ final RacesHandle raceHandle = getTracTracAdapter().addTracTracRace(getService(), regattaToAddTo,
record.getParamURL(), effectiveLiveURI == null ? null : new URI(effectiveLiveURI),
new URI(effectiveStoredURI), new URI(courseDesignUpdateURI),
new MillisecondsTimePoint(record.getTrackingStartTime().asMillis()),
@@ -1487,18 +1487,20 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
// set the positions of start and finish
Waypoint firstWaypoint = course.getFirstWaypoint();
if (firstWaypoint != null) {
- final Pair, Triple> markPositionDTOsAndLineAdvantage = getMarkPositionDTOsAndLineAngleToCombinedWindInDegreesAndAdvantage(dateAsTimePoint, trackedRace, firstWaypoint);
+ final Pair, Triple, NauticalSide, Distance>> markPositionDTOsAndLineAdvantage = getMarkPositionDTOsAndLineLengthAndAngleToCombinedWindInDegreesAndAdvantage(dateAsTimePoint, trackedRace, firstWaypoint);
final List startMarkPositionDTOs = markPositionDTOsAndLineAdvantage.getA();
result.startMarkPositions = startMarkPositionDTOs;
- result.startLineAngleToCombinedWind = markPositionDTOsAndLineAdvantage.getB().getA();
+ result.startLineLengthInMeters = markPositionDTOsAndLineAdvantage.getB().getA().getA().getMeters();
+ result.startLineAngleToCombinedWind = markPositionDTOsAndLineAdvantage.getB().getA().getB();
result.startLineAdvantageousSide = markPositionDTOsAndLineAdvantage.getB().getB();
result.startLineAdvantageInMeters = markPositionDTOsAndLineAdvantage.getB().getC().getMeters();
}
Waypoint lastWaypoint = course.getLastWaypoint();
if (lastWaypoint != null) {
- final Pair, Triple> markPositionDTOsAndLineAdvantage = getMarkPositionDTOsAndLineAngleToCombinedWindInDegreesAndAdvantage(dateAsTimePoint, trackedRace, lastWaypoint);
+ final Pair, Triple, NauticalSide, Distance>> markPositionDTOsAndLineAdvantage = getMarkPositionDTOsAndLineLengthAndAngleToCombinedWindInDegreesAndAdvantage(dateAsTimePoint, trackedRace, lastWaypoint);
result.finishMarkPositions = markPositionDTOsAndLineAdvantage.getA();
- result.finishLineAngleToCombinedWind = markPositionDTOsAndLineAdvantage.getB().getA();
+ result.finishLineLengthInMeters = markPositionDTOsAndLineAdvantage.getB().getA().getA().getMeters();
+ result.finishLineAngleToCombinedWind = markPositionDTOsAndLineAdvantage.getB().getA().getB();
result.finishLineAdvantageousSide = markPositionDTOsAndLineAdvantage.getB().getB();
result.finishLineAdvantageInMeters = markPositionDTOsAndLineAdvantage.getB().getC().getMeters();
}
@@ -1631,7 +1633,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
return marksIter.hasNext() == markDTOsIter.hasNext();
}
- private Pair, Triple> getMarkPositionDTOsAndLineAngleToCombinedWindInDegreesAndAdvantage(
+ private Pair, Triple, NauticalSide, Distance>> getMarkPositionDTOsAndLineLengthAndAngleToCombinedWindInDegreesAndAdvantage(
TimePoint timePoint, TrackedRace trackedRace, Waypoint waypoint) {
List markPositionDTOs = new ArrayList();
List markPositions = new ArrayList();
@@ -1648,7 +1650,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
allMarksHavePositions = false;
}
}
- final Triple lineAngleAndAdvantage;
+ final Triple, NauticalSide, Distance> lineLengthAndAngleAndAdvantage;
if (allMarksHavePositions && numberOfMarks == 2) {
Wind combinedWind = trackedRace.getWind(markPositions.get(0), timePoint);
Distance distanceFromFirstToSecondMark = markPositions.get(1).alongTrackDistance(markPositions.get(0), combinedWind.getFrom());
@@ -1672,13 +1674,14 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
} else {
advantageousSide = NauticalSide.PORT;
}
- lineAngleAndAdvantage = new Triple(
- leewardMark.getBearingGreatCircle(windwardMark).getDifferenceTo(combinedWind.getFrom()).getDegrees(),
+ lineLengthAndAngleAndAdvantage = new Triple, NauticalSide, Distance>(
+ new Pair(leewardMark.getDistance(windwardMark),
+ Math.abs(leewardMark.getBearingGreatCircle(windwardMark).getDifferenceTo(combinedWind.getFrom()).getDegrees())),
advantageousSide, distanceAdvantage);
} else {
- lineAngleAndAdvantage = null;
+ lineLengthAndAngleAndAdvantage = null;
}
- return new Pair, Triple>(markPositionDTOs, lineAngleAndAdvantage);
+ return new Pair, Triple, NauticalSide, Distance>>(markPositionDTOs, lineLengthAndAngleAndAdvantage);
}
private List getQuickRanks(RegattaAndRaceIdentifier raceIdentifier, Date date) throws NoWindException {
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/CoursePositionsDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/CoursePositionsDTO.java
index 5e02a088af5..9b7c950148b 100644
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/CoursePositionsDTO.java
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/CoursePositionsDTO.java
@@ -12,10 +12,24 @@ public class CoursePositionsDTO implements IsSerializable {
public List startMarkPositions;
public List finishMarkPositions;
public Set marks;
+
+ /**
+ * null if the start waypoint does not have exactly two marks with valid positions; in this case,
+ * {@link #startLineAdvantageousSide}, {@link #startLineAdvantageInMeters} and {@link #startLineLengthInMeters} are
+ * also both null.
+ */
public Double startLineAngleToCombinedWind;
public NauticalSide startLineAdvantageousSide;
public Double startLineAdvantageInMeters;
+ public Double startLineLengthInMeters;
+
+ /**
+ * null if the finish waypoint does not have exactly two marks with valid positions; in this case,
+ * {@link #finishLineAdvantageousSide}, {@link #finishLineAdvantageInMeters} and
+ * {@link #finishLineAdvantageInMeters} are also both null.
+ */
public Double finishLineAngleToCombinedWind;
public NauticalSide finishLineAdvantageousSide;
public Double finishLineAdvantageInMeters;
+ public Double finishLineLengthInMeters;
}
diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy).launch b/java/com.sap.sailing.server/SailingServer (No Proxy).launch
index ffa53ac74e2..cbc5b8fb81b 100755
--- a/java/com.sap.sailing.server/SailingServer (No Proxy).launch
+++ b/java/com.sap.sailing.server/SailingServer (No Proxy).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 77e917122fc..144319dd98d 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, Monitoring).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Monitoring).launch
index 871a4c361dc..7df0e7df483 100644
--- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Monitoring).launch
+++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Monitoring).launch
@@ -26,6 +26,6 @@
-
+
diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, No Tests).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, No Tests).launch
index 74b58322c07..deb6b1ee41f 100755
--- a/java/com.sap.sailing.server/SailingServer (No Proxy, No Tests).launch
+++ b/java/com.sap.sailing.server/SailingServer (No Proxy, No Tests).launch
@@ -25,5 +25,5 @@
-
+
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 0e310c59ce8..7b2a6e6b352 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
@@ -25,5 +25,5 @@
-
+