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 d71fac2f367..e5d48877808 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 @@ -95,6 +95,7 @@ import com.sap.sailing.domain.racelog.RaceLogEventRestoreFactory; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningConfirmedEvent; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningListChangedEvent; import com.sap.sailing.domain.racelog.RaceLogFlagEvent; +import com.sap.sailing.domain.racelog.RaceLogGateLineOpeningTimeEvent; import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.racelog.RaceLogPassChangeEvent; import com.sap.sailing.domain.racelog.RaceLogPathfinderEvent; @@ -1040,17 +1041,25 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { return loadRaceLogFinishPositioningConfirmedEvent(createdAt, timePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(RaceLogPathfinderEvent.class.getSimpleName())) { return loadRaceLogPathfinderEvent(createdAt, timePoint, id, passId, competitors, dbObject); + } else if (eventClass.equals(RaceLogGateLineOpeningTimeEvent.class.getSimpleName())) { + return loadRaceLogGateLineOpeningTimeEvent(createdAt, timePoint, id, passId, competitors, dbObject); } throw new IllegalStateException(String.format("Unknown RaceLogEvent type %s", eventClass)); } + private RaceLogEvent loadRaceLogGateLineOpeningTimeEvent(TimePoint createdAt, TimePoint timePoint, Serializable id, + Integer passId, List competitors, DBObject dbObject) { + Long gateLineOpeningTime = (Long) dbObject.get(FieldNames.RACE_LOG_GATE_LINE_OPENING_TIME.name()); + return raceLogEventFactory.createGateLineOpeningTimeEvent(createdAt, timePoint, id, competitors, passId, gateLineOpeningTime); + } + private RaceLogEvent loadRaceLogPathfinderEvent(TimePoint createdAt, TimePoint timePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { String pathfinderId = dbObject.get(FieldNames.RACE_LOG_PATHFINDER_ID.name()).toString(); return raceLogEventFactory.createPathfinderEvent(createdAt, timePoint, id, competitors, passId, pathfinderId); } - + private RaceLogEvent loadRaceLogFinishPositioningConfirmedEvent(TimePoint createdAt, TimePoint timePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { return raceLogEventFactory.createFinishPositioningConfirmedEvent(createdAt, timePoint, id, competitors, passId); 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 7f4c499cfa3..543197415dd 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 @@ -69,5 +69,5 @@ public enum FieldNames { RACE_LOG_EVENT, RACE_LOG_EVENT_PASS_ID, RACE_LOG_EVENT_ID, RACE_LOG_EVENT_CREATED_AT, 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_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, RACE_LOG_POSITIONED_COMPETITORS, RACE_LOG_PATHFINDER_ID; + CONTROLPOINT_VALUE, GATE_ID, GATE_NAME, GATE_LEFT, GATE_RIGHT, RACE_LOG_POSITIONED_COMPETITORS, RACE_LOG_PATHFINDER_ID, RACE_LOG_GATE_LINE_OPENING_TIME; } 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 c192dcc3010..2bc72ad0f6b 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 @@ -50,6 +50,7 @@ import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningConfirmedEvent; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningListChangedEvent; import com.sap.sailing.domain.racelog.RaceLogFlagEvent; +import com.sap.sailing.domain.racelog.RaceLogGateLineOpeningTimeEvent; import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.racelog.RaceLogPassChangeEvent; import com.sap.sailing.domain.racelog.RaceLogPathfinderEvent; @@ -580,7 +581,14 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { public DBObject storeRaceLogEntry(RaceLogIdentifier raceLogIdentifier, RaceLogPathfinderEvent pathfinderEvent) { BasicDBObject result = new BasicDBObject(); result.put(FieldNames.RACE_LOG_IDENTIFIER.name(), MongoUtils.escapeDollarAndDot(raceLogIdentifier.getIdentifier().toString())); - result.put(FieldNames.RACE_LOG_EVENT.name(), storeRaceLogPathfinderEventEvent(pathfinderEvent)); + result.put(FieldNames.RACE_LOG_EVENT.name(), storeRaceLogPathfinderEvent(pathfinderEvent)); + return result; + } + + public DBObject storeRaceLogEntry(RaceLogIdentifier raceLogIdentifier, RaceLogGateLineOpeningTimeEvent gateLineOpeningTimeEvent) { + BasicDBObject result = new BasicDBObject(); + result.put(FieldNames.RACE_LOG_IDENTIFIER.name(), MongoUtils.escapeDollarAndDot(raceLogIdentifier.getIdentifier().toString())); + result.put(FieldNames.RACE_LOG_EVENT.name(), storeRaceLogGateLineOpeningTimeEvent(gateLineOpeningTimeEvent)); return result; } @@ -682,7 +690,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { return result; } - private Object storeRaceLogPathfinderEventEvent(RaceLogPathfinderEvent pathfinderEvent) { + private Object storeRaceLogPathfinderEvent(RaceLogPathfinderEvent pathfinderEvent) { DBObject result = new BasicDBObject(); storeRaceLogEventProperties(pathfinderEvent, result); @@ -692,6 +700,16 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { return result; } + private Object storeRaceLogGateLineOpeningTimeEvent(RaceLogGateLineOpeningTimeEvent gateLineOpeningTimeEvent){ + DBObject result = new BasicDBObject(); + storeRaceLogEventProperties(gateLineOpeningTimeEvent, result); + + result.put(FieldNames.RACE_LOG_EVENT_CLASS.name(), RaceLogGateLineOpeningTimeEvent.class.getSimpleName()); + + result.put(FieldNames.RACE_LOG_GATE_LINE_OPENING_TIME.name(), gateLineOpeningTimeEvent.getGateLineOpeningTime()); + return result; + } + private BasicDBList storePositionedCompetitors(List> positionedCompetitors) { BasicDBList dbList = new BasicDBList(); 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 784d137171d..fc44003fb8a 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 @@ -10,6 +10,7 @@ import com.sap.sailing.domain.racelog.RaceLogEventVisitor; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningConfirmedEvent; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningListChangedEvent; import com.sap.sailing.domain.racelog.RaceLogFlagEvent; +import com.sap.sailing.domain.racelog.RaceLogGateLineOpeningTimeEvent; import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.racelog.RaceLogPassChangeEvent; import com.sap.sailing.domain.racelog.RaceLogPathfinderEvent; @@ -83,4 +84,10 @@ public class MongoRaceLogListener implements RaceLogEventVisitor { raceLogsCollection.insert(pathfinderEventTrackEntry); } + @Override + public void visit(RaceLogGateLineOpeningTimeEvent event) { + DBObject gateLineOpeningTimeEventTrackEntry = mongoObjectFactory.storeRaceLogEntry(raceLogIdentifier, event); + raceLogsCollection.insert(gateLineOpeningTimeEventTrackEntry); + } + } 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 fd1d7aaffa0..4ed6dbbdd0a 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 @@ -42,4 +42,7 @@ public interface RaceLogEventFactory { RaceLogPathfinderEvent createPathfinderEvent(TimePoint timePoint, Serializable id, List competitors, int passId, String pathfinderId); RaceLogPathfinderEvent createPathfinderEvent(TimePoint timePoint, int passId, String pathfinderId); + RaceLogGateLineOpeningTimeEvent createGateLineOpeningTimeEvent(TimePoint timePoint, Serializable id, List competitors, int passId, Long gateLineOpeningTimeInMillis); + RaceLogGateLineOpeningTimeEvent createGateLineOpeningTimeEvent(TimePoint timePoint, int passId, Long gateLineOpeningTimeInMillis); + } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventRestoreFactory.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventRestoreFactory.java index e862eec4d55..8a4e7f4ed10 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventRestoreFactory.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventRestoreFactory.java @@ -41,4 +41,7 @@ public interface RaceLogEventRestoreFactory extends RaceLogEventFactory { RaceLogPathfinderEvent createPathfinderEvent(TimePoint createdAt, TimePoint logicalTimePoint, Serializable id, List competitors, int passId, String pathfinderId); + + RaceLogGateLineOpeningTimeEvent createGateLineOpeningTimeEvent(TimePoint createdAt, TimePoint logicalTimePoint, Serializable id, + List competitors, int passId, Long gateLineOpeningTime); } 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 42153a1cb85..afaba1d5bcb 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 @@ -18,4 +18,6 @@ public interface RaceLogEventVisitor { public void visit(RaceLogFinishPositioningConfirmedEvent event); public void visit(RaceLogPathfinderEvent event); + + public void visit(RaceLogGateLineOpeningTimeEvent event); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogGateLineOpeningTimeEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogGateLineOpeningTimeEvent.java new file mode 100644 index 00000000000..e47e110d8ba --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogGateLineOpeningTimeEvent.java @@ -0,0 +1,6 @@ +package com.sap.sailing.domain.racelog; + + +public interface RaceLogGateLineOpeningTimeEvent extends RaceLogEvent { + Long getGateLineOpeningTime(); +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogGatelineOpeneningTimeEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogGatelineOpeneningTimeEvent.java deleted file mode 100644 index 4006d8315e4..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogGatelineOpeneningTimeEvent.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.sap.sailing.domain.racelog; - - -public interface RaceLogGatelineOpeneningTimeEvent extends RaceLogEvent { - long getGateLineOpeningTime(); -} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/GateLineOpeningTimeFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/GateLineOpeningTimeFinder.java new file mode 100644 index 00000000000..f2033952b22 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/GateLineOpeningTimeFinder.java @@ -0,0 +1,38 @@ +package com.sap.sailing.domain.racelog.analyzing.impl; + +import com.sap.sailing.domain.racelog.RaceLog; +import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.racelog.RaceLogGateLineOpeningTimeEvent; + +public class GateLineOpeningTimeFinder extends RaceLogAnalyzer { + + public GateLineOpeningTimeFinder(RaceLog raceLog) { + super(raceLog); + } + + public Long getGateLineOpeningTime() { + Long gateLineOpeningTime; + this.raceLog.lockForRead(); + try { + gateLineOpeningTime = searchForGateLineOpeningTime(); + } finally { + this.raceLog.unlockAfterRead(); + } + + return gateLineOpeningTime; + } + + private Long searchForGateLineOpeningTime() { + Long gateLineOpeningTime = null; + + for (RaceLogEvent event : getPassEvents()) { + if (event instanceof RaceLogGateLineOpeningTimeEvent) { + gateLineOpeningTime = ((RaceLogGateLineOpeningTimeEvent) event).getGateLineOpeningTime(); + + } + } + + return gateLineOpeningTime; + } + +} 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 7c369d1ad3c..d33b267b57d 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 @@ -18,6 +18,7 @@ import com.sap.sailing.domain.racelog.RaceLogCourseDesignChangedEvent; import com.sap.sailing.domain.racelog.RaceLogEventFactory; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningConfirmedEvent; import com.sap.sailing.domain.racelog.RaceLogFlagEvent; +import com.sap.sailing.domain.racelog.RaceLogGateLineOpeningTimeEvent; import com.sap.sailing.domain.racelog.RaceLogPassChangeEvent; import com.sap.sailing.domain.racelog.RaceLogPathfinderEvent; import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; @@ -128,4 +129,16 @@ public class RaceLogEventFactoryImpl implements RaceLogEventFactory { return createPathfinderEvent(timePoint, UUID.randomUUID(), new ArrayList(), passId, pathfinderId); } + @Override + public RaceLogGateLineOpeningTimeEvent createGateLineOpeningTimeEvent(TimePoint timePoint, Serializable id, + List competitors, int passId, Long gateLineOpeningTimeInMillis) { + return new RaceLogGateLineOpeningTimeEventImpl(MillisecondsTimePoint.now(), timePoint, id, competitors, passId, gateLineOpeningTimeInMillis); + } + + @Override + public RaceLogGateLineOpeningTimeEvent createGateLineOpeningTimeEvent(TimePoint timePoint, int passId, + Long gateLineOpeningTimeInMillis) { + return createGateLineOpeningTimeEvent(timePoint, UUID.randomUUID(), new ArrayList(), passId, gateLineOpeningTimeInMillis); + } + } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventRestoreFactoryImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventRestoreFactoryImpl.java index d062e8446de..39dead9809d 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventRestoreFactoryImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventRestoreFactoryImpl.java @@ -16,6 +16,7 @@ import com.sap.sailing.domain.racelog.RaceLogEventRestoreFactory; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningConfirmedEvent; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningListChangedEvent; import com.sap.sailing.domain.racelog.RaceLogFlagEvent; +import com.sap.sailing.domain.racelog.RaceLogGateLineOpeningTimeEvent; import com.sap.sailing.domain.racelog.RaceLogPassChangeEvent; import com.sap.sailing.domain.racelog.RaceLogPathfinderEvent; import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; @@ -77,5 +78,11 @@ public class RaceLogEventRestoreFactoryImpl extends RaceLogEventFactoryImpl impl return new RaceLogPathfinderEventImpl(createdAt, logicalTimePoint, id, competitors, passId, pathfinderId); } + @Override + public RaceLogGateLineOpeningTimeEvent createGateLineOpeningTimeEvent(TimePoint createdAt, TimePoint logicalTimePoint, + Serializable id, List competitors, int passId, Long gateLineOpeningTime) { + return new RaceLogGateLineOpeningTimeEventImpl(createdAt, logicalTimePoint, id, competitors, passId, gateLineOpeningTime); + } + } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogGateLineOpeningTimeEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogGateLineOpeningTimeEventImpl.java new file mode 100644 index 00000000000..0f90197e34c --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogGateLineOpeningTimeEventImpl.java @@ -0,0 +1,32 @@ +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.common.TimePoint; +import com.sap.sailing.domain.racelog.RaceLogEventVisitor; +import com.sap.sailing.domain.racelog.RaceLogGateLineOpeningTimeEvent; + +public class RaceLogGateLineOpeningTimeEventImpl extends RaceLogEventImpl implements RaceLogGateLineOpeningTimeEvent { + + private static final long serialVersionUID = 793529890804809490L; + private Long gateLineOpeningTime; + + public RaceLogGateLineOpeningTimeEventImpl(TimePoint createdAt, + TimePoint pTimePoint, Serializable pId, List pCompetitors, int pPassId, Long gateLineOpeningTime) { + super(createdAt, pTimePoint, pId, pCompetitors, pPassId); + this.gateLineOpeningTime = gateLineOpeningTime; + } + + @Override + public void accept(RaceLogEventVisitor visitor) { + visitor.visit(this); + } + + @Override + public Long getGateLineOpeningTime() { + return this.gateLineOpeningTime; + } + +} 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 92656d7394f..3484e595589 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 @@ -10,6 +10,7 @@ import com.sap.sailing.domain.racelog.RaceLogEventVisitor; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningConfirmedEvent; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningListChangedEvent; import com.sap.sailing.domain.racelog.RaceLogFlagEvent; +import com.sap.sailing.domain.racelog.RaceLogGateLineOpeningTimeEvent; import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.racelog.RaceLogPassChangeEvent; import com.sap.sailing.domain.racelog.RaceLogPathfinderEvent; @@ -78,4 +79,9 @@ public class RaceColumnRaceLogReplicator implements RaceLogEventVisitor, Seriali public void visit(RaceLogPathfinderEvent event) { notifyOnAdd(event); } + + @Override + public void visit(RaceLogGateLineOpeningTimeEvent event) { + notifyOnAdd(event); + } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceLogListener.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceLogListener.java index 3f066868755..6b6628ce013 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceLogListener.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceLogListener.java @@ -6,6 +6,7 @@ import com.sap.sailing.domain.racelog.RaceLogEventVisitor; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningConfirmedEvent; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningListChangedEvent; import com.sap.sailing.domain.racelog.RaceLogFlagEvent; +import com.sap.sailing.domain.racelog.RaceLogGateLineOpeningTimeEvent; import com.sap.sailing.domain.racelog.RaceLogPassChangeEvent; import com.sap.sailing.domain.racelog.RaceLogPathfinderEvent; import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; @@ -64,7 +65,12 @@ public class TrackedRaceLogListener implements RaceLogEventVisitor { @Override public void visit(RaceLogPathfinderEvent event) { - // doo nothing + // do nothing + } + + @Override + public void visit(RaceLogGateLineOpeningTimeEvent event) { + // do nothing } } diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java index 103cf6b2ae1..b4d8d1d3b8d 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java @@ -39,6 +39,7 @@ import com.sap.sailing.domain.racelog.RaceLogEventFactory; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningConfirmedEvent; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningListChangedEvent; import com.sap.sailing.domain.racelog.RaceLogFlagEvent; +import com.sap.sailing.domain.racelog.RaceLogGateLineOpeningTimeEvent; import com.sap.sailing.domain.racelog.RaceLogPassChangeEvent; import com.sap.sailing.domain.racelog.RaceLogPathfinderEvent; import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; @@ -86,6 +87,28 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD return loadedLeaderboard.getRaceColumnByName(raceColumnName).getRaceLog(loadedDefaultFleet); } + @Test + public void testStoreAndRetrieveSimpleLeaderboardWithRaceLogGateLineOpeningTimeEvent() { + RaceLogGateLineOpeningTimeEvent expectedEvent = RaceLogEventFactory.INSTANCE.createGateLineOpeningTimeEvent(now, 0, 1234l); + + addAndStoreRaceLogEvent(leaderboard, raceColumnName, expectedEvent); + + RaceLog loadedRaceLog = retrieveRaceLog(); + + loadedRaceLog.lockForRead(); + try { + RaceLogEvent loadedEvent = loadedRaceLog.getFirstRawFix(); + RaceLogGateLineOpeningTimeEvent actualEvent = (RaceLogGateLineOpeningTimeEvent) loadedEvent; + assertEquals(expectedEvent.getTimePoint(), actualEvent.getTimePoint()); + assertEquals(expectedEvent.getPassId(), actualEvent.getPassId()); + assertEquals(expectedEvent.getId(), actualEvent.getId()); + assertEquals(expectedEvent.getGateLineOpeningTime(), actualEvent.getGateLineOpeningTime()); + assertEquals(1, Util.size(loadedRaceLog.getFixes())); + } finally { + loadedRaceLog.unlockAfterRead(); + } + } + @Test public void testStoreAndRetrieveSimpleLeaderboardWithRaceLogPathfinderEvent() { RaceLogPathfinderEvent expectedEvent = RaceLogEventFactory.INSTANCE.createPathfinderEvent(now, 0, "GER 20"); diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java index 80155efad25..99426db668b 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java @@ -45,6 +45,7 @@ import com.sap.sailing.domain.racelog.RaceLogEventFactory; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningConfirmedEvent; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningListChangedEvent; import com.sap.sailing.domain.racelog.RaceLogFlagEvent; +import com.sap.sailing.domain.racelog.RaceLogGateLineOpeningTimeEvent; import com.sap.sailing.domain.racelog.RaceLogPassChangeEvent; import com.sap.sailing.domain.racelog.RaceLogPathfinderEvent; import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; @@ -138,6 +139,28 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends RaceLogMongoDBTest loadedRaceLog.unlockAfterRead(); } } + + @Test + public void testStoreAndRetrieveSimpleLeaderboardWithRaceLogGateLineOpeningTimeEvent() { + RaceLogGateLineOpeningTimeEvent expectedEvent = RaceLogEventFactory.INSTANCE.createGateLineOpeningTimeEvent(now, 0, 1234l); + + addAndStoreRaceLogEvent(regatta, raceColumnName, expectedEvent); + + RaceLog loadedRaceLog = retrieveRaceLog(); + + loadedRaceLog.lockForRead(); + try { + RaceLogEvent loadedEvent = loadedRaceLog.getFirstRawFix(); + RaceLogGateLineOpeningTimeEvent actualEvent = (RaceLogGateLineOpeningTimeEvent) loadedEvent; + assertEquals(expectedEvent.getTimePoint(), actualEvent.getTimePoint()); + assertEquals(expectedEvent.getPassId(), actualEvent.getPassId()); + assertEquals(expectedEvent.getId(), actualEvent.getId()); + assertEquals(expectedEvent.getGateLineOpeningTime(), actualEvent.getGateLineOpeningTime()); + assertEquals(1, Util.size(loadedRaceLog.getFixes())); + } finally { + loadedRaceLog.unlockAfterRead(); + } + } @Test public void testStoreAndRetrieveSimpleLeaderboardWithRaceLogPassChangeEvent() { diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerChooserTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerChooserTest.java index c0d2464e972..3ebc43bc481 100644 --- a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerChooserTest.java +++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerChooserTest.java @@ -26,6 +26,7 @@ public class RaceLogEventSerializerChooserTest { private JsonSerializer finishPositioningListChangedEventSerializer; private JsonSerializer finishPositioningConfirmedEventSerializer; private JsonSerializer pathfinderEventSerializer; + private JsonSerializer gateLineOpeningTimeEventSerializer; private RaceLogEventFactory factory; @@ -41,6 +42,7 @@ public class RaceLogEventSerializerChooserTest { finishPositioningListChangedEventSerializer = mock(JsonSerializer.class); finishPositioningConfirmedEventSerializer = mock(JsonSerializer.class); pathfinderEventSerializer = mock(JsonSerializer.class); + gateLineOpeningTimeEventSerializer = mock(JsonSerializer.class); chooser = new RaceLogEventSerializerChooserImpl( flagEventSerializer, @@ -51,7 +53,7 @@ public class RaceLogEventSerializerChooserTest { courseDesignChangedEventSerializer, finishPositioningListChangedEventSerializer, finishPositioningConfirmedEventSerializer, - pathfinderEventSerializer); + pathfinderEventSerializer, gateLineOpeningTimeEventSerializer); factory = RaceLogEventFactory.INSTANCE; } @@ -118,5 +120,12 @@ public class RaceLogEventSerializerChooserTest { RaceLogEvent event = factory.createPathfinderEvent(null, 0, "GER 20"); assertEquals(pathfinderEventSerializer, chooser.getSerializer(event)); } + + @Test + public void testChoosesGateLineOpeningTimeSerializer() { + // we use the real event type here because we do not want to re-implement the dispatching. + RaceLogEvent event = factory.createGateLineOpeningTimeEvent(null, 0, new Long(0)); + assertEquals(gateLineOpeningTimeEventSerializer, chooser.getSerializer(event)); + } } diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogGateLineOpeningTimeEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogGateLineOpeningTimeEventDeserializer.java new file mode 100644 index 00000000000..414dc8a7680 --- /dev/null +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogGateLineOpeningTimeEventDeserializer.java @@ -0,0 +1,29 @@ +package com.sap.sailing.server.gateway.deserialization.racelog.impl; + +import java.io.Serializable; +import java.util.List; + +import org.json.simple.JSONObject; + +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.common.TimePoint; +import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; +import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; +import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogGateLineOpeningTimeEventSerializer; + +public class RaceLogGateLineOpeningTimeEventDeserializer extends BaseRaceLogEventDeserializer implements + JsonDeserializer { + + public RaceLogGateLineOpeningTimeEventDeserializer(JsonDeserializer competitorDeserializer) { + super(competitorDeserializer); + } + + @Override + protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint timePoint, int passId, + List competitors) throws JsonDeserializationException { + Long gateLineOpeningTime = (Long) object.get(RaceLogGateLineOpeningTimeEventSerializer.FIELD_GATE_LINE_OPENING_TIME); + return factory.createGateLineOpeningTimeEvent(timePoint, id, competitors, passId, gateLineOpeningTime); + } + +} diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java index e77d56b90b1..1d1d2064cc9 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java @@ -29,7 +29,8 @@ public class RaceLogEventSerializer implements JsonSerializer { new GateJsonSerializer(new MarkJsonSerializer()))))), new RaceLogFinishPositioningListChangedEventSerializer(competitorSerializer), new RaceLogFinishPositioningConfirmedEventSerializer(competitorSerializer), - new RaceLogPathfinderEventSerializer(competitorSerializer))); + new RaceLogPathfinderEventSerializer(competitorSerializer), + new RaceLogGateLineOpeningTimeEventSerializer(competitorSerializer))); } private RaceLogEventSerializerChooser serializerChooser; 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 e4360a1e8b5..f15207276f6 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 @@ -7,6 +7,7 @@ import com.sap.sailing.domain.racelog.RaceLogEventVisitor; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningConfirmedEvent; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningListChangedEvent; import com.sap.sailing.domain.racelog.RaceLogFlagEvent; +import com.sap.sailing.domain.racelog.RaceLogGateLineOpeningTimeEvent; import com.sap.sailing.domain.racelog.RaceLogPassChangeEvent; import com.sap.sailing.domain.racelog.RaceLogPathfinderEvent; import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; @@ -25,6 +26,7 @@ public class RaceLogEventSerializerChooserImpl implements RaceLogEventSerializer private final JsonSerializer finishPositioningListChangedEventSerializer; private final JsonSerializer finishPositioningConfirmedEventSerializer; private final JsonSerializer pathfinderEventSerializer; + private final JsonSerializer gateLineOpeningTimeEventSerializer; private JsonSerializer chosenSerializer; @@ -37,7 +39,8 @@ public class RaceLogEventSerializerChooserImpl implements RaceLogEventSerializer JsonSerializer courseDesignChangedEventSerializer, JsonSerializer finishPositioningListChangedEventSerializer, JsonSerializer finishPositioningConfirmedEventSerializer, - JsonSerializer pathfinderEventSerializer) { + JsonSerializer pathfinderEventSerializer, + JsonSerializer gateLineOpeningTimeEventSerializer) { this.flagEventSerializer = flagEventSerializer; this.startTimeSerializer = startTimeSerializer; this.raceStatusSerializer = raceStatusSerializer; @@ -47,6 +50,7 @@ public class RaceLogEventSerializerChooserImpl implements RaceLogEventSerializer this.finishPositioningListChangedEventSerializer = finishPositioningListChangedEventSerializer; this.finishPositioningConfirmedEventSerializer = finishPositioningConfirmedEventSerializer; this.pathfinderEventSerializer = pathfinderEventSerializer; + this.gateLineOpeningTimeEventSerializer = gateLineOpeningTimeEventSerializer; this.chosenSerializer = null; } @@ -108,4 +112,9 @@ public class RaceLogEventSerializerChooserImpl implements RaceLogEventSerializer chosenSerializer = pathfinderEventSerializer; } + @Override + public void visit(RaceLogGateLineOpeningTimeEvent event) { + chosenSerializer = gateLineOpeningTimeEventSerializer; + } + } diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogGateLineOpeningTimeEventSerializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogGateLineOpeningTimeEventSerializer.java new file mode 100644 index 00000000000..4e35cd95b7f --- /dev/null +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogGateLineOpeningTimeEventSerializer.java @@ -0,0 +1,35 @@ +package com.sap.sailing.server.gateway.serialization.racelog.impl; + +import org.json.simple.JSONObject; + +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.racelog.RaceLogGateLineOpeningTimeEvent; +import com.sap.sailing.server.gateway.serialization.JsonSerializer; + +public class RaceLogGateLineOpeningTimeEventSerializer extends BaseRaceLogEventSerializer { + + public static final String VALUE_CLASS = RaceLogGateLineOpeningTimeEvent.class.getSimpleName(); + public static final String FIELD_GATE_LINE_OPENING_TIME = "gateLineOpeningTime"; + + public RaceLogGateLineOpeningTimeEventSerializer( + JsonSerializer competitorSerializer) { + super(competitorSerializer); + } + + @Override + protected String getClassFieldValue() { + return VALUE_CLASS; + } + + @Override + public JSONObject serialize(RaceLogEvent object) { + RaceLogGateLineOpeningTimeEvent gateLineOpeningTimeEvent = (RaceLogGateLineOpeningTimeEvent) object; + + JSONObject result = super.serialize(gateLineOpeningTimeEvent); + result.put(FIELD_GATE_LINE_OPENING_TIME, gateLineOpeningTimeEvent.getGateLineOpeningTime()); + + return result; + } + +} 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 524fa4735cf..7ed56f035b6 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 @@ -6,6 +6,7 @@ import com.sap.sailing.domain.racelog.RaceLogEventVisitor; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningConfirmedEvent; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningListChangedEvent; import com.sap.sailing.domain.racelog.RaceLogFlagEvent; +import com.sap.sailing.domain.racelog.RaceLogGateLineOpeningTimeEvent; import com.sap.sailing.domain.racelog.RaceLogPassChangeEvent; import com.sap.sailing.domain.racelog.RaceLogPathfinderEvent; import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; @@ -59,4 +60,9 @@ public class RaceLogChangedVisitor implements RaceLogEventVisitor { listener.eventAdded(event); } + @Override + public void visit(RaceLogGateLineOpeningTimeEvent event) { + listener.eventAdded(event); + } + } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/GateStartProcedure.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/GateStartProcedure.java index 88e8c0f6429..0a37d38efe9 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/GateStartProcedure.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/GateStartProcedure.java @@ -25,7 +25,7 @@ import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.startphase.GateSt public class GateStartProcedure implements StartProcedure { private final static long startPhaseClassOverGolfUpIntervall = 8 * 60 * 1000; // minutes * seconds * milliseconds - private final static long startPhasePapaUpInterval = 5 * 60 * 1000; // minutes * seconds * milliseconds + private final static long startPhasePapaUpInterval = 4 * 60 * 1000; // minutes * seconds * milliseconds private final static long startPhasePapaDownInterval = 1 * 60 * 1000; // minutes * seconds * milliseconds private final static long startPhaseClassOverGolfDownInterval = 0 * 60 * 1000; // minutes * seconds * milliseconds diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/RaceState.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/RaceState.java index 656679a29e3..ef1169437a1 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/RaceState.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/RaceState.java @@ -119,9 +119,27 @@ public interface RaceState extends StartProcedureRaceStateChangedListener { * @return the timepoint at which the individual recall was displayed or null when the individual recall is already removed */ TimePoint getIndividualRecallDisplayedTime(); - + + /** + * @return the current pathfinder boat if it is a gate start race + */ String getPathfinder(); + /** + * Set the current pathfinder boat if it is a gate start race + * @param sailingId + */ void setPathfinder(String sailingId); + + /** + * @return the current pathfinder boat if it is a gate start race + */ + Long getGateLineOpeningTime(); + + /** + * Set the current pathfinder boat if it is a gate start race + * @param sailingId + */ + void setGateLineOpeningTime(Long gateLineOpeningTimeInMillis); } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/RaceStateChangedListener.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/RaceStateChangedListener.java index 067b4a087ac..5946dc27cc2 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/RaceStateChangedListener.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/RaceStateChangedListener.java @@ -16,4 +16,7 @@ public interface RaceStateChangedListener { void onAutomaticRaceEnd(TimePoint automaticRaceEnd); void onPathfinderSelected(); + + void onGateLineOpeningTimeChanged(); + } \ No newline at end of file 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 5d644119d1e..3b7c8c22009 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 @@ -21,6 +21,7 @@ import com.sap.sailing.domain.racelog.RaceLogEventFactory; import com.sap.sailing.domain.racelog.analyzing.impl.FinishPositioningListFinder; import com.sap.sailing.domain.racelog.analyzing.impl.FinishedTimeFinder; import com.sap.sailing.domain.racelog.analyzing.impl.FinishingTimeFinder; +import com.sap.sailing.domain.racelog.analyzing.impl.GateLineOpeningTimeFinder; import com.sap.sailing.domain.racelog.analyzing.impl.IndividualRecallFinder; import com.sap.sailing.domain.racelog.analyzing.impl.LastPublishedCourseDesignFinder; import com.sap.sailing.domain.racelog.analyzing.impl.PathfinderFinder; @@ -50,6 +51,7 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener { private FinishPositioningListFinder finishPositioningListFinder; private IndividualRecallFinder individualRecallFinder; private PathfinderFinder pathfinderFinder; + private GateLineOpeningTimeFinder gateLineOpeningTimeFinder; public RaceStateImpl(PassAwareRaceLog raceLog, StartProcedure procedure) { this.raceLog = raceLog; @@ -70,6 +72,7 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener { this.finishPositioningListFinder = new FinishPositioningListFinder(raceLog); this.individualRecallFinder = new IndividualRecallFinder(raceLog); this.pathfinderFinder = new PathfinderFinder(raceLog); + this.gateLineOpeningTimeFinder = new GateLineOpeningTimeFinder(raceLog); updateStatus(); } @@ -294,4 +297,27 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener { } } + @Override + public Long getGateLineOpeningTime() { + return gateLineOpeningTimeFinder.getGateLineOpeningTime(); + } + + @Override + public void setGateLineOpeningTime(Long gateLineOpeningTimeInMillis) { + TimePoint eventTime = MillisecondsTimePoint.now(); + + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createGateLineOpeningTimeEvent(eventTime, raceLog.getCurrentPassId(), + gateLineOpeningTimeInMillis); + + this.raceLog.add(event); + + notifyListenersAboutGateLineOpeningTimeChange(); + } + + private void notifyListenersAboutGateLineOpeningTimeChange() { + for (RaceStateChangedListener listener : stateChangedListeners) { + listener.onGateLineOpeningTimeChanged(); + } + } + } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/RaceStateListener.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/RaceStateListener.java index ca3388f33be..1aa65b304d5 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/RaceStateListener.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/RaceStateListener.java @@ -49,6 +49,10 @@ public class RaceStateListener implements RaceStateChangedListener { @Override public void onPathfinderSelected() { // do nothing - + } + + @Override + public void onGateLineOpeningTimeChanged() { + // do nothing } } \ No newline at end of file diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceInfoFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceInfoFragment.java index bc24773cb41..ab939d8051f 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceInfoFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceInfoFragment.java @@ -24,6 +24,7 @@ import com.sap.sailing.racecommittee.app.domain.state.RaceStateChangedListener; import com.sap.sailing.racecommittee.app.logging.ExLog; import com.sap.sailing.racecommittee.app.ui.fragments.chooser.RaceInfoFragmentChooser; import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.CourseDesignDialogFragment; +import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.GateLineOpeningTimeChangeUiListener; import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.IndividualRecallUiListener; import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.PathfinderSelectedUiListener; import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.RaceDialogFragment; @@ -253,4 +254,11 @@ public class RaceInfoFragment extends RaceFragment implements RaceStateChangedLi } } + @Override + public void onGateLineOpeningTimeChanged() { + if (infoFragment instanceof GateLineOpeningTimeChangeUiListener) { + ((GateLineOpeningTimeChangeUiListener) infoFragment).updateGateLineOpeningTimeLabel(); + } + } + } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/GateLineOpeningTimeChangeUiListener.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/GateLineOpeningTimeChangeUiListener.java new file mode 100644 index 00000000000..fdeaabcb0af --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/GateLineOpeningTimeChangeUiListener.java @@ -0,0 +1,7 @@ +package com.sap.sailing.racecommittee.app.ui.fragments.dialogs; + +public interface GateLineOpeningTimeChangeUiListener { + + public void updateGateLineOpeningTimeLabel(); + +} diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/RaceChooseLineOpeningTimeDialog.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/RaceChooseLineOpeningTimeDialog.java index 6cf894dec1d..bf7a91b1b62 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/RaceChooseLineOpeningTimeDialog.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/RaceChooseLineOpeningTimeDialog.java @@ -13,62 +13,58 @@ import android.widget.Button; import android.widget.EditText; public class RaceChooseLineOpeningTimeDialog extends RaceDialogFragment { - - public interface GateLineOpeningTimeSelectionListener { - public void onLineOpeningTimeSelected(); - } - private GateLineOpeningTimeSelectionListener selectionListener; - - private EditText lineOpeningTimeEditText; - private Button chooseButton; - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - selectionListener = (GateLineOpeningTimeSelectionListener) activity; - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - return inflater.inflate(R.layout.race_choose_line_opening_time_view, container); - } - - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - - getDialog().setTitle(getString(R.string.set_gate_line_opening_time_title)); - - lineOpeningTimeEditText = (EditText) getView().findViewById(R.id.lineOpeningTimeText); - chooseButton = (Button) getDialog().findViewById(R.id.chooseLineOpeningTimeButton); - - chooseButton.setOnClickListener(new OnClickListener() { - public void onClick(View v) { - onChooseClicked(v); - } - }); - } - - protected void onChooseClicked(View view) { - int lineOpeningTime = convertToInteger(lineOpeningTimeEditText.getText().toString()); - //this.getRace().changeGateLineOpeningTime(lineOpeningTime); - selectionListener.onLineOpeningTimeSelected(); - Log.i("RACE_SET_GATELINE_OPENING_TIME", String.valueOf(lineOpeningTime)); - dismiss(); - } - - protected Integer convertToInteger(String text) { - try { - return Integer.parseInt(text); - } catch (NumberFormatException ex) { - throw new IllegalStateException("An NumberFormatException occured"); - } - } + public interface GateLineOpeningTimeSelectionListener { + public void onLineOpeningTimeSelected(); + } + + private EditText lineOpeningTimeEditText; + private Button chooseButton; + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + return inflater.inflate(R.layout.race_choose_line_opening_time_view, container); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + getDialog().setTitle(getString(R.string.set_gate_line_opening_time_title)); + + lineOpeningTimeEditText = (EditText) getView().findViewById(R.id.lineOpeningTimeText); + chooseButton = (Button) getDialog().findViewById(R.id.chooseLineOpeningTimeButton); + + chooseButton.setOnClickListener(new OnClickListener() { + public void onClick(View v) { + onChooseClicked(v); + } + }); + } + + protected void onChooseClicked(View view) { + int lineOpeningTime = convertToInteger(lineOpeningTimeEditText.getText().toString()); + this.getRace().getState().setGateLineOpeningTime(Long.valueOf(60 * 1000 * lineOpeningTime)); + Log.i("RACE_SET_GATELINE_OPENING_TIME", String.valueOf(lineOpeningTime)); + dismiss(); + } + + protected Integer convertToInteger(String text) { + try { + return Integer.parseInt(text); + } catch (NumberFormatException ex) { + throw new IllegalStateException("An NumberFormatException occured"); + } + } @Override public void notifyTick() { // TODO Auto-generated method stub - + } } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/RaceChoosePathFinderDialog.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/RaceChoosePathFinderDialog.java index 42a08efa685..ba5f936388f 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/RaceChoosePathFinderDialog.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/RaceChoosePathFinderDialog.java @@ -5,11 +5,9 @@ import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; -import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; -import android.view.View.OnKeyListener; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/lists/ManagedRaceListFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/lists/ManagedRaceListFragment.java index a153956f871..225ba799c63 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/lists/ManagedRaceListFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/lists/ManagedRaceListFragment.java @@ -250,6 +250,11 @@ public class ManagedRaceListFragment extends ListFragment implements JuryFlagCli notifyDataChanged(); } + @Override + public void onGateLineOpeningTimeChanged() { + notifyDataChanged(); + } + /* * * public void notifyDataChanged() { List list = adapter.getItems(); for (int i = 0; i < diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/startphase/GateStartPhaseFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/startphase/GateStartPhaseFragment.java index facd2beabef..ea020c5ffaa 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/startphase/GateStartPhaseFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/startphase/GateStartPhaseFragment.java @@ -25,6 +25,7 @@ import com.sap.sailing.racecommittee.app.domain.startprocedure.impl.GateStartPha import com.sap.sailing.racecommittee.app.logging.ExLog; import com.sap.sailing.racecommittee.app.ui.fragments.RaceFragment; import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.AbortModeSelectionDialog; +import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.GateLineOpeningTimeChangeUiListener; import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.PathfinderSelectedUiListener; import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.RaceChooseLineOpeningTimeDialog; import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.RaceChoosePathFinderDialog; @@ -32,7 +33,7 @@ import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.RaceDialogFragment import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.RaceInfoListener; import com.sap.sailing.racecommittee.app.utils.TimeUtils; -public class GateStartPhaseFragment extends RaceFragment implements GateStartPhaseEventListener, PathfinderSelectedUiListener { +public class GateStartPhaseFragment extends RaceFragment implements GateStartPhaseEventListener, PathfinderSelectedUiListener, GateLineOpeningTimeChangeUiListener { private RaceInfoListener infoListener; @@ -99,7 +100,9 @@ public class GateStartPhaseFragment extends RaceFragment implements GateStartPha pathfinderLabel.setText(getRace().getState().getPathfinder()); } lineOpeningTimeLabel = (TextView) getView().findViewById(R.id.lineOpeningTimeLabel); - + if(getRace().getState().getGateLineOpeningTime()!=null){ + lineOpeningTimeLabel.setText(getRace().getState().getGateLineOpeningTime().toString()); + } pathFinderButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { @@ -261,8 +264,15 @@ public class GateStartPhaseFragment extends RaceFragment implements GateStartPha @Override public void updatePathfinderLabel() { - if(getRace().getState().getPathfinder()!=null){ + if (getRace().getState().getPathfinder() != null) { pathfinderLabel.setText(getRace().getState().getPathfinder()); } } + + @Override + public void updateGateLineOpeningTimeLabel() { + if (getRace().getState().getGateLineOpeningTime() != null) { + lineOpeningTimeLabel.setText(getRace().getState().getGateLineOpeningTime().toString()); + } + } }