Bug 5085: started with adding support for

This commit is contained in:
Steffen Jacobs
2019-09-18 15:29:36 +02:00
parent a3a7da0ad8
commit 418a774c13
39 changed files with 129 additions and 66 deletions
@@ -2488,8 +2488,13 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
dbObject.remove(FieldNames.GATE_RIGHT.name());
}
Mark rightMark = loadMark(dbRight);
String shortName = (String) dbObject.get(FieldNames.CONTROLPOINTWITHTWOMARKS_SHORT_NAME.name());
if (shortName == null || shortName.isEmpty()) {
shortName = controlPointName;
}
ControlPointWithTwoMarks gate = baseDomainFactory.createControlPointWithTwoMarks(controlPointId, leftMark,
rightMark, controlPointName);
rightMark, controlPointName, shortName);
return gate;
}
@@ -102,7 +102,7 @@ public enum FieldNames {
RACE_LOG_EVENT_START_TIME, RACE_LOG_EVENT_CLASS, RACE_LOG_EVENT_NEXT_STATUS, RACE_LOG_COURSE_DESIGN, RACE_LOG_COURSE_DESIGNER_MODE, WAYPOINT_ID, WAYPOINT_NAME,
WAYPOINT_PASSINGINSTRUCTIONS, CONTROLPOINT, CONTROLPOINT_CLASS, MARK_ID, MARK_COLOR, MARK_NAME, MARK_SHORT_NAME, MARK_PATTERN, MARK_SHAPE, MARK_TYPE,
MARK_ORIGINATING_MARK_TEMPLATE_ID, MARK_ORIGINATING_MARK_PROPERTIES_ID, RACE_LOG_COURSE_ORIGINATING_TEMPLATE_ID,
CONTROLPOINT_VALUE, CONTROLPOINTWITHTWOMARKS_ID, CONTROLPOINTWITHTWOMARKS_NAME, CONTROLPOINTWITHTWOMARKS_LEFT, CONTROLPOINTWITHTWOMARKS_RIGHT,
CONTROLPOINT_VALUE, CONTROLPOINTWITHTWOMARKS_ID, CONTROLPOINTWITHTWOMARKS_NAME, CONTROLPOINTWITHTWOMARKS_SHORT_NAME, CONTROLPOINTWITHTWOMARKS_LEFT, CONTROLPOINTWITHTWOMARKS_RIGHT,
RACE_LOG_POSITIONED_COMPETITORS, RACE_LOG_PATHFINDER_ID, RACE_LOG_GATE_LINE_OPENING_TIME, RACE_LOG_GOLF_DOWN_TIME, RACE_LOG_START_PROCEDURE_TYPE,
RACE_LOG_PROTEST_START_TIME, RACE_LOG_PROTEST_END_TIME, RACE_LOG_COURSE_DESIGN_NAME, RACE_LOG_REVOKED_EVENT_ID, RACE_LOG_REVOKED_EVENT_TYPE,
RACE_LOG_REVOKED_EVENT_SHORT_INFO, RACE_LOG_REVOKED_REASON, RACE_LOG_DEVICE_MAPPING_EVENT_ID,
@@ -1319,6 +1319,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
Document result = new Document();
result.put(FieldNames.CONTROLPOINTWITHTWOMARKS_ID.name(), cpwtm.getId());
result.put(FieldNames.CONTROLPOINTWITHTWOMARKS_NAME.name(), cpwtm.getName());
result.put(FieldNames.CONTROLPOINTWITHTWOMARKS_SHORT_NAME.name(), cpwtm.getShortName());
result.put(FieldNames.CONTROLPOINTWITHTWOMARKS_LEFT.name(), storeMark(cpwtm.getLeft()));
result.put(FieldNames.CONTROLPOINTWITHTWOMARKS_RIGHT.name(), storeMark(cpwtm.getRight()));
return result;
@@ -4,4 +4,6 @@ import com.sap.sse.common.NamedWithID;
public interface ControlPoint extends NamedWithID {
Iterable<Mark> getMarks();
String getShortName();
}
@@ -59,9 +59,10 @@ public interface SharedDomainFactory extends CompetitorFactory, BoatFactory {
/**
* @param name also uses the name as the gate's ID; if you have a real ID, use {@link #createControlPointWithTwoMarks(Serializable, Mark, Mark, String)} instead
*/
ControlPointWithTwoMarks createControlPointWithTwoMarks(Mark left, Mark right, String name);
ControlPointWithTwoMarks createControlPointWithTwoMarks(Mark left, Mark right, String name, String shortName);
ControlPointWithTwoMarks createControlPointWithTwoMarks(Serializable id, Mark left, Mark right, String name);
ControlPointWithTwoMarks createControlPointWithTwoMarks(Serializable id, Mark left, Mark right, String name,
String shortName);
/**
* The waypoint created is weakly cached so that when requested again by
@@ -109,9 +110,11 @@ public interface SharedDomainFactory extends CompetitorFactory, BoatFactory {
Mark getExistingMarkById(Serializable id);
ControlPointWithTwoMarks getOrCreateControlPointWithTwoMarks(Serializable id, String name, Mark left, Mark right);
ControlPointWithTwoMarks getOrCreateControlPointWithTwoMarks(Serializable id, String name, Mark left, Mark right,
String shortName);
ControlPointWithTwoMarks getOrCreateControlPointWithTwoMarks(String id, String name, Mark left, Mark right);
ControlPointWithTwoMarks getOrCreateControlPointWithTwoMarks(String id, String name, Mark left, Mark right,
String shortName);
RaceLogResolver getRaceLogResolver();
@@ -13,19 +13,21 @@ public class ControlPointWithTwoMarksImpl implements ControlPointWithTwoMarks {
private final Mark right;
private final String name;
private final Serializable id;
private final String shortName;
/**
* @param name also used as ID for the mark; if you have a better ID, use {@link GateImpl(Serializable, Mark, Mark, String)} instead.
*/
public ControlPointWithTwoMarksImpl(Mark left, Mark right, String name) {
this(/* ID */ name, left, right, name);
public ControlPointWithTwoMarksImpl(Mark left, Mark right, String name, String shortName) {
this(/* ID */ name, left, right, name, shortName);
}
public ControlPointWithTwoMarksImpl(Serializable id, Mark left, Mark right, String name) {
public ControlPointWithTwoMarksImpl(Serializable id, Mark left, Mark right, String name, String shortName) {
this.id = id;
this.left = left;
this.right = right;
this.name = name;
this.shortName = shortName;
}
@Override
@@ -60,4 +62,8 @@ public class ControlPointWithTwoMarksImpl implements ControlPointWithTwoMarks {
public Serializable getId() {
return id;
}
public String getShortName() {
return shortName;
}
}
@@ -212,25 +212,26 @@ public class SharedDomainFactoryImpl implements SharedDomainFactory {
}
@Override
public ControlPointWithTwoMarks getOrCreateControlPointWithTwoMarks(Serializable id, String name, Mark left, Mark right) {
public ControlPointWithTwoMarks getOrCreateControlPointWithTwoMarks(Serializable id, String name, Mark left,
Mark right, String shortName) {
final ControlPointWithTwoMarks result;
final ControlPointWithTwoMarks fromCache = controlPointWithTwoMarksCache.get(id);
if (fromCache != null) {
result = fromCache;
} else {
result = createControlPointWithTwoMarks(id, left, right, name);
result = createControlPointWithTwoMarks(id, left, right, name, shortName);
}
return result;
}
@Override
public ControlPointWithTwoMarks getOrCreateControlPointWithTwoMarks(
String toStringRepresentationOfID, String name, Mark left, Mark right) {
String toStringRepresentationOfID, String name, Mark left, Mark right, String shortName) {
Serializable id = toStringRepresentationOfID;
if (controlPointWithTwoMarksIdCache.containsKey(toStringRepresentationOfID)) {
id = controlPointWithTwoMarksIdCache.get(toStringRepresentationOfID);
}
return getOrCreateControlPointWithTwoMarks(id, name, left, right);
return getOrCreateControlPointWithTwoMarks(id, name, left, right, shortName);
}
private void cacheMark(Serializable id, Mark result) {
@@ -239,13 +240,15 @@ public class SharedDomainFactoryImpl implements SharedDomainFactory {
}
@Override
public ControlPointWithTwoMarks createControlPointWithTwoMarks(Mark left, Mark right, String name) {
return createControlPointWithTwoMarks(name, left, right, name);
public ControlPointWithTwoMarks createControlPointWithTwoMarks(Mark left, Mark right, String name,
String shortName) {
return createControlPointWithTwoMarks(name, left, right, name, shortName);
}
@Override
public ControlPointWithTwoMarks createControlPointWithTwoMarks(Serializable id, Mark left, Mark right, String name) {
ControlPointWithTwoMarks result = new ControlPointWithTwoMarksImpl(id, left, right, name);
public ControlPointWithTwoMarks createControlPointWithTwoMarks(Serializable id, Mark left, Mark right, String name,
String shortName) {
ControlPointWithTwoMarks result = new ControlPointWithTwoMarksImpl(id, left, right, name, shortName);
controlPointWithTwoMarksCache.put(id, result);
controlPointWithTwoMarksIdCache.put(id.toString(), id);
return result;
@@ -79,7 +79,8 @@ public interface DomainFactory {
long delayToLiveInMillis, SwissTimingFactory swissTimingFactory, DomainFactory domainFactory,
RaceLogStore raceLogStore, RegattaLogStore regattaLogStore, boolean useInternalMarkPassingAlgorithm, boolean trackWind, boolean correctWindDirectionByMagneticDeclination, String updateURL, String updateUsername, String updatePassword);
ControlPoint getOrCreateControlPoint(String description, Iterable<Serializable> deviceIds, MarkType markType);
ControlPoint getOrCreateControlPoint(String description, Iterable<Serializable> deviceIds, MarkType markType,
String shortNameOfGate);
RaceDefinition createRaceDefinition(Regatta regatta, String swissTimingRaceID, Map<Competitor, Boat> competitorsAndBoats,
List<ControlPoint> courseDefinition, String raceName, String raceIdForRaceDefinition,
@@ -310,7 +310,8 @@ public class DomainFactoryImpl implements DomainFactory {
private com.sap.sailing.domain.base.Course createCourse(String courseName, Course course) {
List<Waypoint> waypoints = new ArrayList<Waypoint>();
for (Mark mark : course.getMarks()) {
ControlPoint controlPoint = getOrCreateControlPoint(mark.getDescription(), mark.getDeviceIds(), getMarkType(mark.getMarkType()));
ControlPoint controlPoint = getOrCreateControlPoint(mark.getDescription(), mark.getDeviceIds(),
getMarkType(mark.getMarkType()), mark.getDescription());
Waypoint waypoint = baseDomainFactory.createWaypoint(controlPoint, /* passingInstruction */ PassingInstruction.None);
waypoints.add(waypoint);
}
@@ -332,7 +333,8 @@ public class DomainFactoryImpl implements DomainFactory {
}
@Override
public ControlPoint getOrCreateControlPoint(String description, Iterable<Serializable> deviceIds, MarkType markType) {
public ControlPoint getOrCreateControlPoint(String description, Iterable<Serializable> deviceIds, MarkType markType,
String shortNameOfPotentialGate) {
ControlPoint result;
synchronized (controlPointCache) {
result = controlPointCache.get(deviceIds);
@@ -345,7 +347,8 @@ public class DomainFactoryImpl implements DomainFactory {
Iterator<Serializable> markNameIter = deviceIds.iterator();
final Serializable idLeft = markNameIter.next();
final Serializable idRight = markNameIter.next();
result = baseDomainFactory.createControlPointWithTwoMarks(getOrCreateMark(idLeft, description), getOrCreateMark(idRight, description), description);
result = baseDomainFactory.createControlPointWithTwoMarks(getOrCreateMark(idLeft, description),
getOrCreateMark(idRight, description), description, shortNameOfPotentialGate);
break;
default:
throw new RuntimeException(
@@ -384,7 +387,8 @@ public class DomainFactoryImpl implements DomainFactory {
List<com.sap.sse.common.Util.Pair<com.sap.sailing.domain.base.ControlPoint, PassingInstruction>> newDomainControlPoints = new ArrayList<com.sap.sse.common.Util.Pair<com.sap.sailing.domain.base.ControlPoint, PassingInstruction>>();
for (Mark mark : marks) {
// TODO bug 1043: propagate the mark names to the waypoint names
com.sap.sailing.domain.base.ControlPoint domainControlPoint = getOrCreateControlPoint(mark.getDescription(), mark.getDeviceIds(), getMarkType(mark.getMarkType()));
com.sap.sailing.domain.base.ControlPoint domainControlPoint = getOrCreateControlPoint(mark.getDescription(),
mark.getDeviceIds(), getMarkType(mark.getMarkType()), mark.getDescription());
newDomainControlPoints.add(new com.sap.sse.common.Util.Pair<>(domainControlPoint, PassingInstruction.None));
}
courseToUpdate.update(newDomainControlPoints, baseDomainFactory);
@@ -336,7 +336,8 @@ public class SwissTimingReplayToDomainAdapter extends SwissTimingReplayAdapter i
if (id2 != null && !id2.trim().isEmpty()) {
markNamesAsIds.add(id2.trim());
}
final ControlPoint controlPoint = domainFactory.getOrCreateControlPoint(name, markNamesAsIds, getMarkType(markType));
final ControlPoint controlPoint = domainFactory.getOrCreateControlPoint(name, markNamesAsIds,
getMarkType(markType), name);
if (index == 0) {
currentCourseDefinition = new ArrayList<>();
}
@@ -65,7 +65,8 @@ public class WaypointPositionAndDistanceCacheTest {
pinEnd = new MarkImpl("Pin End");
startBoat = new MarkImpl("Start Boat");
windward = new MarkImpl("Windward");
startFinish = new ControlPointWithTwoMarksImpl(UUID.randomUUID(), pinEnd, startBoat, "Start/Finish");
startFinish = new ControlPointWithTwoMarksImpl(UUID.randomUUID(), pinEnd, startBoat, "Start/Finish",
"Start/Finish");
start = new WaypointImpl(startFinish);
windwardWaypoint = new WaypointImpl(windward);
finish = new WaypointImpl(startFinish);
@@ -45,10 +45,10 @@ public class StationarySequenceTest extends AbstractCandidateFilterTestSupport {
final TimePoint now = MillisecondsTimePoint.now();
final Waypoint w3 = new WaypointImpl(new ControlPointWithTwoMarksImpl(
UUID.randomUUID(), new MarkImpl(UUID.randomUUID(), "3p"),
new MarkImpl(UUID.randomUUID(), "3s"), "Leeward Gate"));
new MarkImpl(UUID.randomUUID(), "3s"), "Leeward Gate", "Leeward Gate"));
final Waypoint w5 = new WaypointImpl(new ControlPointWithTwoMarksImpl(
UUID.randomUUID(), new MarkImpl(UUID.randomUUID(), "Committee Boat"),
new MarkImpl(UUID.randomUUID(), "Pin"), "Start/Finish"));
new MarkImpl(UUID.randomUUID(), "Pin"), "Start/Finish", "Start/Finish"));
c1 = candidate(now, "c1", w3);
c2 = candidate(c1.getTimePoint().plus(Duration.ONE_SECOND.times(10)), "c2", w5);
c3 = candidate(c2.getTimePoint().plus(Duration.ONE_SECOND.times(10)), "c3", w3);
@@ -109,7 +109,7 @@ public class TestFarthestAheadWithSkippedMarkPassing {
// create a two-lap upwind/downwind course:
MarkImpl left = new MarkImpl("Left lee gate buoy");
MarkImpl right = new MarkImpl("Right lee gate buoy");
ControlPoint leeGate = new ControlPointWithTwoMarksImpl(left, right, "Lee Gate");
ControlPoint leeGate = new ControlPointWithTwoMarksImpl(left, right, "Lee Gate", "Lee Gate");
Mark windwardMark = new MarkImpl("Windward mark");
start = new WaypointImpl(leeGate);
waypoints.add(start);
@@ -90,7 +90,7 @@ public class TestSimpleTimeOnTimeRankingWithOneUpwindLeg {
// create a two-lap upwind/downwind course:
MarkImpl left = new MarkImpl("Left lee gate buoy");
MarkImpl right = new MarkImpl("Right lee gate buoy");
ControlPoint leeGate = new ControlPointWithTwoMarksImpl(left, right, "Lee Gate");
ControlPoint leeGate = new ControlPointWithTwoMarksImpl(left, right, "Lee Gate", "Lee Gate");
Mark windwardMark = new MarkImpl("Windward mark");
waypoints.add(new WaypointImpl(leeGate));
waypoints.add(new WaypointImpl(windwardMark));
@@ -207,17 +207,20 @@ public class CourseTest {
@Test
public void testWaypointDeleteWithSubsequentInsertInOnePatch() throws PatchFailedException {
List<Waypoint> waypoints = new ArrayList<Waypoint>();
final WaypointImpl rcBlackConical = new WaypointImpl(new ControlPointWithTwoMarksImpl(new MarkImpl("RC"), new MarkImpl("Black Conical"), "RC-Black Conical"));
final WaypointImpl rcBlackConical = new WaypointImpl(new ControlPointWithTwoMarksImpl(new MarkImpl("RC"),
new MarkImpl("Black Conical"), "RC-Black Conical", "RC-Black Conical"));
waypoints.add(rcBlackConical);
final WaypointImpl orange = new WaypointImpl(new MarkImpl("Orange"));
waypoints.add(orange);
final WaypointImpl whiteGate = new WaypointImpl(new ControlPointWithTwoMarksImpl(new MarkImpl("White L"), new MarkImpl("White R"), "White Gate"));
final WaypointImpl whiteGate = new WaypointImpl(new ControlPointWithTwoMarksImpl(new MarkImpl("White L"),
new MarkImpl("White R"), "White Gate", "White Gate"));
waypoints.add(whiteGate);
final WaypointImpl red = new WaypointImpl(new MarkImpl("Red"));
waypoints.add(red);
final WaypointImpl yellow = new WaypointImpl(new MarkImpl("Yellow"));
waypoints.add(yellow);
final WaypointImpl finishPoleCylinder = new WaypointImpl(new ControlPointWithTwoMarksImpl(new MarkImpl("Finish Pole"), new MarkImpl("Cylinder"), "Finish Pole-Cylinder"));
final WaypointImpl finishPoleCylinder = new WaypointImpl(new ControlPointWithTwoMarksImpl(
new MarkImpl("Finish Pole"), new MarkImpl("Cylinder"), "Finish Pole-Cylinder", "Finish Pole-Cylinder"));
waypoints.add(finishPoleCylinder);
Course course = new CourseImpl("Race 24", waypoints);
assertWaypointIndexes(course);
@@ -66,6 +66,7 @@ import com.sap.sailing.domain.leaderboard.impl.HighPointFirstGets10Or8AndLastBre
import com.sap.sailing.domain.leaderboard.impl.HighPointFirstGets12Or8AndLastBreaksTie2017;
import com.sap.sailing.domain.leaderboard.impl.LeaderboardGroupImpl;
import com.sap.sailing.domain.leaderboard.impl.LowPoint;
import com.sap.sailing.domain.leaderboard.impl.LowPointTieBreakBasedOnLastSeriesOnly;
import com.sap.sailing.domain.leaderboard.impl.ThresholdBasedResultDiscardingRuleImpl;
import com.sap.sailing.domain.leaderboard.meta.LeaderboardGroupMetaLeaderboard;
import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore;
@@ -2404,8 +2405,10 @@ public class LeaderboardScoringAndRankingTest extends LeaderboardScoringAndRanki
final TimePoint startOfR1 = withinR1.minus(10000);
final TimePoint beforeStartOfR1 = startOfR1.minus(10000);
final TimePoint afterEndOfR1 = endOfR1.plus(1000);
final Waypoint start = new WaypointImpl(new ControlPointWithTwoMarksImpl(new MarkImpl("Start Pin End"), new MarkImpl("Start Committee Boat"), "Start"));
final Waypoint finish = new WaypointImpl(new ControlPointWithTwoMarksImpl(new MarkImpl("Finish Pin End"), new MarkImpl("Finish Committee Boat"), "Finish"));
final Waypoint start = new WaypointImpl(new ControlPointWithTwoMarksImpl(new MarkImpl("Start Pin End"),
new MarkImpl("Start Committee Boat"), "Start", "Start"));
final Waypoint finish = new WaypointImpl(new ControlPointWithTwoMarksImpl(new MarkImpl("Finish Pin End"),
new MarkImpl("Finish Committee Boat"), "Finish", "Finish"));
FlexibleLeaderboard leaderboard1 = new FlexibleLeaderboardImpl("Leaderboard 1", new ThresholdBasedResultDiscardingRuleImpl(/* discarding thresholds */ new int[0]),
new LowPoint(), null);
final MockedTrackedRaceWithStartTimeAndRanks trackedRace = new MockedTrackedRaceWithStartTimeAndRanks(startOfR1, Arrays.asList(f1)) {
@@ -89,7 +89,8 @@ public class LeaderboardScoringAndRankingTestBase extends AbstractLeaderboardTes
for (Competitor[] competitorList : competitorLists) {
RaceColumn raceColumn = columnIter.next();
final Map<Competitor, TimePoint> lastMarkPassingTimes = lastMarkPassingTimesForCompetitors[i];
final Waypoint start = new WaypointImpl(new ControlPointWithTwoMarksImpl(new MarkImpl("Left StartBuoy"), new MarkImpl("Right StartBuoy"), "Start"));
final Waypoint start = new WaypointImpl(new ControlPointWithTwoMarksImpl(new MarkImpl("Left StartBuoy"),
new MarkImpl("Right StartBuoy"), "Start", "Start"));
final Waypoint finish = new WaypointImpl(new MarkImpl("FinishBuoy"));
TrackedRace trackedRace = new MockedTrackedRaceWithStartTimeAndRanks(startTimes[i], Arrays.asList(competitorList)) {
private static final long serialVersionUID = 1L;
@@ -105,7 +105,7 @@ public class ReachingLegTest extends TrackBasedTest {
// create a two-lap upwind/downwind course:
MarkImpl left = new MarkImpl("Left lee gate buoy");
MarkImpl right = new MarkImpl("Right lee gate buoy");
ControlPoint leeGate = new ControlPointWithTwoMarksImpl(left, right, "Lee Gate");
ControlPoint leeGate = new ControlPointWithTwoMarksImpl(left, right, "Lee Gate", "Lee Gate");
Mark windwardMark = new MarkImpl("Windward mark");
Mark offsetMark = new MarkImpl("Offset mark");
waypoints.add(new WaypointImpl(leeGate));
@@ -171,7 +171,7 @@ public abstract class TrackBasedTest {
// create a two-lap upwind/downwind course:
MarkImpl left = new MarkImpl("Left lee gate buoy");
MarkImpl right = new MarkImpl("Right lee gate buoy");
ControlPoint leeGate = new ControlPointWithTwoMarksImpl(left, right, "Lee Gate");
ControlPoint leeGate = new ControlPointWithTwoMarksImpl(left, right, "Lee Gate", "Lee Gate");
Mark windwardMark = new MarkImpl("Windward mark");
waypoints.add(new WaypointImpl(leeGate));
waypoints.add(new WaypointImpl(windwardMark));
@@ -288,7 +288,8 @@ public class WindTest {
DomainFactory domainFactory = DomainFactory.INSTANCE;
Mark startFinishLeft = domainFactory.getOrCreateMark("Start/Finish left");
Mark startFinishRight = domainFactory.getOrCreateMark("Start/Finish right");
ControlPoint startFinish = domainFactory.createControlPointWithTwoMarks(startFinishLeft, startFinishRight, "Start/Finish");
ControlPoint startFinish = domainFactory.createControlPointWithTwoMarks(startFinishLeft, startFinishRight,
"Start/Finish", "Start/Finish");
ControlPoint top = domainFactory.getOrCreateMark("Top");
Waypoint w1 = domainFactory.createWaypoint(startFinish, /*passingInstruction*/ null);
Waypoint w2 = domainFactory.createWaypoint(top, /*passingInstruction*/ null);
@@ -66,7 +66,7 @@ public class AbstractMockedRaceMarkPassingTest {
protected DynamicTrackedRace race;
public AbstractMockedRaceMarkPassingTest() {
ControlPointWithTwoMarks cp = new ControlPointWithTwoMarksImpl(gate1, gate2, "cp");
ControlPointWithTwoMarks cp = new ControlPointWithTwoMarksImpl(gate1, gate2, "cp", "");
Waypoint w1 = new WaypointImpl(cp, PassingInstruction.Line);
Waypoint w2 = new WaypointImpl(m, PassingInstruction.Port);
Waypoint w3 = new WaypointImpl(cp, PassingInstruction.Gate);
@@ -61,8 +61,10 @@ public class MarkPassingCalculatorWithTrackersOnStartBoatTest extends AbstractEx
@Override
protected Course createCourse(Map<String, Mark> marksByName) {
final Map<String, ControlPoint> controlPoints = new HashMap<>(marksByName);
controlPoints.put("Start/Ziel", new ControlPointWithTwoMarksImpl(marksByName.get("G2"), marksByName.get("MEU"), "Start/Ziel"));
controlPoints.put("Gate", new ControlPointWithTwoMarksImpl(marksByName.get("G1"), marksByName.get("G2"), "Gate"));
controlPoints.put("Start/Ziel", new ControlPointWithTwoMarksImpl(marksByName.get("G2"), marksByName.get("MEU"),
"Start/Ziel", "Start/Ziel"));
controlPoints.put("Gate",
new ControlPointWithTwoMarksImpl(marksByName.get("G1"), marksByName.get("G2"), "Gate", "Gate"));
return createCourse(controlPoints,
wp(controlPoints, "Start/Ziel", PassingInstruction.Line),
wp(controlPoints, "LUV", PassingInstruction.Port),
@@ -228,7 +228,8 @@ public class DomainFactoryImpl implements DomainFactory {
Iterator<Mark> markIter = marks.iterator();
Mark mark1 = markIter.next();
Mark mark2 = markIter.next();
domainControlPoint = baseDomainFactory.createControlPointWithTwoMarks(controlPoint.getId(), mark1, mark2, controlPoint.getName());
domainControlPoint = baseDomainFactory.createControlPointWithTwoMarks(controlPoint.getId(), mark1,
mark2, controlPoint.getName(), controlPoint.getShortName());
} else {
Mark mark = marks.iterator().next();
domainControlPoint = mark;
@@ -24,6 +24,7 @@ import com.sap.sse.gwt.client.dialog.DataEntryDialog;
public class GateCreationDialog extends DataEntryDialog<GateDTO> {
private final MarkTableWrapper<RefreshableMultiSelectionModel<MarkDTO>> marksWrapper;
private final TextBox name;
private final TextBox shortName;
private final StringMessages stringMessages;
public GateCreationDialog(SailingServiceAsync sailingService, ErrorReporter errorReporter,
@@ -43,6 +44,7 @@ public class GateCreationDialog extends DataEntryDialog<GateDTO> {
}, /* animationEnabled */ false, callback);
this.stringMessages = stringMessages;
name = createTextBox("");
shortName = createTextBox("");
marksWrapper = new MarkTableWrapper<RefreshableMultiSelectionModel<MarkDTO>>(
/* multiSelection */ true, sailingService, stringMessages, errorReporter);
marksWrapper.getDataProvider().getList().addAll(marks);
@@ -63,19 +65,25 @@ public class GateCreationDialog extends DataEntryDialog<GateDTO> {
Iterator<MarkDTO> i = marksWrapper.getSelectionModel().getSelectedSet().iterator();
MarkDTO first = i.next();
MarkDTO second = i.next();
controlPoint = new GateDTO(UUID.randomUUID().toString(), name.getText(), first, second);
controlPoint = new GateDTO(UUID.randomUUID().toString(), name.getText(), first, second,
shortName.getText());
}
return controlPoint;
}
@Override
protected Widget getAdditionalWidget() {
Grid grid = new Grid(2,1);
Grid grid = new Grid(3, 1);
HorizontalPanel nameRow = new HorizontalPanel();
nameRow.add(new Label(stringMessages.name()));
nameRow.add(name);
HorizontalPanel shortnameRow = new HorizontalPanel();
shortnameRow.add(new Label(stringMessages.shortName()));
shortnameRow.add(shortName);
grid.setWidget(0, 0, nameRow);
grid.setWidget(1, 0, marksWrapper);
grid.setWidget(1, 0, shortnameRow);
grid.setWidget(2, 0, marksWrapper);
return grid;
}
}
@@ -110,7 +110,7 @@ public class MarkEditDialog extends DataEntryDialog<MarkDTO> {
@Override
protected Widget getAdditionalWidget() {
Grid result = new Grid(6, 4);
Grid result = new Grid(7, 4);
result.setWidget(0, 0, new Label(stringMessages.name()));
result.setWidget(0, 1, name);
result.setWidget(1, 0, new Label(stringMessages.shortName()));
@@ -2537,7 +2537,8 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet
final Position leftPos = positionFinder.find(left, timePoint);
final Mark right = ((ControlPointWithTwoMarks) controlPoint).getRight();
final Position rightPos = positionFinder.find(right, timePoint);
result = new GateDTO(controlPoint.getId().toString(), controlPoint.getName(), convertToMarkDTO(left, leftPos), convertToMarkDTO(right, rightPos));
result = new GateDTO(controlPoint.getId().toString(), controlPoint.getName(),
convertToMarkDTO(left, leftPos), convertToMarkDTO(right, rightPos), controlPoint.getShortName());
} else {
Mark mark = controlPoint.getMarks().iterator().next();
final Position position = positionFinder.find(mark, timePoint);
@@ -2555,7 +2556,8 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet
GateDTO gateDTO = (GateDTO) dto;
Mark left = (Mark) getOrCreateControlPoint(gateDTO.getLeft());
Mark right = (Mark) getOrCreateControlPoint(gateDTO.getRight());
return baseDomainFactory.getOrCreateControlPointWithTwoMarks(idAsString, gateDTO.getName(), left, right);
return baseDomainFactory.getOrCreateControlPointWithTwoMarks(idAsString, gateDTO.getName(), left, right,
gateDTO.getShortName());
} else {
MarkDTO markDTO = (MarkDTO) dto;
return baseDomainFactory.getOrCreateMark(idAsString, dto.getName(), markDTO.getShortName(), markDTO.type, markDTO.color, markDTO.shape, markDTO.pattern);
@@ -12,18 +12,24 @@ import com.sap.sse.security.shared.dto.NamedDTO;
public abstract class ControlPointDTO extends NamedDTO {
private static final long serialVersionUID = 2321067329143412902L;
private String idAsString;
private String shortName;
public ControlPointDTO() {}
public ControlPointDTO(String idAsString, String name) {
public ControlPointDTO(String idAsString, String name, String shortName) {
super(name);
this.idAsString = idAsString;
this.shortName = shortName;
}
public String getIdAsString() {
return idAsString;
}
public String getShortName() {
return shortName;
}
@Override
public boolean equals(Object o) {
return this == o;
@@ -9,8 +9,8 @@ public class GateDTO extends ControlPointDTO {
public GateDTO() {}
public GateDTO(String idAsString, String name, MarkDTO left, MarkDTO right) {
super(idAsString, name);
public GateDTO(String idAsString, String name, MarkDTO left, MarkDTO right, String shortName) {
super(idAsString, name, shortName);
this.left = left;
this.right = right;
}
@@ -20,13 +20,13 @@ public class MarkDTO extends ControlPointDTO implements MappableToDevice {
MarkDTO() {}
public MarkDTO(String idAsString, String name, String shortName, double latDeg, double lngDeg) {
super(idAsString, name);
super(idAsString, name, shortName);
this.shortName = shortName;
this.position = new DegreePosition(latDeg, lngDeg);
}
public MarkDTO(String idAsString, String name, String shortName) {
super(idAsString, name);
super(idAsString, name, shortName);
}
@Override
@@ -103,7 +103,8 @@ public abstract class RaceLogMongoDBTest extends AbstractMongoDBTest {
course.addWaypoint(0,
new WaypointImpl(new ControlPointWithTwoMarksImpl(UUID.randomUUID(), new MarkImpl(UUID.randomUUID(),
"Black", MarkType.BUOY, AbstractColor.getCssColor("black"), "round", "circle"), new MarkImpl(UUID.randomUUID(), "Green",
MarkType.BUOY, AbstractColor.getCssColor("green"), "round", "circle"), "Upper gate")));
MarkType.BUOY, AbstractColor.getCssColor("green"), "round", "circle"),
"Upper gate", "Upper gate")));
course.addWaypoint(1, new WaypointImpl(new MarkImpl(UUID.randomUUID(), "White", MarkType.BUOY, AbstractColor.getCssColor("white"),
"conical", "bold"), PassingInstruction.Port));
@@ -31,7 +31,9 @@ public class GateDeserializer implements JsonDeserializer<ControlPointWithTwoMar
Mark leftMark = markDeserializer.deserialize(jsonLeftMark);
Mark rightMark = markDeserializer.deserialize(jsonRightMark);
String gateName = (String) object.get(BaseControlPointJsonSerializer.FIELD_NAME);
ControlPointWithTwoMarks controlPoint = factory.createControlPointWithTwoMarks(leftMark, rightMark, gateName);
String gateShortName = (String) object.get(BaseControlPointJsonSerializer.FIELD_SHORT_NAME);
ControlPointWithTwoMarks controlPoint = factory.createControlPointWithTwoMarks(leftMark, rightMark, gateName,
gateShortName);
return controlPoint;
}
@@ -8,6 +8,7 @@ import com.sap.sailing.server.gateway.serialization.JsonSerializer;
public abstract class BaseControlPointJsonSerializer implements JsonSerializer<ControlPoint> {
public static final String FIELD_CLASS = "@class";
public static final String FIELD_NAME = "name";
public static final String FIELD_SHORT_NAME = "shortName";
protected abstract String getClassFieldValue();
@@ -16,6 +17,7 @@ public abstract class BaseControlPointJsonSerializer implements JsonSerializer<C
JSONObject result = new JSONObject();
result.put(FIELD_CLASS, getClassFieldValue());
result.put(FIELD_NAME, object.getName());
result.put(FIELD_SHORT_NAME, object.getShortName());
return result;
}
@@ -5,6 +5,7 @@ import static org.junit.Assert.assertEquals;
import java.util.UUID;
import org.json.simple.JSONObject;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
@@ -44,8 +45,6 @@ import com.sap.sse.common.Util;
import com.sap.sse.common.impl.AbstractColor;
import com.sap.sse.common.impl.MillisecondsTimePoint;
import org.junit.Assert;
public class RaceLogCourseDesignChangedEventSerializerTest {
private RaceLogCourseDesignChangedEventSerializer serializer;
@@ -89,7 +88,8 @@ public class RaceLogCourseDesignChangedEventSerializerTest {
course.addWaypoint(0, new WaypointImpl(new ControlPointWithTwoMarksImpl(UUID.randomUUID(), new MarkImpl(UUID.randomUUID(), "Black",
MarkType.BUOY, AbstractColor.getCssColor("black"), "round", "circle"), new MarkImpl(UUID.randomUUID(), "Green", MarkType.BUOY,
AbstractColor.getCssColor("green"), "round", "circle"), "Upper gate")));
AbstractColor.getCssColor("green"), "round", "circle"),
"Upper gate", "Upper gate")));
course.addWaypoint(1, new WaypointImpl(new MarkImpl(UUID.randomUUID(), "White", MarkType.BUOY, AbstractColor.getCssColor("white"),
"conical", "bold"), PassingInstruction.Port));
@@ -866,7 +866,8 @@ public class LeaderboardsResource extends AbstractLeaderboardsResource {
getRaceLogTrackingAdapter().pingMark(regattaLog, pinEnd, new GPSFixImpl(pinEndPosition, timePointForMarkFixes), getService());
// TODO identify existing automatically-created equal-named marks and re-use. The "Auto..." pattern should be sufficiently unique for this application
final ControlPoint startLineControlPoint = getService().getBaseDomainFactory().getOrCreateControlPointWithTwoMarks(
UUID.randomUUID(), "Auto "+waypointName+" Line", pinEnd, startBoat);
UUID.randomUUID(), "Auto " + waypointName + " Line", pinEnd, startBoat,
"Auto " + waypointName + " Line");
result = getService().getBaseDomainFactory().createWaypoint(startLineControlPoint, PassingInstruction.Line);
} else {
result = null;
@@ -84,6 +84,7 @@ public class MarkResource extends AbstractSailingServerResource {
private static final String MARK_NAME = "markName";
private static final String MARK_SHORT_NAME = "markShortName";
private static final String CONTROL_POINT_NAME = "controlPointName";
private static final String CONTROL_POINT_SHORT_NAME = "controlPointShortName";
private static final String ORIGINATING_MARK_TEMPLATE_ID = "originatingMarkTemplateId";
private static final String ORIGINATING_MARK_PROPERTIES_ID = "originatingMarkPropertiesId";
private static final String ORIGINATING_COURSE_TEMPLATE_ID = "originatingCourseTemplateId";
@@ -236,9 +237,10 @@ public class MarkResource extends AbstractSailingServerResource {
if (controlPointName == null || controlPointName.isEmpty()) {
controlPointName = markA.getName() + "-" + markB.getName();
}
controlPoints.add(new Pair<>(
new ControlPointWithTwoMarksImpl(markA, markB, controlPointName),
passing));
String shortName = (String) controlPointRaw.get(CONTROL_POINT_SHORT_NAME);
controlPoints.add(new Pair<>(new ControlPointWithTwoMarksImpl(markA, markB, controlPointName,
shortName == null ? controlPointName : shortName), passing));
}
}
Course course = new CourseImpl(courseName, lastPublishedCourse.getWaypoints(), originatingCourseTemplateId);
@@ -166,7 +166,8 @@ public class ExpeditionCourseInferrer {
final Mark portMark, final Mark starboardMark) {
logger.info("Creating start line in tracked race "+trackedRace.getRace().getName());
final ControlPoint startLine = racingEventService.getBaseDomainFactory().getOrCreateControlPointWithTwoMarks(
UUID.randomUUID(), START_LINE_CONTROL_POINT_NAME, portMark, starboardMark);
UUID.randomUUID(), START_LINE_CONTROL_POINT_NAME, portMark, starboardMark,
START_LINE_CONTROL_POINT_NAME);
final CourseBase course = new CourseDataImpl("Auto-Course "+trackedRace.getRace().getName());
course.addWaypoint(0, new WaypointImpl(startLine, PassingInstruction.Line));
final RaceLog raceLog = trackedRace.getAttachedRaceLogs().iterator().next();
@@ -7,7 +7,6 @@ import java.io.IOException;
import java.util.UUID;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
@@ -272,7 +271,7 @@ public class RaceLogReplicationTest extends AbstractLogReplicationTest<RaceLog,
course.addWaypoint(0, new WaypointImpl(new ControlPointWithTwoMarksImpl(UUID.randomUUID(),
new MarkImpl(UUID.randomUUID(), "Black", MarkType.BUOY, AbstractColor.getCssColor("black"), "round", "circle"),
new MarkImpl(UUID.randomUUID(), "Green", MarkType.BUOY, AbstractColor.getCssColor("green"), "round", "circle"),
"Upper gate")));
"Upper gate", "Upper gate")));
course.addWaypoint(1, new WaypointImpl(new MarkImpl(UUID.randomUUID(), "White", MarkType.BUOY, AbstractColor.getCssColor("white"), "conical", "bold"), PassingInstruction.Port));
return course;
@@ -62,7 +62,7 @@ public class StatisticsTest {
private final Mark mark1 = DomainFactory.INSTANCE.getOrCreateMark("mark1");
private final Mark mark2 = DomainFactory.INSTANCE.getOrCreateMark("mark2");
private final Mark mark3 = DomainFactory.INSTANCE.getOrCreateMark("mark3");
private final ControlPoint gate = new ControlPointWithTwoMarksImpl(mark1, mark2, "gate");
private final ControlPoint gate = new ControlPointWithTwoMarksImpl(mark1, mark2, "gate", "gate");
private final Waypoint waypoint1 = new WaypointImpl(gate);
private final Waypoint waypoint2 = new WaypointImpl(mark3);
private final Waypoint waypoint3 = new WaypointImpl(gate);
@@ -120,7 +120,8 @@ public class ApplyScoresFromRaceLogTest extends LeaderboardScoringAndRankingTest
final Mark startboat = new MarkImpl("StartBoat");
final Mark pin = new MarkImpl("Pin");
final Mark windward = new MarkImpl("Windward");
final ControlPointWithTwoMarks startFinish = new ControlPointWithTwoMarksImpl(pin, startboat, "Start/Finish");
final ControlPointWithTwoMarks startFinish = new ControlPointWithTwoMarksImpl(pin, startboat, "Start/Finish",
"Start/Finish");
final WaypointImpl start = new WaypointImpl(startFinish, PassingInstruction.Line);
final WaypointImpl ww = new WaypointImpl(windward, PassingInstruction.Port);
final WaypointImpl finish = new WaypointImpl(startFinish, PassingInstruction.Line);