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 @@ - +