diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java index e684ccf3f68..205f7eb0265 100755 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java @@ -23,10 +23,14 @@ import com.mongodb.DBCursor; import com.mongodb.DBObject; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.ControlPoint; import com.sap.sailing.domain.base.CourseArea; +import com.sap.sailing.domain.base.CourseData; import com.sap.sailing.domain.base.DomainFactory; import com.sap.sailing.domain.base.Event; import com.sap.sailing.domain.base.Fleet; +import com.sap.sailing.domain.base.Gate; +import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.Regatta; @@ -34,7 +38,9 @@ import com.sap.sailing.domain.base.RegattaRegistry; import com.sap.sailing.domain.base.Series; import com.sap.sailing.domain.base.SpeedWithBearing; import com.sap.sailing.domain.base.Venue; +import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.base.impl.CourseAreaImpl; +import com.sap.sailing.domain.base.impl.CourseDataImpl; import com.sap.sailing.domain.base.impl.EventImpl; import com.sap.sailing.domain.base.impl.FleetImpl; import com.sap.sailing.domain.base.impl.KnotSpeedWithBearingImpl; @@ -42,8 +48,11 @@ import com.sap.sailing.domain.base.impl.MillisecondsTimePoint; import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.base.impl.SeriesImpl; import com.sap.sailing.domain.base.impl.VenueImpl; +import com.sap.sailing.domain.base.impl.WaypointImpl; import com.sap.sailing.domain.common.Color; +import com.sap.sailing.domain.common.MarkType; import com.sap.sailing.domain.common.MaxPointsReason; +import com.sap.sailing.domain.common.NauticalSide; import com.sap.sailing.domain.common.Position; import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.RegattaName; @@ -80,6 +89,7 @@ import com.sap.sailing.domain.persistence.DomainObjectFactory; import com.sap.sailing.domain.persistence.MongoRaceLogStoreFactory; import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.RaceLogCourseAreaChangedEvent; +import com.sap.sailing.domain.racelog.RaceLogCourseDesignChangedEvent; import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.domain.racelog.RaceLogEventFactory; import com.sap.sailing.domain.racelog.RaceLogFlagEvent; @@ -979,12 +989,20 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { } else if (eventClass.equals(RaceLogCourseAreaChangedEvent.class.getSimpleName())) { return loadRaceLogCourseAreaChangedEvent(timePoint, id, passId, competitors, dbObject); - + + } else if (eventClass.equals(RaceLogCourseDesignChangedEvent.class.getSimpleName())) { + return loadRaceLogCourseDesignChangedEvent(timePoint, id, passId, competitors, dbObject); } return null; } + private RaceLogCourseDesignChangedEvent loadRaceLogCourseDesignChangedEvent(TimePoint timePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { + CourseData courseData = loadCourseData((BasicDBList) dbObject.get(FieldNames.RACE_LOG_COURSE_DESIGN.name())); + + return RaceLogEventFactory.INSTANCE.createCourseDesignChangedEvent(timePoint, id, competitors, passId, courseData); + } + private RaceLogCourseAreaChangedEvent loadRaceLogCourseAreaChangedEvent(TimePoint timePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { Serializable courseAreaId = (Serializable) dbObject.get(FieldNames.COURSE_AREA_ID.name()); @@ -1028,4 +1046,59 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { return RaceLogEventFactory.INSTANCE.createRaceStatusEvent(timePoint, id, competitors, passId, nextStatus); } + + private CourseData loadCourseData(BasicDBList dbCourseList) { + CourseData courseData = new CourseDataImpl("TemplateCourse"); + int i = 0; + for (Object object : dbCourseList) { + DBObject dbObject = (DBObject) object; + Waypoint waypoint = null; + NauticalSide passingSide = (NauticalSide) dbObject.get(FieldNames.WAYPOINT_PASSINGSIDE.name()); + ControlPoint controlPoint = loadControlPoint((DBObject) dbObject.get(FieldNames.CONTROLPOINT.name())); + if (passingSide == null) { + waypoint = new WaypointImpl(controlPoint); + } else { + waypoint = new WaypointImpl(controlPoint, passingSide); + } + courseData.addWaypoint(i++, waypoint); + } + return courseData; + } + + private ControlPoint loadControlPoint(DBObject dbObject) { + String controlPointClass = (String) dbObject.get(FieldNames.CONTROLPOINT_CLASS.name()); + ControlPoint controlPoint = null; + if (controlPointClass != null) { + if (controlPointClass.equals(Mark.class.getSimpleName())) { + Mark mark = loadMark((DBObject) dbObject.get(FieldNames.CONTROLPOINT_VALUE.name())); + controlPoint = mark; + } else if (controlPointClass.equals(Gate.class.getSimpleName())) { + Gate gate = loadGate((DBObject) dbObject.get(FieldNames.CONTROLPOINT_VALUE.name())); + controlPoint = gate; + } + } + return controlPoint; + } + + private Gate loadGate(DBObject dbObject) { + Serializable gateId = (Serializable) dbObject.get(FieldNames.GATE_ID.name()); + String gateName = (String) dbObject.get(FieldNames.GATE_NAME.name()); + Mark leftMark = loadMark((DBObject) dbObject.get(FieldNames.GATE_LEFT.name())); + Mark rightMark = loadMark((DBObject) dbObject.get(FieldNames.GATE_RIGHT.name())); + + Gate gate = DomainFactory.INSTANCE.createGate(gateId, leftMark, rightMark, gateName); + return gate; + } + + private Mark loadMark(DBObject dbObject) { + Serializable markId = (Serializable) dbObject.get(FieldNames.MARK_ID.name()); + String markColor = (String) dbObject.get(FieldNames.MARK_COLOR.name()); + String markName = (String) dbObject.get(FieldNames.MARK_NAME.name()); + String markPattern = (String) dbObject.get(FieldNames.MARK_PATTERN.name()); + String markShape = (String) dbObject.get(FieldNames.MARK_SHAPE.name()); + MarkType markType = MarkType.valueOf((String) dbObject.get(FieldNames.MARK_TYPE.name())); + + Mark mark = DomainFactory.INSTANCE.getOrCreateMark(markId, markName, markType, markColor, markShape, markPattern); + return mark; + } } diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java index 6bba1c16e48..f0fe03cc0b5 100755 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java @@ -67,5 +67,7 @@ public enum FieldNames { // race log RACE_LOG_IDENTIFIER, RACE_LOG_EVENT, RACE_LOG_EVENT_PASS_ID, RACE_LOG_EVENT_ID, RACE_LOG_EVENT_INVOLVED_BOATS, RACE_LOG_EVENT_FLAG_UPPER, RACE_LOG_EVENT_FLAG_LOWER, - RACE_LOG_EVENT_FLAG_DISPLAYED, RACE_LOG_EVENT_START_TIME, RACE_LOG_EVENT_CLASS, RACE_LOG_EVENT_NEXT_STATUS; + RACE_LOG_EVENT_FLAG_DISPLAYED, RACE_LOG_EVENT_START_TIME, RACE_LOG_EVENT_CLASS, RACE_LOG_EVENT_NEXT_STATUS, RACE_LOG_COURSE_DESIGN, WAYPOINT_ID, + WAYPOINT_NAME, WAYPOINT_PASSINGSIDE, CONTROLPOINT, CONTROLPOINT_CLASS, MARK_ID, MARK_COLOR, MARK_NAME, MARK_PATTERN, MARK_SHAPE, MARK_TYPE, + CONTROLPOINT_VALUE, GATE_ID, GATE_NAME, GATE_LEFT, GATE_RIGHT; } diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java index 4d57b873d38..6f4a7486aa5 100755 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java @@ -12,9 +12,13 @@ import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBObject; import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.ControlPoint; import com.sap.sailing.domain.base.CourseArea; +import com.sap.sailing.domain.base.CourseData; import com.sap.sailing.domain.base.Event; import com.sap.sailing.domain.base.Fleet; +import com.sap.sailing.domain.base.Gate; +import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.Regatta; @@ -22,9 +26,11 @@ import com.sap.sailing.domain.base.Series; import com.sap.sailing.domain.base.SpeedWithBearing; import com.sap.sailing.domain.base.Timed; import com.sap.sailing.domain.base.Venue; +import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.base.impl.FleetImpl; import com.sap.sailing.domain.common.Bearing; import com.sap.sailing.domain.common.MaxPointsReason; +import com.sap.sailing.domain.common.NauticalSide; import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.Speed; import com.sap.sailing.domain.common.TimePoint; @@ -38,6 +44,7 @@ import com.sap.sailing.domain.leaderboard.SettableScoreCorrection; import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule; import com.sap.sailing.domain.persistence.MongoObjectFactory; import com.sap.sailing.domain.racelog.RaceLogCourseAreaChangedEvent; +import com.sap.sailing.domain.racelog.RaceLogCourseDesignChangedEvent; import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.domain.racelog.RaceLogFlagEvent; import com.sap.sailing.domain.racelog.RaceLogIdentifier; @@ -540,6 +547,13 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { result.put(FieldNames.RACE_LOG_EVENT.name(), storeRaceLogCourseAreaChangedEvent(courseAreaChangedEvent)); return result; } + + public DBObject storeRaceLogEntry(RaceLogIdentifier raceLogIdentifier, RaceLogCourseDesignChangedEvent courseDesignChangedEvent) { + BasicDBObject result = new BasicDBObject(); + result.put(FieldNames.RACE_LOG_IDENTIFIER.name(), MongoUtils.escapeDollarAndDot(raceLogIdentifier.getIdentifier().toString())); + result.put(FieldNames.RACE_LOG_EVENT.name(), storeRaceLogCourseDesignChangedEvent(courseDesignChangedEvent)); + return result; + } private DBObject storeRaceLogStartTimeEvent(RaceLogStartTimeEvent startTimeEvent) { DBObject result = new BasicDBObject(); @@ -611,4 +625,71 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { result.put(FieldNames.COURSE_AREA_ID.name(), courseAreaChangedEvent.getCourseAreaId()); return result; } + + private DBObject storeRaceLogCourseDesignChangedEvent(RaceLogCourseDesignChangedEvent courseDesignChangedEvent) { + DBObject result = new BasicDBObject(); + storeTimed(courseDesignChangedEvent, result); + storeRaceLogEventProperties(courseDesignChangedEvent, result); + + result.put(FieldNames.RACE_LOG_EVENT_CLASS.name(), RaceLogCourseDesignChangedEvent.class.getSimpleName()); + + result.put(FieldNames.RACE_LOG_COURSE_DESIGN.name(), storeCourseData(courseDesignChangedEvent.getCourseDesign())); + return result; + } + + private BasicDBList storeCourseData(CourseData courseData) { + BasicDBList dbList = new BasicDBList(); + + for (Waypoint waypoint : courseData.getWaypoints()) { + dbList.add(storeWaypoint(waypoint)); + } + return dbList; + } + + private DBObject storeWaypoint(Waypoint waypoint) { + DBObject result = new BasicDBObject(); + result.put(FieldNames.WAYPOINT_PASSINGSIDE.name(), getPassingSide(waypoint.getPassingSide())); + result.put(FieldNames.CONTROLPOINT.name(), storeControlPoint(waypoint.getControlPoint())); + return result; + } + + private DBObject storeControlPoint(ControlPoint controlPoint) { + DBObject result = new BasicDBObject(); + if (controlPoint instanceof Mark) { + result.put(FieldNames.CONTROLPOINT_CLASS.name(), Mark.class.getSimpleName()); + result.put(FieldNames.CONTROLPOINT_VALUE.name(), storeMark((Mark) controlPoint)); + } else if (controlPoint instanceof Gate) { + result.put(FieldNames.CONTROLPOINT_CLASS.name(), Gate.class.getSimpleName()); + result.put(FieldNames.CONTROLPOINT_VALUE.name(), storeGate((Gate) controlPoint)); + } + return result; + } + + private DBObject storeGate(Gate gate) { + DBObject result = new BasicDBObject(); + result.put(FieldNames.GATE_ID.name(), gate.getId()); + result.put(FieldNames.GATE_NAME.name(), gate.getName()); + result.put(FieldNames.GATE_LEFT.name(), storeMark(gate.getLeft())); + result.put(FieldNames.GATE_RIGHT.name(), storeMark(gate.getRight())); + return result; + } + + private DBObject storeMark(Mark mark) { + DBObject result = new BasicDBObject(); + result.put(FieldNames.MARK_ID.name(), mark.getId()); + result.put(FieldNames.MARK_COLOR.name(), mark.getColor()); + result.put(FieldNames.MARK_NAME.name(), mark.getName()); + result.put(FieldNames.MARK_PATTERN.name(), mark.getPattern()); + result.put(FieldNames.MARK_SHAPE.name(), mark.getShape()); + result.put(FieldNames.MARK_TYPE.name(), mark.getType().name()); + return result; + } + + private String getPassingSide(NauticalSide passingSide) { + String passing = null; + if (passingSide != null) { + passing = passingSide.name(); + } + return passing; + } } diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogListener.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogListener.java index 6768831c44e..65216800d16 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogListener.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogListener.java @@ -5,6 +5,7 @@ import com.mongodb.DBCollection; import com.mongodb.DBObject; import com.sap.sailing.domain.persistence.MongoObjectFactory; import com.sap.sailing.domain.racelog.RaceLogCourseAreaChangedEvent; +import com.sap.sailing.domain.racelog.RaceLogCourseDesignChangedEvent; import com.sap.sailing.domain.racelog.RaceLogEventVisitor; import com.sap.sailing.domain.racelog.RaceLogFlagEvent; import com.sap.sailing.domain.racelog.RaceLogIdentifier; @@ -55,4 +56,10 @@ public class MongoRaceLogListener implements RaceLogEventVisitor { raceLogsCollection.insert(courseAreaChangedEventTrackEntry); } + @Override + public void visit(RaceLogCourseDesignChangedEvent event) { + DBObject courseDesignChangedEventTrackEntry = mongoObjectFactory.storeRaceLogEntry(raceLogIdentifier, event); + raceLogsCollection.insert(courseDesignChangedEventTrackEntry); + } + } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/CourseDataImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/CourseDataImpl.java similarity index 93% rename from mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/CourseDataImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/CourseDataImpl.java index 7e6b59dbed8..edbdd014306 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/CourseDataImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/CourseDataImpl.java @@ -1,4 +1,4 @@ -package com.sap.sailing.racecommittee.app.domain.impl; +package com.sap.sailing.domain.base.impl; import java.util.ArrayList; import java.util.List; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogCourseDesignChangedEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogCourseDesignChangedEvent.java new file mode 100644 index 00000000000..c26af741706 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogCourseDesignChangedEvent.java @@ -0,0 +1,9 @@ +package com.sap.sailing.domain.racelog; + +import com.sap.sailing.domain.base.CourseData; + +public interface RaceLogCourseDesignChangedEvent extends RaceLogEvent { + + CourseData getCourseDesign(); + +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventFactory.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventFactory.java index 2bc1c110707..678f364afd4 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventFactory.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventFactory.java @@ -4,6 +4,7 @@ import java.io.Serializable; import java.util.List; import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.CourseData; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; @@ -26,4 +27,7 @@ public interface RaceLogEventFactory { RaceLogCourseAreaChangedEvent createRaceLogCourseAreaChangedEvent(TimePoint timePoint, Serializable id, List competitors, int passId, Serializable courseAreaId); RaceLogCourseAreaChangedEvent createRaceLogCourseAreaChangedEvent(TimePoint timePoint, int passId, Serializable courseAreaId); + + RaceLogCourseDesignChangedEvent createCourseDesignChangedEvent(TimePoint timePoint, Serializable id, List competitors, int passId, CourseData courseData); + RaceLogCourseDesignChangedEvent createCourseDesignChangedEvent(TimePoint timePoint, int passId, CourseData courseData); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventVisitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventVisitor.java index aa88ddc22cf..c658e2df963 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventVisitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventVisitor.java @@ -1,13 +1,15 @@ -package com.sap.sailing.domain.racelog; - -public interface RaceLogEventVisitor { - public void visit(RaceLogFlagEvent event); - - public void visit(RaceLogPassChangeEvent event); - - public void visit(RaceLogRaceStatusEvent event); - - public void visit(RaceLogStartTimeEvent event); - - public void visit(RaceLogCourseAreaChangedEvent event); -} +package com.sap.sailing.domain.racelog; + +public interface RaceLogEventVisitor { + public void visit(RaceLogFlagEvent event); + + public void visit(RaceLogPassChangeEvent event); + + public void visit(RaceLogRaceStatusEvent event); + + public void visit(RaceLogStartTimeEvent event); + + public void visit(RaceLogCourseAreaChangedEvent event); + + public void visit(RaceLogCourseDesignChangedEvent event); +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogCourseDesignChangedEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogCourseDesignChangedEventImpl.java new file mode 100644 index 00000000000..68d55d402b6 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogCourseDesignChangedEventImpl.java @@ -0,0 +1,33 @@ +package com.sap.sailing.domain.racelog.impl; + +import java.io.Serializable; +import java.util.List; + +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.CourseData; +import com.sap.sailing.domain.common.TimePoint; +import com.sap.sailing.domain.racelog.RaceLogCourseDesignChangedEvent; +import com.sap.sailing.domain.racelog.RaceLogEventVisitor; + +public class RaceLogCourseDesignChangedEventImpl extends RaceLogEventImpl implements RaceLogCourseDesignChangedEvent { + private static final long serialVersionUID = 1565936170747420547L; + + private CourseData courseDesign; + + public RaceLogCourseDesignChangedEventImpl(TimePoint pTimePoint, + Serializable pId, List pInvolvedBoats, int pPassId, CourseData courseDesign) { + super(pTimePoint, pId, pInvolvedBoats, pPassId); + this.courseDesign = courseDesign; + } + + @Override + public void accept(RaceLogEventVisitor visitor) { + visitor.visit(this); + } + + @Override + public CourseData getCourseDesign() { + return courseDesign; + } + +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventFactoryImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventFactoryImpl.java index 22bd98f3066..758cb0fa117 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventFactoryImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventFactoryImpl.java @@ -6,10 +6,12 @@ import java.util.List; import java.util.UUID; import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.CourseData; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.domain.racelog.RaceLogCourseAreaChangedEvent; +import com.sap.sailing.domain.racelog.RaceLogCourseDesignChangedEvent; import com.sap.sailing.domain.racelog.RaceLogEventFactory; import com.sap.sailing.domain.racelog.RaceLogFlagEvent; import com.sap.sailing.domain.racelog.RaceLogPassChangeEvent; @@ -76,4 +78,16 @@ public class RaceLogEventFactoryImpl implements RaceLogEventFactory { return createRaceLogCourseAreaChangedEvent(timePoint, UUID.randomUUID(), new ArrayList(), passId, courseAreaId); } + @Override + public RaceLogCourseDesignChangedEvent createCourseDesignChangedEvent(TimePoint timePoint, Serializable id, + List competitors, int passId, CourseData courseData) { + return new RaceLogCourseDesignChangedEventImpl(timePoint, id, competitors, passId, courseData); + } + + @Override + public RaceLogCourseDesignChangedEvent createCourseDesignChangedEvent(TimePoint timePoint, int passId, + CourseData courseData) { + return createCourseDesignChangedEvent(timePoint, UUID.randomUUID(), new ArrayList(), passId, courseData); + } + } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java index b1ebc1cf77b..133bce6d286 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java @@ -1,57 +1,63 @@ -package com.sap.sailing.domain.base.impl; - -import java.io.Serializable; - -import com.sap.sailing.domain.base.RaceColumn; -import com.sap.sailing.domain.racelog.RaceLogCourseAreaChangedEvent; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; -import com.sap.sailing.domain.racelog.RaceLogFlagEvent; -import com.sap.sailing.domain.racelog.RaceLogIdentifier; -import com.sap.sailing.domain.racelog.RaceLogPassChangeEvent; -import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; -import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; - -public class RaceColumnRaceLogReplicator implements RaceLogEventVisitor, Serializable { - private static final long serialVersionUID = 4752330236765192592L; - - private final RaceColumn raceColumn; - private final RaceLogIdentifier identifier; - - public RaceColumnRaceLogReplicator(RaceColumn raceColumn, RaceLogIdentifier identifier) { - this.raceColumn = raceColumn; - this.identifier = identifier; - } - - private void notifyOnAdd(RaceLogEvent event) { - raceColumn.getRaceColumnListeners().notifyListenersAboutRaceLogEventAdded( - raceColumn, - identifier, - event); - } - - @Override - public void visit(RaceLogCourseAreaChangedEvent event) { - notifyOnAdd(event); - } - - @Override - public void visit(RaceLogStartTimeEvent event) { - notifyOnAdd(event); - } - - @Override - public void visit(RaceLogRaceStatusEvent event) { - notifyOnAdd(event); - } - - @Override - public void visit(RaceLogPassChangeEvent event) { - notifyOnAdd(event); - } - - @Override - public void visit(RaceLogFlagEvent event) { - notifyOnAdd(event); - } -} +package com.sap.sailing.domain.base.impl; + +import java.io.Serializable; + +import com.sap.sailing.domain.base.RaceColumn; +import com.sap.sailing.domain.racelog.RaceLogCourseAreaChangedEvent; +import com.sap.sailing.domain.racelog.RaceLogCourseDesignChangedEvent; +import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.racelog.RaceLogEventVisitor; +import com.sap.sailing.domain.racelog.RaceLogFlagEvent; +import com.sap.sailing.domain.racelog.RaceLogIdentifier; +import com.sap.sailing.domain.racelog.RaceLogPassChangeEvent; +import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; +import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; + +public class RaceColumnRaceLogReplicator implements RaceLogEventVisitor, Serializable { + private static final long serialVersionUID = 4752330236765192592L; + + private final RaceColumn raceColumn; + private final RaceLogIdentifier identifier; + + public RaceColumnRaceLogReplicator(RaceColumn raceColumn, RaceLogIdentifier identifier) { + this.raceColumn = raceColumn; + this.identifier = identifier; + } + + private void notifyOnAdd(RaceLogEvent event) { + raceColumn.getRaceColumnListeners().notifyListenersAboutRaceLogEventAdded( + raceColumn, + identifier, + event); + } + + @Override + public void visit(RaceLogCourseAreaChangedEvent event) { + notifyOnAdd(event); + } + + @Override + public void visit(RaceLogStartTimeEvent event) { + notifyOnAdd(event); + } + + @Override + public void visit(RaceLogRaceStatusEvent event) { + notifyOnAdd(event); + } + + @Override + public void visit(RaceLogPassChangeEvent event) { + notifyOnAdd(event); + } + + @Override + public void visit(RaceLogFlagEvent event) { + notifyOnAdd(event); + } + + @Override + public void visit(RaceLogCourseDesignChangedEvent event) { + notifyOnAdd(event); + } +} diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializerChooserImpl.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializerChooserImpl.java index 1aad7035935..cbf11b6d95c 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializerChooserImpl.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializerChooserImpl.java @@ -1,75 +1,82 @@ -package com.sap.sailing.server.gateway.serialization.racelog.impl; - -import com.sap.sailing.domain.racelog.RaceLogCourseAreaChangedEvent; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; -import com.sap.sailing.domain.racelog.RaceLogFlagEvent; -import com.sap.sailing.domain.racelog.RaceLogPassChangeEvent; -import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; -import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; -import com.sap.sailing.server.gateway.serialization.JsonSerializer; -import com.sap.sailing.server.gateway.serialization.racelog.RaceLogEventSerializerChooser; - -public class RaceLogEventSerializerChooserImpl implements RaceLogEventSerializerChooser, RaceLogEventVisitor { - - private final JsonSerializer flagEventSerializer; - private final JsonSerializer startTimeSerializer; - private final JsonSerializer raceStatusSerializer; - private final JsonSerializer courseAreaChangedEventSerializer; - private final JsonSerializer passChangedEventSerializer; - - private JsonSerializer chosenSerializer; - - public RaceLogEventSerializerChooserImpl( - JsonSerializer flagEventSerializer, - JsonSerializer startTimeSerializer, - JsonSerializer raceStatusSerializer, - JsonSerializer courseAreaChangedEventSerializer, - JsonSerializer passChangedEventSerializer) { - this.flagEventSerializer = flagEventSerializer; - this.startTimeSerializer = startTimeSerializer; - this.raceStatusSerializer = raceStatusSerializer; - this.courseAreaChangedEventSerializer = courseAreaChangedEventSerializer; - this.passChangedEventSerializer = passChangedEventSerializer; - - this.chosenSerializer = null; - } - - @Override - public JsonSerializer getSerializer(RaceLogEvent event) { - chosenSerializer = null; - event.accept(this); - if (chosenSerializer == null) { - throw new UnsupportedOperationException( - String.format("There is no serializer for event type %s", - event.getClass().getName())); - } - return chosenSerializer; - } - - @Override - public void visit(RaceLogFlagEvent event) { - chosenSerializer = flagEventSerializer; - } - - @Override - public void visit(RaceLogPassChangeEvent event) { - chosenSerializer = passChangedEventSerializer; - } - - @Override - public void visit(RaceLogRaceStatusEvent event) { - chosenSerializer = raceStatusSerializer; - } - - @Override - public void visit(RaceLogStartTimeEvent event) { - chosenSerializer = startTimeSerializer; - } - - @Override - public void visit(RaceLogCourseAreaChangedEvent event) { - chosenSerializer = courseAreaChangedEventSerializer; - } - -} +package com.sap.sailing.server.gateway.serialization.racelog.impl; + +import com.sap.sailing.domain.racelog.RaceLogCourseAreaChangedEvent; +import com.sap.sailing.domain.racelog.RaceLogCourseDesignChangedEvent; +import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.racelog.RaceLogEventVisitor; +import com.sap.sailing.domain.racelog.RaceLogFlagEvent; +import com.sap.sailing.domain.racelog.RaceLogPassChangeEvent; +import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; +import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; +import com.sap.sailing.server.gateway.serialization.JsonSerializer; +import com.sap.sailing.server.gateway.serialization.racelog.RaceLogEventSerializerChooser; + +public class RaceLogEventSerializerChooserImpl implements RaceLogEventSerializerChooser, RaceLogEventVisitor { + + private final JsonSerializer flagEventSerializer; + private final JsonSerializer startTimeSerializer; + private final JsonSerializer raceStatusSerializer; + private final JsonSerializer courseAreaChangedEventSerializer; + private final JsonSerializer passChangedEventSerializer; + + private JsonSerializer chosenSerializer; + + public RaceLogEventSerializerChooserImpl( + JsonSerializer flagEventSerializer, + JsonSerializer startTimeSerializer, + JsonSerializer raceStatusSerializer, + JsonSerializer courseAreaChangedEventSerializer, + JsonSerializer passChangedEventSerializer) { + this.flagEventSerializer = flagEventSerializer; + this.startTimeSerializer = startTimeSerializer; + this.raceStatusSerializer = raceStatusSerializer; + this.courseAreaChangedEventSerializer = courseAreaChangedEventSerializer; + this.passChangedEventSerializer = passChangedEventSerializer; + + this.chosenSerializer = null; + } + + @Override + public JsonSerializer getSerializer(RaceLogEvent event) { + chosenSerializer = null; + event.accept(this); + if (chosenSerializer == null) { + throw new UnsupportedOperationException( + String.format("There is no serializer for event type %s", + event.getClass().getName())); + } + return chosenSerializer; + } + + @Override + public void visit(RaceLogFlagEvent event) { + chosenSerializer = flagEventSerializer; + } + + @Override + public void visit(RaceLogPassChangeEvent event) { + chosenSerializer = passChangedEventSerializer; + } + + @Override + public void visit(RaceLogRaceStatusEvent event) { + chosenSerializer = raceStatusSerializer; + } + + @Override + public void visit(RaceLogStartTimeEvent event) { + chosenSerializer = startTimeSerializer; + } + + @Override + public void visit(RaceLogCourseAreaChangedEvent event) { + chosenSerializer = courseAreaChangedEventSerializer; + } + + @Override + public void visit(RaceLogCourseDesignChangedEvent event) { + // TODO Auto-generated method stub + + } + +} diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/racelog/impl/RaceLogChangedVisitor.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/racelog/impl/RaceLogChangedVisitor.java index 6f397541131..dcb81350e57 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/racelog/impl/RaceLogChangedVisitor.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/racelog/impl/RaceLogChangedVisitor.java @@ -1,39 +1,44 @@ -package com.sap.sailing.racecommittee.app.domain.racelog.impl; - -import com.sap.sailing.domain.racelog.RaceLogCourseAreaChangedEvent; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; -import com.sap.sailing.domain.racelog.RaceLogFlagEvent; -import com.sap.sailing.domain.racelog.RaceLogPassChangeEvent; -import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; -import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; -import com.sap.sailing.racecommittee.app.domain.racelog.RaceLogChangedListener; - -public class RaceLogChangedVisitor implements RaceLogEventVisitor { - - private RaceLogChangedListener listener; - - public RaceLogChangedVisitor(RaceLogChangedListener listener) { - this.listener = listener; - } - - public void visit(RaceLogFlagEvent event) { - listener.eventAdded(event); - } - - public void visit(RaceLogPassChangeEvent event) { - listener.eventAdded(event); - } - - public void visit(RaceLogRaceStatusEvent event) { - listener.eventAdded(event); - } - - public void visit(RaceLogStartTimeEvent event) { - listener.eventAdded(event); - } - - public void visit(RaceLogCourseAreaChangedEvent event) { - listener.eventAdded(event); - } - -} +package com.sap.sailing.racecommittee.app.domain.racelog.impl; + +import com.sap.sailing.domain.racelog.RaceLogCourseAreaChangedEvent; +import com.sap.sailing.domain.racelog.RaceLogCourseDesignChangedEvent; +import com.sap.sailing.domain.racelog.RaceLogEventVisitor; +import com.sap.sailing.domain.racelog.RaceLogFlagEvent; +import com.sap.sailing.domain.racelog.RaceLogPassChangeEvent; +import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; +import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; +import com.sap.sailing.racecommittee.app.domain.racelog.RaceLogChangedListener; + +public class RaceLogChangedVisitor implements RaceLogEventVisitor { + + private RaceLogChangedListener listener; + + public RaceLogChangedVisitor(RaceLogChangedListener listener) { + this.listener = listener; + } + + public void visit(RaceLogFlagEvent event) { + listener.eventAdded(event); + } + + public void visit(RaceLogPassChangeEvent event) { + listener.eventAdded(event); + } + + public void visit(RaceLogRaceStatusEvent event) { + listener.eventAdded(event); + } + + public void visit(RaceLogStartTimeEvent event) { + listener.eventAdded(event); + } + + public void visit(RaceLogCourseAreaChangedEvent event) { + listener.eventAdded(event); + } + + public void visit(RaceLogCourseDesignChangedEvent event) { + listener.eventAdded(event); + } + +} diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/impl/RaceStateImpl.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/impl/RaceStateImpl.java index 26216870202..ca4b505e7f0 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/impl/RaceStateImpl.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/impl/RaceStateImpl.java @@ -6,6 +6,8 @@ import java.util.Set; import java.util.UUID; import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.CourseData; +import com.sap.sailing.domain.base.impl.MillisecondsTimePoint; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.domain.racelog.PassAwareRaceLog; @@ -101,6 +103,14 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener { public TimePoint getFinishedTime() { return finishedTimeFinder.getFinishedTime(); } + + public void setCourseDesign(CourseData courseData) { + TimePoint eventTime = MillisecondsTimePoint.now(); + + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createCourseDesignChangedEvent(eventTime, UUID.randomUUID(), + Collections. emptyList(), raceLog.getCurrentPassId(), courseData); + this.raceLog.add(event); + } public void onRaceAborted(TimePoint eventTime) { RaceLogEvent abortEvent = RaceLogEventFactory.INSTANCE.createRaceStatusEvent(eventTime, raceLog.getCurrentPassId(), RaceLogRaceStatus.UNSCHEDULED); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/CourseDesignDialogFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/CourseDesignDialogFragment.java index d0d3bc13297..0ad5526604b 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/CourseDesignDialogFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/CourseDesignDialogFragment.java @@ -25,6 +25,7 @@ import com.sap.sailing.domain.base.CourseData; import com.sap.sailing.domain.base.Gate; import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.base.Waypoint; +import com.sap.sailing.domain.base.impl.CourseDataImpl; import com.sap.sailing.domain.base.impl.GateImpl; import com.sap.sailing.domain.base.impl.WaypointImpl; import com.sap.sailing.domain.common.NauticalSide; @@ -32,7 +33,6 @@ import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.racecommittee.app.R; import com.sap.sailing.racecommittee.app.data.InMemoryDataStore; import com.sap.sailing.racecommittee.app.domain.RoundingDirection; -import com.sap.sailing.racecommittee.app.domain.impl.CourseDataImpl; import com.sap.sailing.racecommittee.app.logging.ExLog; import com.sap.sailing.racecommittee.app.ui.adapters.coursedesign.CourseElementListAdapter; import com.sap.sailing.racecommittee.app.ui.adapters.coursedesign.CourseListDataElement;