Merge branch 'master' into racecommittee_integrated

Conflicts:
	java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java
	java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CourseTest.java
	java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CourseUpdateTest.java
	java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RouteAssemblyTest.java
	java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/WindTest.java
	java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/DomainFactory.java
	java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java
	java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceCourseReceiver.java
	java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/TracTracRaceTrackerImpl.java
	java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/Course.java
	java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/DomainFactory.java
	java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/CourseImpl.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java
	java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/ServerReplicationTest.java
	java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/TrackedRaceContentsReplicationTest.java
This commit is contained in:
Armin Zamani committed 2013-03-01 15:10:49 +01:00
commit b254437be3
56 files changed
+1425 -1402

No files matched your search

@@ -21,6 +21,7 @@ import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.Team;
import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.common.NauticalSide;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.racelog.RaceLogStore;
@@ -59,7 +60,7 @@ public interface DomainFactory {
com.sap.sailing.domain.common.TimePoint createTimePoint(long timestamp);
Course createCourse(String name, Iterable<TracTracControlPoint> controlPoints);
Course createCourse(String name, Iterable<Pair<TracTracControlPoint, NauticalSide>> controlPoints);
com.sap.sailing.domain.base.Competitor getOrCreateCompetitor(Competitor competitor);
@@ -217,7 +218,7 @@ public interface DomainFactory {
* of waypoints. The waypoints are created from the control points and represent usages of the control points
* in a course. A single control point may be used more than once in a course's list of waypoints.
*/
void updateCourseWaypoints(Course courseToUpdate, Iterable<? extends TracTracControlPoint> controlPoints) throws PatchFailedException;
void updateCourseWaypoints(Course courseToUpdate, Iterable<Pair<TracTracControlPoint, NauticalSide>> controlPoints) throws PatchFailedException;
TracTracConfiguration createTracTracConfiguration(String name, String jsonURL, String liveDataURI, String storedDataURI);
@@ -136,7 +136,11 @@ public class ClientParamsPHP {
return getProperty("Description");
}
public Iterable<ControlPoint> getControlPoints() {
public String getMetadata() {
return getProperty("DataSheet");
}
public List<ControlPoint> getControlPoints() {
List<ControlPoint> result = new ArrayList<>();
int i=1;
String controlPointUUID;
@@ -40,6 +40,7 @@ import com.sap.sailing.domain.base.impl.RaceDefinitionImpl;
import com.sap.sailing.domain.base.impl.RegattaImpl;
import com.sap.sailing.domain.base.impl.TeamImpl;
import com.sap.sailing.domain.common.MarkType;
import com.sap.sailing.domain.common.NauticalSide;
import com.sap.sailing.domain.common.Position;
import com.sap.sailing.domain.common.ScoringSchemeType;
import com.sap.sailing.domain.common.TimePoint;
@@ -131,11 +132,11 @@ public class DomainFactoryImpl implements DomainFactory {
}
@Override
public void updateCourseWaypoints(Course courseToUpdate, Iterable<? extends TracTracControlPoint> controlPoints) throws PatchFailedException {
List<com.sap.sailing.domain.base.ControlPoint> newDomainControlPoints = new ArrayList<com.sap.sailing.domain.base.ControlPoint>();
for (TracTracControlPoint tractracControlPoint : controlPoints) {
com.sap.sailing.domain.base.ControlPoint newDomainControlPoint = getOrCreateControlPoint(tractracControlPoint);
newDomainControlPoints.add(newDomainControlPoint);
public void updateCourseWaypoints(Course courseToUpdate, Iterable<Pair<TracTracControlPoint, NauticalSide>> controlPoints) throws PatchFailedException {
List<Pair<com.sap.sailing.domain.base.ControlPoint, NauticalSide>> newDomainControlPoints = new ArrayList<Pair<com.sap.sailing.domain.base.ControlPoint, NauticalSide>>();
for (Pair<TracTracControlPoint, NauticalSide> tractracControlPoint : controlPoints) {
com.sap.sailing.domain.base.ControlPoint newDomainControlPoint = getOrCreateControlPoint(tractracControlPoint.getA());
newDomainControlPoints.add(new Pair<com.sap.sailing.domain.base.ControlPoint, NauticalSide>(newDomainControlPoint, tractracControlPoint.getB()));
}
courseToUpdate.update(newDomainControlPoints, baseDomainFactory);
}
@@ -211,10 +212,10 @@ public class DomainFactoryImpl implements DomainFactory {
}
@Override
public Course createCourse(String name, Iterable<TracTracControlPoint> controlPoints) {
public Course createCourse(String name, Iterable<Pair<TracTracControlPoint, NauticalSide>> controlPoints) {
List<Waypoint> waypointList = new ArrayList<Waypoint>();
for (TracTracControlPoint controlPoint : controlPoints) {
Waypoint waypoint = baseDomainFactory.createWaypoint(getOrCreateControlPoint(controlPoint));
for (Pair<TracTracControlPoint, NauticalSide> controlPoint: controlPoints) {
Waypoint waypoint = baseDomainFactory.createWaypoint(getOrCreateControlPoint(controlPoint.getA()), controlPoint.getB());
waypointList.add(waypoint);
}
return new CourseImpl(name, waypointList);
@@ -1,7 +1,12 @@
package com.sap.sailing.domain.tractracadapter.impl;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -10,6 +15,9 @@ import com.sap.sailing.domain.base.ControlPoint;
import com.sap.sailing.domain.base.Course;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.common.NauticalSide;
import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.common.impl.Util.Triple;
import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet;
import com.sap.sailing.domain.tracking.DynamicTrackedRace;
@@ -81,11 +89,18 @@ public class RaceCourseReceiver extends AbstractReceiverWithQueue<Route, RouteDa
@Override
protected void handleEvent(Triple<Route, RouteData, Race> event) {
System.out.print("R");
List<TracTracControlPoint> ttControlPoints = new ArrayList<>();
Map<Integer, NauticalSide> courseWaypointPassingSides = parseAdditionalCourseDataFromMetadata(event.getA(), event.getB().getPoints());
List<Util.Pair<TracTracControlPoint, NauticalSide>> ttControlPoints = new ArrayList<>();
int i = 1;
for (com.tractrac.clientmodule.ControlPoint cp : event.getB().getPoints()) {
ttControlPoints.add(new ControlPointAdapter(cp));
NauticalSide nauticalSide = courseWaypointPassingSides.containsKey(i) ? courseWaypointPassingSides.get(i) : null;
ttControlPoints.add(new Pair<TracTracControlPoint, NauticalSide>(new ControlPointAdapter(cp), nauticalSide));
i++;
}
Course course = getDomainFactory().createCourse(event.getA().getName(), ttControlPoints);
RaceDefinition existingRaceDefinitionForRace = getDomainFactory().getExistingRaceDefinitionForRace(event.getC());
if (existingRaceDefinitionForRace != null) {
logger.log(Level.INFO, "Received course update for existing race "+event.getC().getName()+": "+
@@ -112,7 +127,50 @@ public class RaceCourseReceiver extends AbstractReceiverWithQueue<Route, RouteDa
}
}
}
/**
* Parses the route metadata for additional course information
* The 'passing side' for each course waypoint is encoded like this...
* Seq.1=GATE
* Seq.2=PORT
* Seq.3=GATE
* Seq.4=STARBOARD
*/
private Map<Integer, NauticalSide> parseAdditionalCourseDataFromMetadata(Route route,
List<com.tractrac.clientmodule.ControlPoint> controlPoints) {
Map<Integer, NauticalSide> result = new HashMap<Integer, NauticalSide>();;
int controlPointsCount = controlPoints.size();
String routeMetadataString = route.getMetadata() != null ? route.getMetadata().getText() : null;
if(routeMetadataString != null) {
Map<String, String> routeMetadata = parseRouteMetadata(routeMetadataString);
for(int i = 1; i <= controlPointsCount; i++) {
String seqValue = routeMetadata.get("Seq." + i);
com.tractrac.clientmodule.ControlPoint controlPoint = controlPoints.get(i-1);
if(!controlPoint.getHasTwoPoints() && seqValue != null) {
if("PORT".equalsIgnoreCase(seqValue)) {
result.put(i, NauticalSide.PORT);
} else if("STARBOARD".equalsIgnoreCase(seqValue)) {
result.put(i, NauticalSide.STARBOARD);
}
}
}
}
return result;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
private Map<String, String> parseRouteMetadata(String routeMetadata) {
Map<String, String> metadataMap = new HashMap<String, String>();
try {
Properties p = new Properties();
p.load(new StringReader(routeMetadata));
metadataMap = new HashMap<String, String>((Map) p);
} catch (IOException e) {
// do nothing
}
return metadataMap;
}
private void createTrackedRace(RaceDefinition race) {
getTrackedRegatta().createTrackedRace(race,
windStore, delayToLiveInMillis, millisecondsOverWhichToAverageWind,
@@ -4,14 +4,18 @@ import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Serializable;
import java.io.StringReader;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
@@ -29,9 +33,11 @@ import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.base.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.common.NauticalSide;
import com.sap.sailing.domain.common.Position;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.TrackedRaceStatusEnum;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.common.impl.Util.Triple;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.tracking.AbstractRaceTrackerImpl;
@@ -259,10 +265,15 @@ public class TracTracRaceTrackerImpl extends AbstractRaceTrackerImpl implements
final ClientParamsPHP clientParams;
try {
clientParams = new ClientParamsPHP(new InputStreamReader(paramURL.openStream()));
List<com.sap.sailing.domain.base.ControlPoint> newCourseControlPoints = new ArrayList<>();
final Iterable<? extends TracTracControlPoint> newTracTracControlPoints = clientParams.getRaceDefaultRoute().getControlPoints();
List<Pair<com.sap.sailing.domain.base.ControlPoint, NauticalSide>> newCourseControlPoints = new ArrayList<>();
final List<? extends TracTracControlPoint> newTracTracControlPoints = clientParams.getRaceDefaultRoute().getControlPoints();
Map<Integer, NauticalSide> passingSideData = parsePassingSideData(clientParams.getRaceDefaultRoute(), newTracTracControlPoints);
int i = 1;
for (TracTracControlPoint newTracTracControlPoint : newTracTracControlPoints) {
newCourseControlPoints.add(domainFactory.getOrCreateControlPoint(newTracTracControlPoint));
NauticalSide nauticalSide = passingSideData.containsKey(i) ? passingSideData.get(i) : null;
newCourseControlPoints.add(new Pair<com.sap.sailing.domain.base.ControlPoint,
NauticalSide>(domainFactory.getOrCreateControlPoint(newTracTracControlPoint), nauticalSide));
i++;
}
List<com.sap.sailing.domain.base.ControlPoint> currentCourseControlPoints = new ArrayList<>();
final Course course = getRaces().iterator().next().getCourse();
@@ -305,6 +316,47 @@ public class TracTracRaceTrackerImpl extends AbstractRaceTrackerImpl implements
}
}
/**
* Parses the route metadata for additional course information
* The 'passing side' for each course waypoint is encoded like this...
* Seq.1=GATE
* Seq.2=PORT
* Seq.3=GATE
* Seq.4=STARBOARD
*/
private Map<Integer, NauticalSide> parsePassingSideData(ClientParamsPHP.Route route, List<? extends TracTracControlPoint> controlPoints) {
Map<Integer, NauticalSide> result = new HashMap<Integer, NauticalSide>();
int controlPointsCount = controlPoints.size();
String routeMetadataString = route.getMetadata();
if(routeMetadataString != null) {
Map<String, String> routeMetadata = parseRouteMetadata(routeMetadataString);
for(int i = 1; i <= controlPointsCount; i++) {
String seqValue = routeMetadata.get("Seq." + i);
TracTracControlPoint controlPoint = controlPoints.get(i-1);
if(!controlPoint.getHasTwoPoints() && seqValue != null) {
if("PORT".equalsIgnoreCase(seqValue)) {
result.put(i, NauticalSide.PORT);
} else if("STARBOARD".equalsIgnoreCase(seqValue)) {
result.put(i, NauticalSide.STARBOARD);
}
}
}
}
return result;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
private Map<String, String> parseRouteMetadata(String routeMetadata) {
Map<String, String> metadataMap = new HashMap<String, String>();
try {
Properties p = new Properties();
p.load(new StringReader(routeMetadata));
metadataMap = new HashMap<String, String>((Map) p);
} catch (IOException e) {
// do nothing
}
return metadataMap;
}
private void updateStartStopTimesAndLiveDelay(ClientParamsPHP clientParams, Simulator simulator) {
RaceDefinition currentRace = null;
long delayInMillis = clientParams.getLiveDelayInMillis();