added fields to LegEntryDTO for leg start mark passing side and gap change during the leg

This commit is contained in:
Axel Uhl committed 2012-12-06 13:54:09 -02:00
1 parent aaa76026d1
commit 742ce26b00
10 files changed
+97 -31

No files matched your search

@@ -9,12 +9,12 @@ import com.sap.sailing.domain.common.Tack;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.tracking.MarkPassingManeuver;
public class MarkpassingManeuverImpl extends ManeuverImpl implements MarkPassingManeuver {
public class MarkPassingManeuverImpl extends ManeuverImpl implements MarkPassingManeuver {
private static final long serialVersionUID = 8935348908557191614L;
private final Waypoint waypointPassed;
private final Tack side;
public MarkpassingManeuverImpl(ManeuverType type, Tack newTack, Position position, TimePoint timePoint,
public MarkPassingManeuverImpl(ManeuverType type, Tack newTack, Position position, TimePoint timePoint,
SpeedWithBearing speedWithBearingBefore, SpeedWithBearing speedWithBearingAfter,
double directionChangeInDegrees, Distance maneuverLoss, Waypoint waypointPassed, Tack side) {
super(type, newTack, position, timePoint, speedWithBearingBefore, speedWithBearingAfter,
@@ -1977,7 +1977,7 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener {
}
final Maneuver maneuver;
if (maneuverType == ManeuverType.MARK_PASSING) {
maneuver = new MarkpassingManeuverImpl(maneuverType, tackAfterManeuver, maneuverPosition, maneuverTimePoint,
maneuver = new MarkPassingManeuverImpl(maneuverType, tackAfterManeuver, maneuverPosition, maneuverTimePoint,
speedWithBearingOnApproximationAtBeginning, speedWithBearingOnApproximationAtEnd,
totalCourseChangeInDegrees, maneuverLoss, waypointPassed, sideToWhichWaypointWasPassed);
} else {
@@ -442,4 +442,5 @@ public interface StringMessages extends Messages {
String overallLeaderboardSelection();
String showOverallLeaderboardOnSamePage();
String errorTryingToObtainOverallLeaderboards(String message);
String passedTo(String name);
}
@@ -442,4 +442,5 @@ afterRace=after race
showRankChart=Show rank chart
overallLeaderboardSelection=Overall Leaderboard
showOverallLeaderboardOnSamePage=Show overall leaderboard on same page
errorTryingToObtainOverallLeaderboards=Error trying to obtain overall leaderboards: {0}
errorTryingToObtainOverallLeaderboards=Error trying to obtain overall leaderboards: {0}
passedTo=passed to {0}
@@ -443,4 +443,5 @@ afterRace=nach Rennen
showRankChart=Rang-Diagramm anzeigen
overallLeaderboardSelection=Gesamtergebnisse
showOverallLeaderboardOnSamePage=Gesamtergebnisse auf derselben Seite anzeigen
errorTryingToObtainOverallLeaderboards=Fehler beim Laden der Gesamtergebnisse: {0}
errorTryingToObtainOverallLeaderboards=Fehler beim Laden der Gesamtergebnisse: {0}
passedTo=an {0} gerundet
@@ -36,7 +36,6 @@ import org.osgi.framework.BundleContext;
import org.osgi.util.tracker.ServiceTracker;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.ControlPoint;
import com.sap.sailing.domain.base.Course;
@@ -44,6 +43,7 @@ import com.sap.sailing.domain.base.Event;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.Gate;
import com.sap.sailing.domain.base.Leg;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.base.RaceColumnInSeries;
import com.sap.sailing.domain.base.RaceDefinition;
@@ -108,6 +108,7 @@ import com.sap.sailing.domain.tracking.GPSFixMoving;
import com.sap.sailing.domain.tracking.GPSFixTrack;
import com.sap.sailing.domain.tracking.Maneuver;
import com.sap.sailing.domain.tracking.MarkPassing;
import com.sap.sailing.domain.tracking.MarkPassingManeuver;
import com.sap.sailing.domain.tracking.RaceChangeListener;
import com.sap.sailing.domain.tracking.RaceTracker;
import com.sap.sailing.domain.tracking.RacesHandle;
@@ -128,9 +129,9 @@ import com.sap.sailing.geocoding.ReverseGeocoder;
import com.sap.sailing.gwt.ui.client.SailingService;
import com.sap.sailing.gwt.ui.shared.BoatClassDTO;
import com.sap.sailing.gwt.ui.shared.BulkScoreCorrectionDTO;
import com.sap.sailing.gwt.ui.shared.MarkDTO;
import com.sap.sailing.gwt.ui.shared.CompetitorDTO;
import com.sap.sailing.gwt.ui.shared.CompetitorRaceDataDTO;
import com.sap.sailing.gwt.ui.shared.CompetitorsRaceDataDTO;
import com.sap.sailing.gwt.ui.shared.ControlPointDTO;
import com.sap.sailing.gwt.ui.shared.CourseDTO;
import com.sap.sailing.gwt.ui.shared.EventDTO;
@@ -144,15 +145,16 @@ import com.sap.sailing.gwt.ui.shared.LeaderboardRowDTO;
import com.sap.sailing.gwt.ui.shared.LegEntryDTO;
import com.sap.sailing.gwt.ui.shared.LegInfoDTO;
import com.sap.sailing.gwt.ui.shared.ManeuverDTO;
import com.sap.sailing.gwt.ui.shared.MarkDTO;
import com.sap.sailing.gwt.ui.shared.MarkPassingTimesDTO;
import com.sap.sailing.gwt.ui.shared.CompetitorsRaceDataDTO;
import com.sap.sailing.gwt.ui.shared.MarkpassingManeuverDTO;
import com.sap.sailing.gwt.ui.shared.PlacemarkDTO;
import com.sap.sailing.gwt.ui.shared.PlacemarkOrderDTO;
import com.sap.sailing.gwt.ui.shared.PositionDTO;
import com.sap.sailing.gwt.ui.shared.QuickRankDTO;
import com.sap.sailing.gwt.ui.shared.RaceCourseMarksDTO;
import com.sap.sailing.gwt.ui.shared.RaceColumnDTO;
import com.sap.sailing.gwt.ui.shared.RaceColumnInSeriesDTO;
import com.sap.sailing.gwt.ui.shared.RaceCourseMarksDTO;
import com.sap.sailing.gwt.ui.shared.RaceDTO;
import com.sap.sailing.gwt.ui.shared.RaceMapDataDTO;
import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO;
@@ -830,6 +832,13 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
result.finished = trackedLeg.hasFinishedLeg(timePoint);
result.gapToLeaderInSeconds = trackedLeg.getGapToLeaderInSeconds(timePoint,
legRanksCache.get(trackedLeg.getLeg()).entrySet().iterator().next().getKey());
if (result.gapToLeaderInSeconds != null && result.timeInMilliseconds != null) {
TimePoint timeAtLegStart = timePoint.minus(result.timeInMilliseconds);
Double gapAtLegStart = trackedLeg.getGapToLeaderInSeconds(timeAtLegStart);
if (gapAtLegStart != null) {
result.gapChangeSinceLegStart = result.gapToLeaderInSeconds - gapAtLegStart;
}
}
LinkedHashMap<Competitor, Integer> legRanks = legRanksCache.get(trackedLeg.getLeg());
if (legRanks != null) {
result.rank = legRanks.get(trackedLeg.getCompetitor());
@@ -868,6 +877,12 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
totalManeuverLossInMeters.get(maneuver.getType()) + maneuver.getManeuverLoss().getMeters());
}
break;
case MARK_PASSING:
MarkPassingManeuver mpm = (MarkPassingManeuver) maneuver;
if (mpm.getWaypointPassed() == trackedLeg.getLeg().getFrom()) {
result.sideToWhichMarkAtLegStartWasRounded = mpm.getSide();
}
break;
}
}
result.averageManeuverLossInMeters = new HashMap<ManeuverType, Double>();
@@ -2458,12 +2473,23 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
private List<ManeuverDTO> createManeuverDTOsForCompetitor(List<Maneuver> maneuvers, TrackedRace trackedRace, Competitor competitor) {
List<ManeuverDTO> result = new ArrayList<ManeuverDTO>();
for (Maneuver maneuver : maneuvers) {
ManeuverDTO maneuverDTO = new ManeuverDTO(maneuver.getType(), maneuver.getNewTack(),
final ManeuverDTO maneuverDTO;
if (maneuver.getType() == ManeuverType.MARK_PASSING) {
maneuverDTO = new MarkpassingManeuverDTO(maneuver.getType(), maneuver.getNewTack(),
new PositionDTO(maneuver.getPosition().getLatDeg(), maneuver.getPosition().getLngDeg()),
maneuver.getTimePoint().asDate(),
createSpeedWithBearingDTO(maneuver.getSpeedWithBearingBefore()),
createSpeedWithBearingDTO(maneuver.getSpeedWithBearingAfter()),
maneuver.getDirectionChangeInDegrees(), maneuver.getManeuverLoss()==null?null:maneuver.getManeuverLoss().getMeters());
maneuver.getDirectionChangeInDegrees(), maneuver.getManeuverLoss()==null?null:maneuver.getManeuverLoss().getMeters(),
((MarkPassingManeuver) maneuver).getSide());
} else {
maneuverDTO = new ManeuverDTO(maneuver.getType(), maneuver.getNewTack(),
new PositionDTO(maneuver.getPosition().getLatDeg(), maneuver.getPosition().getLngDeg()),
maneuver.getTimePoint().asDate(),
createSpeedWithBearingDTO(maneuver.getSpeedWithBearingBefore()),
createSpeedWithBearingDTO(maneuver.getSpeedWithBearingAfter()),
maneuver.getDirectionChangeInDegrees(), maneuver.getManeuverLoss()==null?null:maneuver.getManeuverLoss().getMeters());
}
result.add(maneuverDTO);
}
return result;
@@ -4,6 +4,7 @@ import java.util.Map;
import com.google.gwt.user.client.rpc.IsSerializable;
import com.sap.sailing.domain.common.ManeuverType;
import com.sap.sailing.domain.common.Tack;
/**
* Holds data about one competitor's performance in one leg of one race represented in the
@@ -18,6 +19,8 @@ public class LegEntryDTO implements IsSerializable {
public Double averageSpeedOverGroundInKnots;
public int rank;
public Double gapToLeaderInSeconds;
public Double gapChangeSinceLegStart;
public Tack sideToWhichMarkAtLegStartWasRounded;
public Double estimatedTimeToNextWaypointInSeconds;
/**
@@ -2,9 +2,13 @@ package com.sap.sailing.gwt.ui.shared;
import java.util.Date;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.user.client.rpc.IsSerializable;
import com.sap.sailing.domain.common.ManeuverType;
import com.sap.sailing.domain.common.Tack;
import com.sap.sailing.gwt.ui.client.StringMessages;
public class ManeuverDTO implements IsSerializable {
public ManeuverType type;
@@ -37,5 +41,23 @@ public class ManeuverDTO implements IsSerializable {
this.directionChangeInDegrees = directionChangeInDegrees;
this.maneuverLossInMeters = maneuverLossInMeters;
}
public String toString(StringMessages stringMessages) {
SpeedWithBearingDTO before = this.speedWithBearingBefore;
SpeedWithBearingDTO after = this.speedWithBearingAfter;
String timeAndManeuver = DateTimeFormat.getFormat(PredefinedFormat.TIME_FULL).format(this.timepoint)
+ ": " + this.type.name();
String directionChange = stringMessages.directionChange() + ": "
+ ((int) this.directionChangeInDegrees) + " "+stringMessages.degreesShort()+" ("
+ ((int) before.bearingInDegrees) + " deg -> " + ((int) after.bearingInDegrees) + " "+stringMessages.degreesShort()+")";
String speedChange = stringMessages.speedChange() + ": "
+ NumberFormat.getDecimalFormat().format(after.speedInKnots - before.speedInKnots) + " "+stringMessages.averageSpeedInKnotsUnit()+" ("
+ NumberFormat.getDecimalFormat().format(before.speedInKnots) + " "+stringMessages.averageSpeedInKnotsUnit()+" -> "
+ NumberFormat.getDecimalFormat().format(after.speedInKnots) + " "+stringMessages.averageSpeedInKnotsUnit()+")";
String maneuverLoss = this.maneuverLossInMeters == null ? "" : ("; "+stringMessages.maneuverLoss()+": "+
NumberFormat.getDecimalFormat().format(this.maneuverLossInMeters)+"m");
String maneuverTitle = timeAndManeuver + "; " + directionChange + "; " + speedChange + maneuverLoss;
return maneuverTitle;
}
}
@@ -0,0 +1,29 @@
package com.sap.sailing.gwt.ui.shared;
import java.util.Date;
import com.sap.sailing.domain.common.ManeuverType;
import com.sap.sailing.domain.common.Tack;
import com.sap.sailing.gwt.ui.client.StringMessages;
public class MarkpassingManeuverDTO extends ManeuverDTO {
public Tack side;
MarkpassingManeuverDTO() {}
public MarkpassingManeuverDTO(ManeuverType type, Tack newTack, PositionDTO position, Date timepoint,
SpeedWithBearingDTO speedWithBearingBefore, SpeedWithBearingDTO speedWithBearingAfter,
double directionChangeInDegrees, Double maneuverLossInMeters, Tack side) {
super(type, newTack, position, timepoint, speedWithBearingBefore, speedWithBearingAfter, directionChangeInDegrees,
maneuverLossInMeters);
this.side = side;
}
@Override
public String toString(StringMessages stringMessages) {
StringBuilder result = new StringBuilder(super.toString(stringMessages));
result.append(", ");
result.append(stringMessages.passedTo(side.name()));
return result.toString();
}
}
@@ -17,8 +17,6 @@ import java.util.Set;
import com.google.gwt.dom.client.Style;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.maps.client.InfoWindowContent;
import com.google.gwt.maps.client.MapWidget;
@@ -75,17 +73,16 @@ import com.sap.sailing.gwt.ui.client.TimeListener;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.client.Timer.PlayStates;
import com.sap.sailing.gwt.ui.client.WindSourceTypeFormatter;
import com.sap.sailing.gwt.ui.shared.MarkDTO;
import com.sap.sailing.gwt.ui.shared.CompetitorDTO;
import com.sap.sailing.gwt.ui.shared.CourseDTO;
import com.sap.sailing.gwt.ui.shared.GPSFixDTO;
import com.sap.sailing.gwt.ui.shared.LegInfoDTO;
import com.sap.sailing.gwt.ui.shared.ManeuverDTO;
import com.sap.sailing.gwt.ui.shared.MarkDTO;
import com.sap.sailing.gwt.ui.shared.PositionDTO;
import com.sap.sailing.gwt.ui.shared.QuickRankDTO;
import com.sap.sailing.gwt.ui.shared.RaceMapDataDTO;
import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO;
import com.sap.sailing.gwt.ui.shared.SpeedWithBearingDTO;
import com.sap.sailing.gwt.ui.shared.WindDTO;
import com.sap.sailing.gwt.ui.shared.WindInfoForRaceDTO;
import com.sap.sailing.gwt.ui.shared.WindTrackInfoDTO;
@@ -1286,21 +1283,7 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe
LatLng latLng = LatLng.newInstance(maneuver.position.latDeg, maneuver.position.lngDeg);
MarkerOptions options = MarkerOptions.newInstance();
//TODO Introduce user role dependent view (Spectator, Admin)
SpeedWithBearingDTO before = maneuver.speedWithBearingBefore;
SpeedWithBearingDTO after = maneuver.speedWithBearingAfter;
String timeAndManeuver = DateTimeFormat.getFormat(PredefinedFormat.TIME_FULL).format(maneuver.timepoint)
+ ": " + maneuver.type.name();
String directionChange = stringMessages.directionChange() + ": "
+ ((int) maneuver.directionChangeInDegrees) + " "+stringMessages.degreesShort()+" ("
+ ((int) before.bearingInDegrees) + " deg -> " + ((int) after.bearingInDegrees) + " "+stringMessages.degreesShort()+")";
String speedChange = stringMessages.speedChange() + ": "
+ NumberFormat.getDecimalFormat().format(after.speedInKnots - before.speedInKnots) + " "+stringMessages.averageSpeedInKnotsUnit()+" ("
+ NumberFormat.getDecimalFormat().format(before.speedInKnots) + " "+stringMessages.averageSpeedInKnotsUnit()+" -> "
+ NumberFormat.getDecimalFormat().format(after.speedInKnots) + " "+stringMessages.averageSpeedInKnotsUnit()+")";
String maneuverLoss = maneuver.maneuverLossInMeters == null ? "" : ("; "+stringMessages.maneuverLoss()+": "+
NumberFormat.getDecimalFormat().format(maneuver.maneuverLossInMeters)+"m");
options.setTitle(timeAndManeuver + "; " + directionChange + "; " + speedChange + maneuverLoss);
options.setTitle(maneuver.toString(stringMessages));
options.setIcon(raceMapImageManager.maneuverIconsForTypeAndTargetTack
.get(new Util.Pair<ManeuverType, Tack>(maneuver.type, maneuver.newTack)));
Marker marker = new Marker(latLng, options);