added (untested) support for converting RPD messages into domain objects

This commit is contained in:
Axel Uhl committed 2011-11-15 09:48:38 +01:00
1 parent 0c4926c7ae
commit 6fa43efb50
3 files changed
+85 -5

No files matched your search

@@ -1,10 +1,13 @@
package com.sap.sailing.domain.swisstimingadapter;
import com.sap.sailing.domain.base.Buoy;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Event;
import com.sap.sailing.domain.base.Nationality;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.TimePoint;
import com.sap.sailing.domain.swisstimingadapter.impl.DomainFactoryImpl;
import com.sap.sailing.domain.tracking.GPSFixMoving;
public interface DomainFactory {
final static DomainFactory INSTANCE = new DomainFactoryImpl();
@@ -16,4 +19,10 @@ public interface DomainFactory {
Competitor getOrCreateCompetitor(com.sap.sailing.domain.swisstimingadapter.Competitor competitor);
RaceDefinition createRaceDefinition(Event event, Race race, StartList startList, Course course);
Buoy getOrCreateBuoy(String trackerID);
GPSFixMoving createGPSFix(TimePoint timePointOfTransmission, Fix fix);
Competitor getCompetitorByBoatID(String sailNumber);
}
@@ -7,6 +7,7 @@ import java.util.List;
import java.util.Map;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.Buoy;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.ControlPoint;
import com.sap.sailing.domain.base.Event;
@@ -14,12 +15,14 @@ import com.sap.sailing.domain.base.Nationality;
import com.sap.sailing.domain.base.Person;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Team;
import com.sap.sailing.domain.base.TimePoint;
import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.base.impl.BoatImpl;
import com.sap.sailing.domain.base.impl.BuoyImpl;
import com.sap.sailing.domain.base.impl.CourseImpl;
import com.sap.sailing.domain.base.impl.EventImpl;
import com.sap.sailing.domain.base.impl.GateImpl;
import com.sap.sailing.domain.base.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.base.impl.NationalityImpl;
import com.sap.sailing.domain.base.impl.PersonImpl;
import com.sap.sailing.domain.base.impl.RaceDefinitionImpl;
@@ -27,20 +30,26 @@ import com.sap.sailing.domain.base.impl.TeamImpl;
import com.sap.sailing.domain.base.impl.WaypointImpl;
import com.sap.sailing.domain.swisstimingadapter.Course;
import com.sap.sailing.domain.swisstimingadapter.DomainFactory;
import com.sap.sailing.domain.swisstimingadapter.Fix;
import com.sap.sailing.domain.swisstimingadapter.Mark;
import com.sap.sailing.domain.swisstimingadapter.MessageType;
import com.sap.sailing.domain.swisstimingadapter.Race;
import com.sap.sailing.domain.swisstimingadapter.StartList;
import com.sap.sailing.domain.tracking.GPSFixMoving;
import com.sap.sailing.domain.tracking.impl.GPSFixMovingImpl;
import com.sap.sailing.util.Util;
public class DomainFactoryImpl implements DomainFactory {
private final Map<String, Event> raceIDToEventCache;
private final Map<String, Competitor> boatIDToCompetitorCache;
private final Map<String, Buoy> buoyCache;
private final Map<Iterable<String>, ControlPoint> controlPointCache;
private final Map<String, Nationality> nationalityCache;
public DomainFactoryImpl() {
raceIDToEventCache = new HashMap<String, Event>();
boatIDToCompetitorCache = new HashMap<String, Competitor>();
buoyCache = new HashMap<String, Buoy>();
controlPointCache = new HashMap<Iterable<String>, ControlPoint>();
nationalityCache = new HashMap<String, Nationality>();
}
@@ -55,6 +64,11 @@ public class DomainFactoryImpl implements DomainFactory {
return result;
}
@Override
public Competitor getCompetitorByBoatID(String boatID) {
return boatIDToCompetitorCache.get(boatID);
}
@Override
public Competitor getOrCreateCompetitor(com.sap.sailing.domain.swisstimingadapter.Competitor competitor) {
Competitor result = boatIDToCompetitorCache.get(competitor.getBoatID());
@@ -118,13 +132,13 @@ public class DomainFactoryImpl implements DomainFactory {
if (result == null) {
switch (Util.size(devices)) {
case 1:
result = new BuoyImpl(devices.iterator().next());
result = getOrCreateBuoy(devices.iterator().next());
break;
case 2:
Iterator<String> buoyNameIter = devices.iterator();
String left = buoyNameIter.next();
String right = buoyNameIter.next();
result = new GateImpl(new BuoyImpl(left), new BuoyImpl(right), left+"/"+right);
result = new GateImpl(getOrCreateBuoy(left), getOrCreateBuoy(right), left+"/"+right);
break;
default:
throw new RuntimeException("Don't know how to handle control points with number of devices neither 1 nor 2. Was "+Util.size(devices));
@@ -132,4 +146,26 @@ public class DomainFactoryImpl implements DomainFactory {
}
return result;
}
/**
* @param id
* the ID which is probably also used as the "device name" and the "sail number" in case of an
* {@link MessageType#RPD RPD} message
*/
@Override
public Buoy getOrCreateBuoy(String id) {
Buoy result = buoyCache.get(id);
if (result == null) {
result = new BuoyImpl(id);
buoyCache.put(id, result);
}
return result;
}
@Override
public GPSFixMoving createGPSFix(TimePoint timePointOfTransmission, Fix fix) {
GPSFixMoving result = new GPSFixMovingImpl(fix.getPosition(), new MillisecondsTimePoint(
timePointOfTransmission.asMillis() + fix.getAgeOfDataInMilliseconds()), fix.getSpeed());
return result;
}
}
@@ -8,7 +8,10 @@ import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.logging.Logger;
import com.sap.sailing.domain.base.Buoy;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Distance;
import com.sap.sailing.domain.base.Event;
import com.sap.sailing.domain.base.RaceDefinition;
@@ -25,8 +28,11 @@ import com.sap.sailing.domain.swisstimingadapter.StartList;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingFactory;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingRaceTracker;
import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet;
import com.sap.sailing.domain.tracking.DynamicTrack;
import com.sap.sailing.domain.tracking.DynamicTrackedEvent;
import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.domain.tracking.GPSFix;
import com.sap.sailing.domain.tracking.GPSFixMoving;
import com.sap.sailing.domain.tracking.GPSFixTrack;
import com.sap.sailing.domain.tracking.RaceHandle;
import com.sap.sailing.domain.tracking.RaceTracker;
@@ -36,6 +42,8 @@ import com.sap.sailing.domain.tracking.WindTrack;
import com.sap.sailing.util.Util.Triple;
public class SwissTimingRaceTrackerImpl implements SwissTimingRaceTracker, SailMasterListener {
private static final Logger logger = Logger.getLogger(SwissTimingRaceTrackerImpl.class.getName());
private final SailMasterConnector connector;
private final String raceID;
private final RaceSpecificMessageLoader messageLoader;
@@ -129,8 +137,35 @@ public class SwissTimingRaceTrackerImpl implements SwissTimingRaceTracker, SailM
public void receivedRacePositionData(String raceID, RaceStatus status, TimePoint timePoint, TimePoint startTime,
Long millisecondsSinceRaceStart, Integer nextMarkIndexForLeader, Distance distanceToNextMarkForLeader,
Collection<Fix> fixes) {
// TODO implement receivedRacePositionData; extract race start time, add GPSFixMoving objects to tracked race
assert this.raceID.equals(raceID);
if (this.raceID.equals(raceID)) {
if (startTime != null) {
trackedRace.setStartTimeReceived(startTime);
}
for (Fix fix : fixes) {
GPSFixMoving gpsFix = domainFactory.createGPSFix(timePoint, fix);
switch (fix.getTrackerType()) {
case BUOY:
case COMMITTEE:
case JURY:
case TIMINGSCORING:
case UNIDENTIFIED:
String trackerID = fix.getBoatID();
Buoy buoy = domainFactory.getOrCreateBuoy(trackerID);
DynamicTrack<Buoy, GPSFix> buoyTrack = trackedRace.getOrCreateTrack(buoy);
buoyTrack.addGPSFix(gpsFix);
break;
case COMPETITOR:
Competitor competitor = domainFactory.getCompetitorByBoatID(fix.getBoatID());
DynamicTrack<Competitor, GPSFixMoving> competitorTrack = trackedRace.getTrack(competitor);
competitorTrack.addGPSFix(gpsFix);
break;
default:
logger.info("Unknoen tracker type "+fix.getTrackerType());
}
}
// TODO implement receivedRacePositionData; extract race start time, add GPSFixMoving objects to tracked race
}
}
@Override
@@ -154,7 +189,7 @@ public class SwissTimingRaceTrackerImpl implements SwissTimingRaceTracker, SailM
}
private void createRaceDefinition(String raceID) {
assert this.raceID == raceID;
assert this.raceID.equals(raceID);
assert startList != null;
assert course != null;
// now we can create the RaceDefinition and most other things