Merge branch 'master' into spectator

This commit is contained in:
Lennart Hensler committed 2012-02-13 11:34:47 +01:00
commit 884a655c4c
5 files changed
+71 -159

No files matched your search

@@ -454,4 +454,10 @@ public class MockedTrackedRace implements DynamicTrackedRace {
return null;
}
@Override
public Distance getDistanceTraveled(Competitor competitor, TimePoint timePoint) {
// TODO Auto-generated method stub
return null;
}
}
@@ -278,5 +278,7 @@ public interface TrackedRace {
boolean raceIsKnownToStartUpwind();
void addListener(RaceChangeListener listener);
Distance getDistanceTraveled(Competitor competitor, TimePoint timePoint);
}
@@ -257,6 +257,22 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener {
return trackedLegs.values();
}
@Override
public Distance getDistanceTraveled(Competitor competitor, TimePoint timePoint) {
NavigableSet<MarkPassing> markPassings = getMarkPassings(competitor);
if (markPassings.isEmpty()) {
return null;
} else {
TimePoint end = timePoint;
if (markPassings.last().getWaypoint() == getRace().getCourse().getLastWaypoint() &&
timePoint.compareTo(markPassings.last().getTimePoint()) > 0) {
// competitor has finished race; use time point of crossing the finish line
end = markPassings.last().getTimePoint();
}
return getTrack(competitor).getDistanceTraveled(markPassings.first().getTimePoint(), end);
}
}
@Override
public GPSFixTrack<Competitor, GPSFixMoving> getTrack(Competitor competitor) {
return tracks.get(competitor);
@@ -253,13 +253,14 @@ implements CompetitorSelectionChangeListener, RaceSelectionChangeListener, TimeL
private void doLoadData() {
final List<CompetitorDTO> competitorsToLoad = new ArrayList<CompetitorDTO>();
// Assumption: for those competitors shown in chart we already have all data that's needed (TODO: what to do in live mode?)
// Therefore, we only need to load race data for those to be shown but not yet in the chart. Find them:
for (CompetitorDTO competitor : competitorSelectionProvider.getAllCompetitors()) {
if (isCompetitorVisible(competitor) && !seriesByCompetitor.keySet().contains(competitor)) {
competitorsToLoad.add(competitor);
}
}
final CompetitorsAndTimePointsDTO competitorsAndTimePointsToLoad = new CompetitorsAndTimePointsDTO(
getStepsToLoad());
final CompetitorsAndTimePointsDTO competitorsAndTimePointsToLoad = new CompetitorsAndTimePointsDTO(getStepsToLoad());
competitorsAndTimePointsToLoad.setStartTime(getCompetitorsAndTimePointsDTO().getStartTime());
competitorsAndTimePointsToLoad.setTimePointOfNewestEvent(getCompetitorsAndTimePointsDTO()
.getTimePointOfNewestEvent());
@@ -1307,6 +1307,36 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
}
return null;
}
private Double getCompetitorRaceDataEntry(DetailType dataType, TrackedRace trackedRace, Competitor competitor,
TimePoint timePoint) throws NoWindException {
Double result = null;
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(competitor, timePoint);
if (trackedLeg != null) {
switch (dataType) {
case CURRENT_SPEED_OVER_GROUND_IN_KNOTS:
SpeedWithBearing speedOverGround = trackedLeg.getSpeedOverGround(timePoint);
result = (speedOverGround == null) ? null : speedOverGround.getKnots();
break;
case VELOCITY_MADE_GOOD_IN_KNOTS:
Speed velocityMadeGood = trackedLeg.getVelocityMadeGood(timePoint);
result = (velocityMadeGood == null) ? null : velocityMadeGood.getKnots();
break;
case DISTANCE_TRAVELED:
Distance distanceTraveled = trackedRace.getDistanceTraveled(competitor, timePoint);
result = distanceTraveled == null ? null : distanceTraveled.getMeters();
break;
case GAP_TO_LEADER_IN_SECONDS:
result = trackedLeg.getGapToLeaderInSeconds(timePoint);
break;
case WINDWARD_DISTANCE_TO_OVERALL_LEADER:
Distance distanceToLeader = trackedLeg.getWindwardDistanceToOverallLeader(timePoint);
result = (distanceToLeader == null) ? null : distanceToLeader.getMeters();
break;
}
}
return result;
}
@Override
public CompetitorInRaceDTO getCompetitorRaceData(RaceIdentifier race,
@@ -1318,165 +1348,22 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
for (CompetitorDTO cDTO : competitorAndTimePointsDTO.getCompetitors()) {
selectedCompetitors.add(getCompetitorById(trackedRace.getRace().getCompetitors(), cDTO.id));
}
switch (dataType) {
case CURRENT_SPEED_OVER_GROUND_IN_KNOTS:
for (int c = 0; c < selectedCompetitors.size(); c++) {
Double[] entries = new Double[competitorAndTimePointsDTO.getTimePoints().length];
for (int i = 0; i < competitorAndTimePointsDTO.getTimePoints().length; i++) {
MillisecondsTimePoint time = new MillisecondsTimePoint(
competitorAndTimePointsDTO.getTimePoints()[i]);
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitors.get(c), time);
if (trackedLeg != null) {
SpeedWithBearing speedOverGround = trackedLeg.getSpeedOverGround(time);
entries[i] = (speedOverGround == null) ? null : speedOverGround.getKnots();
}
}
CompetitorDTO competitor = competitorAndTimePointsDTO.getCompetitors()[c];
competitorData.setRaceData(competitor, entries);
entries = new Double[competitorAndTimePointsDTO.getMarkPassings(competitor).length];
for (int i = 0; i < competitorAndTimePointsDTO.getMarkPassings(competitor).length; i++) {
MillisecondsTimePoint time = new MillisecondsTimePoint(
competitorAndTimePointsDTO.getMarkPassings(competitor)[i].getB());
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitors.get(c), time);
if (trackedLeg != null) {
SpeedWithBearing speedOverGround = trackedLeg.getSpeedOverGround(time);
entries[i] = (speedOverGround == null) ? null : speedOverGround.getKnots();
}
}
competitorData.setMarkPassingData(competitor, entries);
for (CompetitorDTO competitorDTO : competitorAndTimePointsDTO.getCompetitors()) {
Competitor competitor = getCompetitorById(trackedRace.getRace().getCompetitors(), competitorDTO.id);
Double[] entries = new Double[competitorAndTimePointsDTO.getTimePoints().length];
for (int i = 0; i < competitorAndTimePointsDTO.getTimePoints().length; i++) {
MillisecondsTimePoint time = new MillisecondsTimePoint(
competitorAndTimePointsDTO.getTimePoints()[i]);
entries[i] = getCompetitorRaceDataEntry(dataType, trackedRace, competitor, time);
}
break;
case VELOCITY_MADE_GOOD_IN_KNOTS:
for (int c = 0; c < selectedCompetitors.size(); c++) {
Double[] entries = new Double[competitorAndTimePointsDTO.getTimePoints().length];
for (int i = 0; i < competitorAndTimePointsDTO.getTimePoints().length; i++) {
MillisecondsTimePoint time = new MillisecondsTimePoint(
competitorAndTimePointsDTO.getTimePoints()[i]);
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitors.get(c), time);
if (trackedLeg != null) {
Speed velocityMadeGood = trackedLeg.getVelocityMadeGood(time);
entries[i] = (velocityMadeGood == null) ? null : velocityMadeGood.getKnots();
}
}
competitorData.setRaceData(competitorAndTimePointsDTO.getCompetitors()[c], entries);
CompetitorDTO competitor = competitorAndTimePointsDTO.getCompetitors()[c];
entries = new Double[competitorAndTimePointsDTO.getMarkPassings(competitor).length];
for (int i = 0; i < competitorAndTimePointsDTO.getMarkPassings(competitor).length; i++) {
MillisecondsTimePoint time = new MillisecondsTimePoint(
competitorAndTimePointsDTO.getMarkPassings(competitor)[i].getB());
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitors.get(c), time);
if (trackedLeg != null) {
Speed velocityMadeGood = trackedLeg.getVelocityMadeGood(time);
entries[i] = (velocityMadeGood == null) ? null : velocityMadeGood.getKnots();
}
}
competitorData.setMarkPassingData(competitor, entries);
competitorData.setRaceData(competitorDTO, entries);
entries = new Double[competitorAndTimePointsDTO.getMarkPassings(competitorDTO).length];
for (int i = 0; i < competitorAndTimePointsDTO.getMarkPassings(competitorDTO).length; i++) {
MillisecondsTimePoint time = new MillisecondsTimePoint(
competitorAndTimePointsDTO.getMarkPassings(competitorDTO)[i].getB());
entries[i] = getCompetitorRaceDataEntry(dataType, trackedRace, competitor, time);
}
break;
case DISTANCE_TRAVELED:
for (int c = 0; c < selectedCompetitors.size(); c++) {
Double[] entries = new Double[competitorAndTimePointsDTO.getTimePoints().length];
double distanceOfPreviousLegs = 0;
double lastTraveledDistance = 0;
for (int i = 0; i < competitorAndTimePointsDTO.getTimePoints().length; i++) {
MillisecondsTimePoint time = new MillisecondsTimePoint(
competitorAndTimePointsDTO.getTimePoints()[i]);
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitors.get(c), time);
if (trackedLeg != null) {
Distance distanceTraveled = trackedLeg.getDistanceTraveled(time);
if (distanceTraveled != null) {
double d = distanceTraveled.getMeters();
if (d < lastTraveledDistance) {
distanceOfPreviousLegs += lastTraveledDistance;
}
lastTraveledDistance = d;
entries[i] = d + distanceOfPreviousLegs;
}
}
}
competitorData.setRaceData(competitorAndTimePointsDTO.getCompetitors()[c], entries);
CompetitorDTO competitor = competitorAndTimePointsDTO.getCompetitors()[c];
entries = new Double[competitorAndTimePointsDTO.getMarkPassings(competitor).length];
for (int i = 0; i < competitorAndTimePointsDTO.getMarkPassings(competitor).length; i++) {
MillisecondsTimePoint time = new MillisecondsTimePoint(
competitorAndTimePointsDTO.getMarkPassings(competitor)[i].getB());
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitors.get(c), time);
if (trackedLeg != null) {
Distance distanceTraveled = trackedLeg.getDistanceTraveled(time);
if (distanceTraveled != null) {
double d = distanceTraveled.getMeters();
if (d < lastTraveledDistance) {
distanceOfPreviousLegs += lastTraveledDistance;
}
lastTraveledDistance = d;
entries[i] = d + distanceOfPreviousLegs;
}
}
}
competitorData.setMarkPassingData(competitor, entries);
}
break;
case GAP_TO_LEADER_IN_SECONDS:
for (int c = 0; c < selectedCompetitors.size(); c++) {
Double[] entries = new Double[competitorAndTimePointsDTO.getTimePoints().length];
for (int i = 0; i < competitorAndTimePointsDTO.getTimePoints().length; i++) {
MillisecondsTimePoint time = new MillisecondsTimePoint(
competitorAndTimePointsDTO.getTimePoints()[i]);
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitors.get(c), time);
if (trackedLeg != null) {
entries[i] = trackedLeg.getGapToLeaderInSeconds(time);
}
}
competitorData.setRaceData(competitorAndTimePointsDTO.getCompetitors()[c], entries);
CompetitorDTO competitor = competitorAndTimePointsDTO.getCompetitors()[c];
entries = new Double[competitorAndTimePointsDTO.getMarkPassings(competitor).length];
for (int i = 0; i < competitorAndTimePointsDTO.getMarkPassings(competitor).length; i++) {
MillisecondsTimePoint time = new MillisecondsTimePoint(
competitorAndTimePointsDTO.getMarkPassings(competitor)[i].getB());
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitors.get(c), time);
if (trackedLeg != null) {
entries[i] = trackedLeg.getGapToLeaderInSeconds(time);
}
}
competitorData.setMarkPassingData(competitor, entries);
}
break;
case WINDWARD_DISTANCE_TO_OVERALL_LEADER:
for (int c = 0; c < selectedCompetitors.size(); c++) {
CompetitorDTO competitor = competitorAndTimePointsDTO.getCompetitors()[c];
Double[] entries = new Double[competitorAndTimePointsDTO.getTimePoints().length];
Double[] markEntries = new Double[competitorAndTimePointsDTO.getMarkPassings(competitor).length];
MillisecondsTimePoint markTime = new MillisecondsTimePoint(
competitorAndTimePointsDTO.getMarkPassings(competitor)[0].getB());
int markEntryCounter = 0;
TrackedLegOfCompetitor trackedLegforMark = trackedRace.getTrackedLeg(selectedCompetitors.get(c),
markTime);
for (int i = 0; i < competitorAndTimePointsDTO.getTimePoints().length; i++) {
MillisecondsTimePoint time = new MillisecondsTimePoint(
competitorAndTimePointsDTO.getTimePoints()[i]);
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitors.get(c), time);
if (trackedLeg != null) {
Distance distanceToLeader = trackedLeg.getWindwardDistanceToOverallLeader(time);
entries[i] = (distanceToLeader == null) ? null : distanceToLeader.getMeters();
}
if (trackedLegforMark != null && markTime.asMillis() > time.asMillis()
&& markEntryCounter < competitorAndTimePointsDTO.getMarkPassings(competitor).length) {
Distance distanceToLeader = trackedLegforMark.getWindwardDistanceToOverallLeader(markTime);
markEntries[markEntryCounter] = (distanceToLeader == null) ? null : distanceToLeader
.getMeters();
markEntryCounter++;
if (markEntryCounter < competitorAndTimePointsDTO.getMarkPassings(competitor).length) {
markTime = new MillisecondsTimePoint(
competitorAndTimePointsDTO.getMarkPassings(competitor)[markEntryCounter].getB());
trackedLegforMark = trackedRace.getTrackedLeg(selectedCompetitors.get(c), markTime);
}
}
}
competitorData.setRaceData(competitor, entries);
competitorData.setMarkPassingData(competitor, markEntries);
}
break;
competitorData.setMarkPassingData(competitorDTO, entries);
}
}
return competitorData;