Merge branch 'master' into test

This commit is contained in:
Axel Uhl committed 2011-06-19 12:24:15 +02:00
commit c078c3b6a0
9 files changed
+71 -16

No files matched your search

Regular → Executable
+2 -2
View File
@@ -1,9 +1,9 @@
Axel
====
- Axel liefert stabiles (zumindest im Bezug auf druckbetankte Daten) start und finish basierend auf MarkPassings + threshold (30)
- sort mark passing using Collections.sort and don't use a TreeSet
- when a race for an event arrives with a different boat class, open up a new Event
- Distribute wind data to their respective races
- Pass final production instance URL information to BeTomorrow for wind integration
@@ -380,16 +380,28 @@ public class DomainFactoryImpl implements DomainFactory {
synchronized (raceCache) {
RaceDefinition result = raceCache.get(race);
if (result == null) {
BoatClass boatClass = null;
final List<Competitor> competitors = new ArrayList<Competitor>();
Map<BoatClass, Integer> countsPerBoatClass = new HashMap<BoatClass, Integer>();
BoatClass dominantBoatClass = null;
int numberOfCompetitorsInDominantBoatClass = 0;
for (RaceCompetitor rc : race.getRaceCompetitorList()) {
com.tractrac.clientmodule.Competitor competitor = rc.getCompetitor();
BoatClass boatClass = getBoatClass(competitor.getCompetitorClass());
Integer boatClassCount = countsPerBoatClass.get(boatClass);
if (boatClassCount == null) {
boatClassCount = 0;
}
countsPerBoatClass.put(boatClass, boatClassCount++);
if (boatClassCount > numberOfCompetitorsInDominantBoatClass) {
numberOfCompetitorsInDominantBoatClass = boatClassCount;
dominantBoatClass = boatClass;
}
if (boatClass == null) {
boatClass = getBoatClass(competitor.getCompetitorClass());
}
competitors.add(getCompetitor(rc.getCompetitor()));
}
result = new RaceDefinitionImpl(race.getName(), course, boatClass, competitors);
result = new RaceDefinitionImpl(race.getName(), course, dominantBoatClass, competitors);
synchronized (raceCache) {
raceCache.put(race, result);
raceCache.notifyAll();
@@ -65,7 +65,7 @@ public class RaceStartedAndFinishedReceiver extends AbstractReceiverWithQueue<Ra
DynamicTrackedRace race = trackedEvent.getTrackedRace(raceDefinition);
MillisecondsTimePoint start = new MillisecondsTimePoint(event.getB().getStartTime());
if (race.getStart() == null || !race.getStart().equals(start)) {
race.setStart(start);
race.setStartTimeReceived(start);
}
}
@@ -26,7 +26,12 @@ public interface DynamicTrackedRace extends TrackedRace {
*/
void updateMarkPassings(Competitor competitor, Iterable<MarkPassing> markPassings);
void setStart(TimePoint start);
/**
* Sets the start time as received from the tracking infrastructure. This isn't necessarily
* what {@link #getStart()} will deliver which assumes that the time announced here may be
* significantly off.
*/
void setStartTimeReceived(TimePoint start);
void setMillisecondsOverWhichToAverageSpeed(long millisecondsOverWhichToAverageSpeed);
@@ -28,8 +28,18 @@ import com.sap.sailing.domain.base.Waypoint;
*
*/
public interface TrackedRace {
final long MAX_TIME_BETWEEN_START_AND_FIRST_MARK_PASSING_IN_MILLISECONDS = 30000;
RaceDefinition getRace();
/**
* Computes the estimated start time for this race. When there are no {@link MarkPassing}s for the first mark, the
* start time received from the tracking infrastructure is used. This is also used if there are mark passings for
* the first mark and the start time is less than
* {@link #MAX_TIME_BETWEEN_START_AND_FIRST_MARK_PASSING_IN_MILLISECONDS} before the first mark passing for the
* first mark. Otherwise, the first mark passing for the first mark minus
* {@link #MAX_TIME_BETWEEN_START_AND_FIRST_MARK_PASSING_IN_MILLISECONDS} is returned as the race start time.
*/
TimePoint getStart();
Iterable<TrackedLeg> getTrackedLegs();
@@ -52,7 +52,7 @@ public class DynamicTrackedRaceImpl extends TrackedRaceImpl implements
track.addGPSFix(fix); // the track notifies this tracked race which in turn notifies its listeners
if (getStart() == null || getStart().compareTo(fix.getTimePoint())>0) {
// infer race start time from fix; earliest fix received defines start if earlier than assumed start so far
setStart(fix.getTimePoint());
setStartTimeReceived(fix.getTimePoint());
}
updated(fix.getTimePoint());
}
@@ -196,8 +196,8 @@ public class DynamicTrackedRaceImpl extends TrackedRaceImpl implements
}
@Override
public void setStart(TimePoint start) {
super.setStart(start);
public void setStartTimeReceived(TimePoint start) {
super.setStartTimeReceived(start);
}
@Override
@@ -59,8 +59,12 @@ public class RaceRankComparator implements Comparator<Competitor> {
result = o1MarkPassings.last().getTimePoint().compareTo(o2MarkPassings.last().getTimePoint());
} else {
TrackedLegOfCompetitor o2Leg = trackedRace.getCurrentLeg(o2, timePoint);
result = new WindwardToGoComparator(trackedRace.getTrackedLeg(o1Leg.getLeg()), timePoint).compare(
o1Leg, o2Leg);
if (o2Leg == null) {
result = 1; // o1Leg != null, so o1 has started leg already, o2 hasn't
} else {
result = new WindwardToGoComparator(trackedRace.getTrackedLeg(o1Leg.getLeg()), timePoint)
.compare(o1Leg, o2Leg);
}
}
}
}
@@ -3,6 +3,7 @@ package com.sap.sailing.domain.tracking.impl;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -45,7 +46,11 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener {
*/
private TimePoint startOfTracking;
private TimePoint start;
/**
* Race start time as announced by the tracking infrastructure
*/
private TimePoint startTimeReceived;
private TimePoint timePointOfNewestEvent;
private TimePoint timePointOfLastEvent;
private long updateCount;
@@ -142,11 +147,30 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener {
@Override
public TimePoint getStart() {
return start;
TimePoint result;
Iterator<MarkPassing> markPassingsFirstMarkIter = getMarkPassingsInOrder(getRace().getCourse().getWaypoints().iterator().next()).iterator();
if (markPassingsFirstMarkIter.hasNext()) {
MarkPassing firstMarkPassingFirstMark = markPassingsFirstMarkIter.next();
TimePoint timeOfFirstMarkPassingFirstMark = firstMarkPassingFirstMark.getTimePoint();
if (startTimeReceived != null) {
long startTimeReceived2timeOfFirstMarkPassingFirstMark = timeOfFirstMarkPassingFirstMark.asMillis() -
startTimeReceived.asMillis();
if (startTimeReceived2timeOfFirstMarkPassingFirstMark > MAX_TIME_BETWEEN_START_AND_FIRST_MARK_PASSING_IN_MILLISECONDS) {
result = new MillisecondsTimePoint(timeOfFirstMarkPassingFirstMark.asMillis() - MAX_TIME_BETWEEN_START_AND_FIRST_MARK_PASSING_IN_MILLISECONDS);
} else {
result = startTimeReceived;
}
} else {
result = timeOfFirstMarkPassingFirstMark;
}
} else {
result = startTimeReceived;
}
return result;
}
protected void setStart(TimePoint start) {
this.start = start;
protected void setStartTimeReceived(TimePoint start) {
this.startTimeReceived = start;
}
@Override
@@ -214,7 +214,7 @@ public class MockedTrackedRace implements DynamicTrackedRace {
}
@Override
public void setStart(TimePoint start) {
public void setStartTimeReceived(TimePoint start) {
// TODO Auto-generated method stub
}