mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-11 14:50:56 +00:00
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:
commit
b254437be3
56 files changed
+1425
-1402
No files matched your search
+3
-2
@@ -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);
|
||||
|
||||
|
||||
+5
-1
@@ -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;
|
||||
|
||||
+9
-8
@@ -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);
|
||||
|
||||
+61
-3
@@ -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,
|
||||
|
||||
+55
-3
@@ -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();
|
||||
|
||||
Reference in new issue
Block a user