diff --git a/configuration/buildAndUpdateProduct.sh b/configuration/buildAndUpdateProduct.sh index 2153c4602ad..7a4afb734d5 100755 --- a/configuration/buildAndUpdateProduct.sh +++ b/configuration/buildAndUpdateProduct.sh @@ -49,8 +49,8 @@ ARCH=x86_64 START_DIR=`pwd` # needed for maven on sapsailing.com to work correctly -if [ -f $USER_HOME/.bash_profile ]; then - source $USER_HOME/.bash_profile +if [ -f "$USER_HOME/.bash_profile" ]; then + source "$USER_HOME/.bash_profile" fi cd "$PROJECT_HOME" @@ -85,9 +85,10 @@ reporting=0 suppress_confirmation=0 extra='' parallelexecution=0 +p2local=0 if [ $# -eq 0 ]; then - echo "buildAndUpdateProduct [-b -u -g -t -a -o -c -m -n -l ] [build|install|all|hot-deploy|remote-deploy|local-deploy|release]" + echo "buildAndUpdateProduct [-b -u -g -t -a -r -o -c -p -v -m -n -l ] [build|install|all|hot-deploy|remote-deploy|local-deploy|release]" echo "" echo "-g Disable GWT compile, no gwt files will be generated, old ones will be preserved." echo "-b Build GWT permutation only for one browser and English language." @@ -105,6 +106,7 @@ if [ $# -eq 0 ]; then echo "-s Name of server you want to use as target for install, hot-deploy or remote-reploy. This overrides default behaviour." echo "-w Target for remote-deploy and release. Must comply with the following format: user@server." echo "-u Run without confirmation messages. Use with extreme care." + echo "-v Build local p2 respository, and use this instead of p2.sapsailing.com" echo "" echo "build: builds the server code using Maven to $PROJECT_HOME (log to $START_DIR/build.log)" echo "" @@ -141,7 +143,7 @@ echo SERVERS_HOME is $SERVERS_HOME echo BRANCH is $active_branch echo VERSION is $VERSION_INFO -options=':bgtocparm:n:l:s:w:u' +options=':bgtocparvm:n:l:s:w:u' while getopts $options option do case $option in @@ -160,6 +162,7 @@ do HAS_OVERWRITTEN_TARGET=1;; w) REMOTE_SERVER_LOGIN=$OPTARG;; u) suppress_confirmation=1;; + v) p2local=1;; \?) echo "Invalid option" exit 4;; esac @@ -508,6 +511,18 @@ echo "Starting $@ of server..." if [[ "$@" == "build" ]] || [[ "$@" == "all" ]]; then # yield build so that we get updated product + if [ $offline -eq 1 ]; then + echo "INFO: Activating offline mode" + extra="$extra -o" + fi + + if [ $proxy -eq 1 ]; then + echo "INFO: Activating proxy profile" + extra="$extra -P no-debug.with-proxy" + MAVEN_SETTINGS=$MAVEN_SETTINGS_PROXY + else + extra="$extra -P no-debug.without-proxy" + fi cd $PROJECT_HOME/java if [ $gwtcompile -eq 1 ]; then @@ -533,9 +548,25 @@ if [[ "$@" == "build" ]] || [[ "$@" == "all" ]]; then else echo "INFO: GWT Compilation disabled" - extra="-Pdebug.no-gwt-compile" + extra="$extra -Pdebug.no-gwt-compile" fi + if [ $p2local -eq 1 ]; then + echo "INFO: Building and using local p2 repo" + #build local p2 repo + echo "Using following command (pwd: java/com.sap.sailing.targetplatform.base): mvn -fae -s $MAVEN_SETTINGS $clean compile" + echo "Maven version used: `mvn --version`" + (cd com.sap.$PROJECT_TYPE.targetplatform.base; mvn -fae -s $MAVEN_SETTINGS $clean compile 2>&1 | tee $START_DIR/build.log) + # now get the exit status from mvn, and not that of tee which is what $? contains now + MVN_EXIT_CODE=${PIPESTATUS[0]} + echo "Maven exit code is $MVN_EXIT_CODE" + #create local target definition + (cd com.sap.$PROJECT_TYPE.targetplatform/scripts; ./createLocalTargetDef.sh) + extra="$extra -Dp2-local" # activates the p2-target.local profile in java/pom.xml + else + echo "INFO: Using remote p2 repo (http://p2.sapsailing.com/p2/sailing/)" + fi + # back to root! cd $PROJECT_HOME @@ -547,19 +578,6 @@ if [[ "$@" == "build" ]] || [[ "$@" == "all" ]]; then # TODO: Think about http://maven.apache.org/surefire/maven-surefire-plugin/examples/fork-options-and-parallel-execution.html fi - if [ $offline -eq 1 ]; then - echo "INFO: Activating offline mode" - extra="$extra -o" - fi - - if [ $proxy -eq 1 ]; then - echo "INFO: Activating proxy profile" - extra="$extra -P no-debug.with-proxy" - MAVEN_SETTINGS=$MAVEN_SETTINGS_PROXY - else - extra="$extra -P no-debug.without-proxy" - fi - if [ $android -eq 0 ] && [ $gwtcompile -eq 0 ] && [ $testing -eq 0 ]; then parallelexecution=1 echo "INFO: Running build in parallel with 2.5*CPU threads" diff --git a/doc/DEVELOPMENT b/doc/DEVELOPMENT index 08c85e25434..30f9d762779 100644 --- a/doc/DEVELOPMENT +++ b/doc/DEVELOPMENT @@ -27,11 +27,12 @@ of java classes (from a set of jars/libs) your compiler can use to build the sources. We have defined some target-platforms for the project which can be found inside the project "com.sap.sailing.targetplatform" in the folder 'definitions'. There -you will find 3 definitions: race-analysis-p2-ide-local, -race-analysis-p2-maven-local and race-analysis-p2-maven-central. The -definition 'race-analysis-p2-ide-local' is intended to be used for the -IDE whereas the other definitions are used for the local and central -maven builds. The target definition contains a list of URLs to +you will find 1 definition: race-analysis-p2-remote. This is the default +to use in your IDE and the maven build. When testing changes to the +target platform, generate the race-analysis-p2-lcoal target definition +with the java/com.sap.sailing.targetplatform/scripts/createLocalTargetDef.sh +script. +The target definition contains a list of URLs to different p2 repositories containing the actual bundles. The URLs can be either URLs to local or remote repositories depending on your access to those repositories. Normally you should bind your target diff --git a/java/com.sap.sailing.domain.common/META-INF/MANIFEST.MF b/java/com.sap.sailing.domain.common/META-INF/MANIFEST.MF index 7f31bc8dc09..97baf73d088 100755 --- a/java/com.sap.sailing.domain.common/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.domain.common/META-INF/MANIFEST.MF @@ -20,6 +20,7 @@ Export-Package: com.sap.sailing.domain.common, com.sap.sailing.domain.common.racelog.utils, com.sap.sailing.domain.common.scalablevalue, com.sap.sailing.domain.common.scalablevalue.impl, - com.sap.sailing.domain.common.trackfiles + com.sap.sailing.domain.common.trackfiles, + com.sap.sailing.domain.common.abstractlog Require-Bundle: com.sap.sse.datamining.shared, com.sap.sse.common diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/tracking/NotRevokableException.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/abstractlog/NotRevokableException.java similarity index 82% rename from java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/tracking/NotRevokableException.java rename to java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/abstractlog/NotRevokableException.java index f30eda4a13b..74586ba7cda 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/tracking/NotRevokableException.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/abstractlog/NotRevokableException.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.common.racelog.tracking; +package com.sap.sailing.domain.common.abstractlog; public class NotRevokableException extends Exception { private static final long serialVersionUID = 6825451915706047105L; diff --git a/java/com.sap.sailing.domain.igtimiadapter/src/com/sap/sailing/domain/igtimiadapter/impl/UserImpl.java b/java/com.sap.sailing.domain.igtimiadapter/src/com/sap/sailing/domain/igtimiadapter/impl/UserImpl.java index 4770ef7d8c6..fb2ab3879ce 100755 --- a/java/com.sap.sailing.domain.igtimiadapter/src/com/sap/sailing/domain/igtimiadapter/impl/UserImpl.java +++ b/java/com.sap.sailing.domain.igtimiadapter/src/com/sap/sailing/domain/igtimiadapter/impl/UserImpl.java @@ -8,7 +8,6 @@ public class UserImpl implements User { private final String surname; private final String email; - public UserImpl(long id, String firstName, String surname, String email, boolean blob) { super(); this.id = id; diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/DomainObjectFactory.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/DomainObjectFactory.java index da4f0b64fee..ce2d7454679 100755 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/DomainObjectFactory.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/DomainObjectFactory.java @@ -7,6 +7,7 @@ import java.util.Map.Entry; import java.util.Set; import com.mongodb.DBObject; +import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.DomainFactory; import com.sap.sailing.domain.base.Event; @@ -23,7 +24,6 @@ import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.LeaderboardGroup; import com.sap.sailing.domain.leaderboard.LeaderboardGroupResolver; import com.sap.sailing.domain.leaderboard.LeaderboardRegistry; -import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; import com.sap.sailing.domain.tracking.WindTrack; diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/MongoRaceLogStoreFactory.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/MongoRaceLogStoreFactory.java index 7f791550902..09e63bf7710 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/MongoRaceLogStoreFactory.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/MongoRaceLogStoreFactory.java @@ -1,8 +1,8 @@ package com.sap.sailing.domain.persistence; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; import com.sap.sailing.domain.persistence.impl.MongoRaceLogStoreFactoryImpl; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.racelog.RaceLogStore; 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 f4b9e636b93..ca26c350e33 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 @@ -29,6 +29,39 @@ import com.mongodb.DBCursor; import com.mongodb.DBObject; import com.mongodb.MongoException; import com.mongodb.util.JSON; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.RevokeEvent; +import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; +import com.sap.sailing.domain.abstractlog.race.CompetitorResults; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogCourseAreaChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventRestoreFactory; +import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningListChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogGateLineOpeningTimeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogPassChangeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogPathfinderEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogProtestStartTimeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogRaceStatusEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogStartProcedureChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; +import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultsImpl; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogImpl; +import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationType; +import com.sap.sailing.domain.abstractlog.race.scoring.impl.AdditionalScoringInformationEventImpl; +import com.sap.sailing.domain.abstractlog.race.tracking.CloseOpenEndedDeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DefineMarkEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DenoteForTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceCompetitorMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMarkMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.RegisterCompetitorEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.StartTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.impl.PlaceHolderDeviceIdentifierSerializationHandler; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.ControlPoint; @@ -110,41 +143,8 @@ import com.sap.sailing.domain.persistence.DomainObjectFactory; import com.sap.sailing.domain.persistence.MongoRaceLogStoreFactory; import com.sap.sailing.domain.persistence.racelog.tracking.DeviceIdentifierMongoHandler; import com.sap.sailing.domain.persistence.racelog.tracking.impl.PlaceHolderDeviceIdentifierMongoHandler; -import com.sap.sailing.domain.racelog.CompetitorResults; -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.RaceLogEventAuthor; -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; -import com.sap.sailing.domain.racelog.RaceLogProtestStartTimeEvent; -import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; -import com.sap.sailing.domain.racelog.RaceLogStartProcedureChangedEvent; -import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; import com.sap.sailing.domain.racelog.RaceLogStore; -import com.sap.sailing.domain.racelog.RaceLogWindFixEvent; -import com.sap.sailing.domain.racelog.RevokeEvent; -import com.sap.sailing.domain.racelog.impl.CompetitorResultsImpl; -import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl; -import com.sap.sailing.domain.racelog.impl.RaceLogImpl; -import com.sap.sailing.domain.racelog.scoring.AdditionalScoringInformationType; -import com.sap.sailing.domain.racelog.scoring.impl.AdditionalScoringInformationEventImpl; -import com.sap.sailing.domain.racelog.tracking.CloseOpenEndedDeviceMappingEvent; -import com.sap.sailing.domain.racelog.tracking.DefineMarkEvent; -import com.sap.sailing.domain.racelog.tracking.DenoteForTrackingEvent; -import com.sap.sailing.domain.racelog.tracking.DeviceCompetitorMappingEvent; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; -import com.sap.sailing.domain.racelog.tracking.DeviceMarkMappingEvent; -import com.sap.sailing.domain.racelog.tracking.RegisterCompetitorEvent; -import com.sap.sailing.domain.racelog.tracking.StartTrackingEvent; -import com.sap.sailing.domain.racelog.tracking.impl.PlaceHolderDeviceIdentifierSerializationHandler; import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; import com.sap.sailing.domain.tracking.Wind; import com.sap.sailing.domain.tracking.WindTrack; @@ -1075,6 +1075,8 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { if (dbRegatta != null) { String name = (String) dbRegatta.get(FieldNames.REGATTA_NAME.name()); String boatClassName = (String) dbRegatta.get(FieldNames.BOAT_CLASS_NAME.name()); + TimePoint startDate = loadTimePoint(dbRegatta, FieldNames.REGATTA_START_DATE); + TimePoint endDate = loadTimePoint(dbRegatta, FieldNames.REGATTA_END_DATE); Serializable id = (Serializable) dbRegatta.get(FieldNames.REGATTA_ID.name()); if (id == null) { id = name; @@ -1105,7 +1107,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { } } Boolean useStartTimeInference = (Boolean) dbRegatta.get(FieldNames.REGATTA_USE_START_TIME_INFERENCE.name()); - result = new RegattaImpl(raceLogStore, name, boatClass, series, /* persistent */true, + result = new RegattaImpl(raceLogStore, name, boatClass, startDate, endDate, series, /* persistent */true, loadScoringScheme(dbRegatta), id, courseArea, useStartTimeInference == null ? true : useStartTimeInference); result.setRegattaConfiguration(configuration); @@ -1292,13 +1294,13 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { Integer passId = (Integer) dbObject.get(FieldNames.RACE_LOG_EVENT_PASS_ID.name()); BasicDBList dbCompetitors = (BasicDBList) dbObject.get(FieldNames.RACE_LOG_EVENT_INVOLVED_BOATS.name()); List competitors = loadCompetitorsForRaceLogEvent(dbCompetitors); - final RaceLogEventAuthor author; + final AbstractLogEventAuthor author; String authorName = (String) dbObject.get(FieldNames.RACE_LOG_EVENT_AUTHOR_NAME.name()); Number authorPriority = (Number) dbObject.get(FieldNames.RACE_LOG_EVENT_AUTHOR_PRIORITY.name()); if (authorName != null && authorPriority != null) { - author = new RaceLogEventAuthorImpl(authorName, authorPriority.intValue()); + author = new LogEventAuthorImpl(authorName, authorPriority.intValue()); } else { - author = RaceLogEventAuthorImpl.createCompatibilityAuthor(); + author = LogEventAuthorImpl.createCompatibilityAuthor(); } String eventClass = (String) dbObject.get(FieldNames.RACE_LOG_EVENT_CLASS.name()); @@ -1351,13 +1353,13 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { throw new IllegalStateException(String.format("Unknown RaceLogEvent type %s", eventClass)); } - private RaceLogEvent loadRaceLogRaceLogWindFixEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + private RaceLogEvent loadRaceLogRaceLogWindFixEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { Wind wind = loadWind((DBObject) dbObject.get(FieldNames.WIND.name())); return raceLogEventFactory.createWindFixEvent(createdAt, author, logicalTimePoint, id, competitors, passId, wind); } - private RaceLogEvent loadRaceLogDeviceCompetitorMappingEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + private RaceLogEvent loadRaceLogDeviceCompetitorMappingEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { DeviceIdentifier device = null; try { @@ -1374,7 +1376,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { return raceLogEventFactory.createDeviceCompetitorMappingEvent(createdAt, author, logicalTimePoint, id, device, mappedTo, passId, from, to); } - private RaceLogEvent loadRaceLogDeviceMarkMappingEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + private RaceLogEvent loadRaceLogDeviceMarkMappingEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { DeviceIdentifier device = null; try { @@ -1391,7 +1393,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { return raceLogEventFactory.createDeviceMarkMappingEvent(createdAt, author, logicalTimePoint, id, device, mappedTo, passId, from, to); } - private RaceLogEvent loadRaceLogDenoteForTrackingEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + private RaceLogEvent loadRaceLogDenoteForTrackingEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { String raceName = (String) dbObject.get(FieldNames.RACE_NAME.name()); BoatClass boatClass = baseDomainFactory.getOrCreateBoatClass((String) dbObject.get(FieldNames.BOAT_CLASS_NAME.name())); @@ -1399,12 +1401,12 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { return raceLogEventFactory.createDenoteForTrackingEvent(createdAt, author, logicalTimePoint, id, passId, raceName, boatClass, raceId); } - private RaceLogEvent loadRaceLogStartEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + private RaceLogEvent loadRaceLogStartEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { return raceLogEventFactory.createStartTrackingEvent(createdAt, author, logicalTimePoint, id, passId); } - private RaceLogEvent loadRaceLogRevokeEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + private RaceLogEvent loadRaceLogRevokeEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { Serializable revokedEventId = Helpers.tryUuidConversion( (Serializable) dbObject.get(FieldNames.RACE_LOG_REVOKED_EVENT_ID.name())); @@ -1415,19 +1417,19 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { revokedEventId, revokedEventType, revokedEventShortInfo, reason); } - private RaceLogEvent loadRaceLogRegisterCompetitorEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + private RaceLogEvent loadRaceLogRegisterCompetitorEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { assert competitors.size() == 1 : "Should have exactly one competitor for RegisterCompetitorEvent"; return raceLogEventFactory.createRegisterCompetitorEvent(createdAt, author, logicalTimePoint, id, passId, competitors.get(0)); } - private RaceLogEvent loadRaceLogDefineMarkEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + private RaceLogEvent loadRaceLogDefineMarkEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { Mark mark = loadMark((DBObject) dbObject.get(FieldNames.RACE_LOG_MARK.name())); return raceLogEventFactory.createDefineMarkEvent(createdAt, author, logicalTimePoint, id, passId, mark); } - private RaceLogEvent loadRaceLogCloseOpenEndedDeviceMappingEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + private RaceLogEvent loadRaceLogCloseOpenEndedDeviceMappingEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { Serializable deviceMappingEventId = Helpers.tryUuidConversion((Serializable) dbObject.get(FieldNames.RACE_LOG_DEVICE_MAPPING_EVENT_ID.name())); TimePoint closingTimePoint = loadTimePoint(dbObject, FieldNames.RACE_LOG_CLOSING_TIMEPOINT); @@ -1435,7 +1437,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { deviceMappingEventId, closingTimePoint); } - private RaceLogEvent loadRaceLogAdditionalScoringInformationEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + private RaceLogEvent loadRaceLogAdditionalScoringInformationEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { Object additionalScoringInformationTypeInfo = dbObject.get(FieldNames.RACE_LOG_ADDITIONAL_SCORING_INFORMATION_TYPE.name()); AdditionalScoringInformationType informationType = AdditionalScoringInformationType.UNKNOWN; @@ -1447,19 +1449,19 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { return raceLogEventFactory.createAdditionalScoringInformationEvent(createdAt, author, logicalTimePoint, id, competitors, passId, informationType); } - private RaceLogEvent loadRaceLogRaceLogProtestStartTimeEvent(TimePoint createdAt, RaceLogEventAuthor author, + private RaceLogEvent loadRaceLogRaceLogProtestStartTimeEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { TimePoint protestStartTime = loadTimePoint(dbObject, FieldNames.RACE_LOG_PROTEST_START_TIME); return raceLogEventFactory.createProtestStartTimeEvent(createdAt, author, logicalTimePoint, id, competitors, passId, protestStartTime); } - private RaceLogEvent loadRaceLogStartProcedureChangedEvent(TimePoint createdAt, RaceLogEventAuthor author, + private RaceLogEvent loadRaceLogStartProcedureChangedEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { RacingProcedureType type = RacingProcedureType.valueOf(dbObject.get(FieldNames.RACE_LOG_START_PROCEDURE_TYPE.name()).toString()); return raceLogEventFactory.createStartProcedureChangedEvent(createdAt, author, logicalTimePoint, id, competitors, passId, type); } - private RaceLogEvent loadRaceLogGateLineOpeningTimeEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + private RaceLogEvent loadRaceLogGateLineOpeningTimeEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { Number gateLaunchStopTime = (Number) dbObject.get(FieldNames.RACE_LOG_GATE_LINE_OPENING_TIME.name()); Number golfDownTime = 0; @@ -1470,13 +1472,13 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { passId, gateLaunchStopTime == null ? null : gateLaunchStopTime.longValue(), golfDownTime.longValue()); } - private RaceLogEvent loadRaceLogPathfinderEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + private RaceLogEvent loadRaceLogPathfinderEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { String pathfinderId = dbObject.get(FieldNames.RACE_LOG_PATHFINDER_ID.name()).toString(); return raceLogEventFactory.createPathfinderEvent(createdAt, author, logicalTimePoint, id, competitors, passId, pathfinderId); } - private RaceLogEvent loadRaceLogFinishPositioningConfirmedEvent(TimePoint createdAt, RaceLogEventAuthor author, + private RaceLogEvent loadRaceLogFinishPositioningConfirmedEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { BasicDBList dbPositionedCompetitorList = (BasicDBList) dbObject.get(FieldNames.RACE_LOG_POSITIONED_COMPETITORS.name()); CompetitorResults positionedCompetitors = null; @@ -1489,7 +1491,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { return raceLogEventFactory.createFinishPositioningConfirmedEvent(createdAt, author, logicalTimePoint, id, competitors, passId, positionedCompetitors); } - private RaceLogEvent loadRaceLogFinishPositioningListChangedEvent(TimePoint createdAt, RaceLogEventAuthor author, + private RaceLogEvent loadRaceLogFinishPositioningListChangedEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { BasicDBList dbPositionedCompetitorList = (BasicDBList) dbObject.get(FieldNames.RACE_LOG_POSITIONED_COMPETITORS.name()); CompetitorResults positionedCompetitors = loadPositionedCompetitors(dbPositionedCompetitorList); @@ -1497,18 +1499,18 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { return raceLogEventFactory.createFinishPositioningListChangedEvent(createdAt, author, logicalTimePoint, id, competitors, passId, positionedCompetitors); } - private RaceLogEvent loadRaceLogPassChangeEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + private RaceLogEvent loadRaceLogPassChangeEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors) { return raceLogEventFactory.createPassChangeEvent(createdAt, author, logicalTimePoint, id, competitors, passId); } - private RaceLogCourseDesignChangedEvent loadRaceLogCourseDesignChangedEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { + private RaceLogCourseDesignChangedEvent loadRaceLogCourseDesignChangedEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { String courseName = (String) dbObject.get(FieldNames.RACE_LOG_COURSE_DESIGN_NAME.name()); CourseBase courseData = loadCourseData((BasicDBList) dbObject.get(FieldNames.RACE_LOG_COURSE_DESIGN.name()), courseName); return raceLogEventFactory.createCourseDesignChangedEvent(createdAt, author, logicalTimePoint, id, competitors, passId, courseData); } - private RaceLogCourseAreaChangedEvent loadRaceLogCourseAreaChangedEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { + private RaceLogCourseAreaChangedEvent loadRaceLogCourseAreaChangedEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { Serializable courseAreaId = (Serializable) dbObject.get(FieldNames.COURSE_AREA_ID.name()); return raceLogEventFactory.createCourseAreaChangedEvent(createdAt, author, logicalTimePoint, id, competitors, passId, courseAreaId); } @@ -1549,7 +1551,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { return competitors; } - private RaceLogFlagEvent loadRaceLogFlagEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { + private RaceLogFlagEvent loadRaceLogFlagEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { Flags upperFlag = Flags.valueOf((String) dbObject.get(FieldNames.RACE_LOG_EVENT_FLAG_UPPER.name())); Flags lowerFlag = Flags.valueOf((String) dbObject.get(FieldNames.RACE_LOG_EVENT_FLAG_LOWER.name())); Boolean displayed = Boolean.valueOf((String) dbObject.get(FieldNames.RACE_LOG_EVENT_FLAG_DISPLAYED.name())); @@ -1561,12 +1563,12 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { return raceLogEventFactory.createFlagEvent(createdAt, author, logicalTimePoint, id, competitors, passId, upperFlag, lowerFlag, displayed); } - private RaceLogStartTimeEvent loadRaceLogStartTimeEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { + private RaceLogStartTimeEvent loadRaceLogStartTimeEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { TimePoint startTime = loadTimePoint(dbObject, FieldNames.RACE_LOG_EVENT_START_TIME); return raceLogEventFactory.createStartTimeEvent(createdAt, author, logicalTimePoint, id, competitors, passId, startTime); } - private RaceLogRaceStatusEvent loadRaceLogRaceStatusEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { + private RaceLogRaceStatusEvent loadRaceLogRaceStatusEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { RaceLogRaceStatus nextStatus = RaceLogRaceStatus.valueOf((String) dbObject.get(FieldNames.RACE_LOG_EVENT_NEXT_STATUS.name())); return raceLogEventFactory.createRaceStatusEvent(createdAt, author, logicalTimePoint, id, competitors, passId, nextStatus); } 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 c81fa48aa95..cdc3027bdd1 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 @@ -24,6 +24,8 @@ public enum FieldNames { REGATTA_NAME, REGATTA_ID, REGATTA_BASE_NAME, + REGATTA_START_DATE, + REGATTA_END_DATE, REGATTA_SERIES, REGATTA_REGATTA_CONFIGURATION, REGATTA_USE_START_TIME_INFERENCE, 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 c4bd85e6e2c..f2ba598d2cd 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 @@ -18,6 +18,33 @@ import com.mongodb.DBCollection; import com.mongodb.DBObject; import com.mongodb.WriteConcern; import com.mongodb.util.JSON; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.RevokeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogCourseAreaChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningListChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogGateLineOpeningTimeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogPassChangeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogPathfinderEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogProtestStartTimeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogRaceStatusEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogRevokeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogStartProcedureChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; +import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.CloseOpenEndedDeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DefineMarkEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DenoteForTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceCompetitorMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMarkMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.RegisterCompetitorEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.StartTrackingEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.ControlPoint; import com.sap.sailing.domain.base.ControlPointWithTwoMarks; @@ -62,33 +89,7 @@ import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule; import com.sap.sailing.domain.persistence.MongoObjectFactory; import com.sap.sailing.domain.persistence.racelog.tracking.DeviceIdentifierMongoHandler; import com.sap.sailing.domain.persistence.racelog.tracking.impl.PlaceHolderDeviceIdentifierMongoHandler; -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.RaceLogEventAuthor; -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; -import com.sap.sailing.domain.racelog.RaceLogProtestStartTimeEvent; -import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; -import com.sap.sailing.domain.racelog.RaceLogStartProcedureChangedEvent; -import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; -import com.sap.sailing.domain.racelog.RaceLogWindFixEvent; -import com.sap.sailing.domain.racelog.RevokeEvent; -import com.sap.sailing.domain.racelog.scoring.AdditionalScoringInformationEvent; -import com.sap.sailing.domain.racelog.tracking.CloseOpenEndedDeviceMappingEvent; -import com.sap.sailing.domain.racelog.tracking.DefineMarkEvent; -import com.sap.sailing.domain.racelog.tracking.DenoteForTrackingEvent; -import com.sap.sailing.domain.racelog.tracking.DeviceCompetitorMappingEvent; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; -import com.sap.sailing.domain.racelog.tracking.DeviceMappingEvent; -import com.sap.sailing.domain.racelog.tracking.DeviceMarkMappingEvent; -import com.sap.sailing.domain.racelog.tracking.RegisterCompetitorEvent; -import com.sap.sailing.domain.racelog.tracking.StartTrackingEvent; import com.sap.sailing.domain.tracking.Positioned; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRegatta; @@ -588,6 +589,8 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { DBObject query = new BasicDBObject(FieldNames.REGATTA_NAME.name(), regatta.getName()); dbRegatta.put(FieldNames.REGATTA_NAME.name(), regatta.getName()); dbRegatta.put(FieldNames.REGATTA_ID.name(), regatta.getId()); + storeTimePoint(regatta.getStartDate(), dbRegatta, FieldNames.REGATTA_START_DATE); + storeTimePoint(regatta.getEndDate(), dbRegatta, FieldNames.REGATTA_END_DATE); dbRegatta.put(FieldNames.SCORING_SCHEME_TYPE.name(), regatta.getScoringScheme().getType().name()); if (regatta.getBoatClass() != null) { dbRegatta.put(FieldNames.BOAT_CLASS_NAME.name(), regatta.getBoatClass().getName()); @@ -686,7 +689,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { return result; } - private void storeRaceLogEventAuthor(DBObject dbObject, RaceLogEventAuthor author) { + private void storeRaceLogEventAuthor(DBObject dbObject, AbstractLogEventAuthor author) { if (author != null) { dbObject.put(FieldNames.RACE_LOG_EVENT_AUTHOR_NAME.name(), author.getName()); dbObject.put(FieldNames.RACE_LOG_EVENT_AUTHOR_PRIORITY.name(), author.getPriority()); @@ -816,7 +819,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { return result; } - public DBObject storeRaceLogEntry(RaceLogIdentifier raceLogIdentifier, RevokeEvent event) { + public DBObject storeRaceLogEntry(RaceLogIdentifier raceLogIdentifier, RaceLogRevokeEvent event) { BasicDBObject result = new BasicDBObject(); storeRaceLogIdentifier(raceLogIdentifier, result); result.put(FieldNames.RACE_LOG_EVENT.name(), storeRaceLogRevokeEvent(event)); @@ -943,7 +946,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { return result; } - private Object storeRaceLogRevokeEvent(RevokeEvent event) { + private Object storeRaceLogRevokeEvent(RaceLogRevokeEvent event) { DBObject result = new BasicDBObject(); storeRaceLogEventProperties(event, result); result.put(FieldNames.RACE_LOG_EVENT_CLASS.name(), RevokeEvent.class.getSimpleName()); diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreFactoryImpl.java index f15d80bbf17..53c2872103c 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreFactoryImpl.java @@ -1,9 +1,9 @@ package com.sap.sailing.domain.persistence.impl; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; import com.sap.sailing.domain.persistence.DomainObjectFactory; import com.sap.sailing.domain.persistence.MongoObjectFactory; import com.sap.sailing.domain.persistence.MongoRaceLogStoreFactory; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.racelog.RaceLogStore; diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreImpl.java index fe621cc5ec4..de12602f77a 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreImpl.java @@ -4,10 +4,10 @@ import java.util.HashMap; import java.util.Map; import java.util.WeakHashMap; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; import com.sap.sailing.domain.persistence.DomainObjectFactory; import com.sap.sailing.domain.persistence.MongoObjectFactory; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.racelog.RaceLogStore; diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java index 7fd0e2517ed..b09e981de9f 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java @@ -3,31 +3,31 @@ package com.sap.sailing.domain.persistence.impl; import java.util.logging.Logger; import com.mongodb.DBObject; +import com.sap.sailing.domain.abstractlog.race.RaceLogCourseAreaChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningListChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogGateLineOpeningTimeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogPassChangeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogPathfinderEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogProtestStartTimeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogRaceStatusEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogRevokeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogStartProcedureChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; +import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.CloseOpenEndedDeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DefineMarkEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DenoteForTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceCompetitorMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMarkMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.RegisterCompetitorEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.StartTrackingEvent; 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.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; -import com.sap.sailing.domain.racelog.RaceLogProtestStartTimeEvent; -import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; -import com.sap.sailing.domain.racelog.RaceLogStartProcedureChangedEvent; -import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; -import com.sap.sailing.domain.racelog.RaceLogWindFixEvent; -import com.sap.sailing.domain.racelog.RevokeEvent; -import com.sap.sailing.domain.racelog.scoring.AdditionalScoringInformationEvent; -import com.sap.sailing.domain.racelog.tracking.CloseOpenEndedDeviceMappingEvent; -import com.sap.sailing.domain.racelog.tracking.DefineMarkEvent; -import com.sap.sailing.domain.racelog.tracking.DenoteForTrackingEvent; -import com.sap.sailing.domain.racelog.tracking.DeviceCompetitorMappingEvent; -import com.sap.sailing.domain.racelog.tracking.DeviceMarkMappingEvent; -import com.sap.sailing.domain.racelog.tracking.RegisterCompetitorEvent; -import com.sap.sailing.domain.racelog.tracking.StartTrackingEvent; public class MongoRaceLogStoreVisitor implements RaceLogEventVisitor { @@ -145,7 +145,7 @@ public class MongoRaceLogStoreVisitor implements RaceLogEventVisitor { } @Override - public void visit(RevokeEvent event) { + public void visit(RaceLogRevokeEvent event) { DBObject object = mongoObjectFactory.storeRaceLogEntry(raceLogIdentifier, event); mongoObjectFactory.storeRaceLogEventEvent(object); } diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/racelog/tracking/DeviceIdentifierMongoHandler.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/racelog/tracking/DeviceIdentifierMongoHandler.java index 13b310f404d..890639443a4 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/racelog/tracking/DeviceIdentifierMongoHandler.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/racelog/tracking/DeviceIdentifierMongoHandler.java @@ -1,6 +1,6 @@ package com.sap.sailing.domain.persistence.racelog.tracking; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifierSerializationHandler; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifierSerializationHandler; public interface DeviceIdentifierMongoHandler extends DeviceIdentifierSerializationHandler { } diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/racelog/tracking/impl/MongoGPSFixStoreImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/racelog/tracking/impl/MongoGPSFixStoreImpl.java index 4ef80c9e3ea..57bacf58f9a 100755 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/racelog/tracking/impl/MongoGPSFixStoreImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/racelog/tracking/impl/MongoGPSFixStoreImpl.java @@ -14,6 +14,11 @@ import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.DBObject; import com.mongodb.QueryBuilder; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMapping; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.DeviceCompetitorMappingFinder; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.DeviceMarkMappingFinder; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.common.TimeRange; @@ -30,12 +35,7 @@ import com.sap.sailing.domain.persistence.impl.MongoObjectFactoryImpl; import com.sap.sailing.domain.persistence.racelog.tracking.DeviceIdentifierMongoHandler; import com.sap.sailing.domain.persistence.racelog.tracking.GPSFixMongoHandler; import com.sap.sailing.domain.persistence.racelog.tracking.MongoGPSFixStore; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; -import com.sap.sailing.domain.racelog.tracking.DeviceMapping; import com.sap.sailing.domain.racelog.tracking.GPSFixReceivedListener; -import com.sap.sailing.domain.racelog.tracking.analyzing.impl.DeviceCompetitorMappingFinder; -import com.sap.sailing.domain.racelog.tracking.analyzing.impl.DeviceMarkMappingFinder; import com.sap.sailing.domain.tracking.DynamicGPSFixTrack; import com.sap.sailing.domain.tracking.GPSFix; import com.sap.sailing.domain.tracking.GPSFixMoving; diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/racelog/tracking/impl/PlaceHolderDeviceIdentifierMongoHandler.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/racelog/tracking/impl/PlaceHolderDeviceIdentifierMongoHandler.java index 5657f067858..f74ea821419 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/racelog/tracking/impl/PlaceHolderDeviceIdentifierMongoHandler.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/racelog/tracking/impl/PlaceHolderDeviceIdentifierMongoHandler.java @@ -1,9 +1,9 @@ package com.sap.sailing.domain.persistence.racelog.tracking.impl; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; +import com.sap.sailing.domain.abstractlog.race.tracking.impl.PlaceHolderDeviceIdentifierSerializationHandler; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; import com.sap.sailing.domain.persistence.racelog.tracking.DeviceIdentifierMongoHandler; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; -import com.sap.sailing.domain.racelog.tracking.impl.PlaceHolderDeviceIdentifierSerializationHandler; public class PlaceHolderDeviceIdentifierMongoHandler extends PlaceHolderDeviceIdentifierSerializationHandler implements DeviceIdentifierMongoHandler { diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java index 228550802c2..a97decd840a 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java @@ -6,6 +6,12 @@ import static junit.framework.Assert.assertEquals; import org.junit.After; import org.junit.Before; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventFactory; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogImpl; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.DomainFactory; import com.sap.sailing.domain.base.Mark; @@ -14,12 +20,6 @@ import com.sap.sailing.domain.common.impl.DegreePosition; import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl; import com.sap.sailing.domain.persistence.impl.MongoObjectFactoryImpl; import com.sap.sailing.domain.persistence.racelog.tracking.impl.MongoGPSFixStoreImpl; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventFactory; -import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl; -import com.sap.sailing.domain.racelog.impl.RaceLogImpl; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; import com.sap.sailing.domain.racelog.tracking.GPSFixStore; import com.sap.sailing.domain.racelog.tracking.test.mock.MockDeviceAndSessionIdentifierWithGPSFixesDeserializer; import com.sap.sailing.domain.racelog.tracking.test.mock.MockSmartphoneImeiServiceFinderFactory; @@ -43,7 +43,7 @@ public class AbstractGPSFixStoreTest { protected final Competitor comp = DomainFactory.INSTANCE.getOrCreateCompetitor("comp", "comp", null, null, null); protected final Mark mark = DomainFactory.INSTANCE.getOrCreateMark("mark"); - private final RaceLogEventAuthor author = new RaceLogEventAuthorImpl("author", 0); + private final AbstractLogEventAuthor author = new LogEventAuthorImpl("author", 0); protected GPSFixMoving createFix(long millis, double lat, double lng, double knots, double degrees) { return new GPSFixMovingImpl(new DegreePosition(lat, lng), diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java index 03a87975d6d..a4c45e8b0a2 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java @@ -17,6 +17,10 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventFactory; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.DomainFactory; import com.sap.sailing.domain.base.Fleet; @@ -32,10 +36,6 @@ import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl; import com.sap.sailing.domain.common.racelog.tracking.NotDenotedForRaceLogTrackingException; import com.sap.sailing.domain.leaderboard.RegattaLeaderboard; import com.sap.sailing.domain.leaderboard.impl.HighPoint; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventFactory; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; import com.sap.sailing.domain.racelog.tracking.GPSFixStore; import com.sap.sailing.domain.racelog.tracking.test.mock.MockSmartphoneImeiServiceFinderFactory; import com.sap.sailing.domain.racelog.tracking.test.mock.SmartphoneImeiIdentifier; @@ -57,7 +57,7 @@ public class CreateAndTrackWithRaceLogTest { private RegattaLeaderboard leaderboard; private RaceLogTrackingAdapter adapter; private Regatta regatta; - private RaceLogEventAuthor author; + private AbstractLogEventAuthor author; private GPSFixStore gpsFixStore; private long time = 0; @@ -71,7 +71,8 @@ public class CreateAndTrackWithRaceLogTest { service.getMongoObjectFactory().getDatabase().dropDatabase(); author = service.getServerAuthor(); Series series = new SeriesImpl("series", false, Collections.singletonList(fleet), Collections.emptySet(), service); - regatta = service.createRegatta(RegattaImpl.getDefaultName("regatta", "Laser"), "Laser", UUID.randomUUID(), Collections.singletonList(series), + regatta = service.createRegatta(RegattaImpl.getDefaultName("regatta", "Laser"), "Laser", + /*startDate*/ null, /*endDate*/ null, UUID.randomUUID(), Collections.singletonList(series), false, new HighPoint(), UUID.randomUUID(), /* useStartTimeInference */ true); series.addRaceColumn(columnName, /* trackedRegattaRegistry */ null); leaderboard = service.addRegattaLeaderboard(regatta.getRegattaIdentifier(), "RegattaLeaderboard", new int[] {}); diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java index 8f72e7237d8..6e7de825266 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java @@ -7,6 +7,9 @@ import java.util.Collections; import org.junit.Test; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogImpl; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Course; @@ -22,10 +25,7 @@ import com.sap.sailing.domain.base.impl.WaypointImpl; import com.sap.sailing.domain.common.impl.TimeRangeImpl; import com.sap.sailing.domain.common.racelog.tracking.NoCorrespondingServiceRegisteredException; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; -import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore; -import com.sap.sailing.domain.racelog.impl.RaceLogImpl; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; import com.sap.sailing.domain.racelog.tracking.test.mock.SmartphoneImeiIdentifier; import com.sap.sailing.domain.racelogtracking.test.AbstractGPSFixStoreTest; import com.sap.sailing.domain.tracking.GPSFixMoving; @@ -68,7 +68,8 @@ public class TrackedRaceLoadsFixesTest extends AbstractGPSFixStoreTest { store.storeFix(device, createFix(i+1000, 10, 20, 30, 40)); } - TrackedRegatta regatta = new DynamicTrackedRegattaImpl(new RegattaImpl(EmptyRaceLogStore.INSTANCE, RegattaImpl.getDefaultName("regatta", boatClass.getName()), boatClass, null, null, "a", null)); + TrackedRegatta regatta = new DynamicTrackedRegattaImpl(new RegattaImpl(EmptyRaceLogStore.INSTANCE, RegattaImpl.getDefaultName("regatta", boatClass.getName()), boatClass, + /*startDate*/ null, /*endDate*/ null, null, null, "a", null)); DynamicTrackedRaceImpl trackedRace = new DynamicTrackedRaceImpl(regatta, race, Collections.emptyList(), EmptyWindStore.INSTANCE, store, 0, 0, 0); @@ -110,7 +111,8 @@ public class TrackedRaceLoadsFixesTest extends AbstractGPSFixStoreTest { store.storeFix(device, createFix(i, 10, 20, 30, 40)); } - TrackedRegatta regatta = new DynamicTrackedRegattaImpl(new RegattaImpl(EmptyRaceLogStore.INSTANCE, RegattaImpl.getDefaultName("regatta", boatClass.getName()), boatClass, null, null, "a", null)); + TrackedRegatta regatta = new DynamicTrackedRegattaImpl(new RegattaImpl(EmptyRaceLogStore.INSTANCE, RegattaImpl.getDefaultName("regatta", boatClass.getName()), boatClass, + /*startDate*/ null, /*endDate*/ null, null, null, "a", null)); DynamicTrackedRaceImpl trackedRace = new DynamicTrackedRaceImpl(regatta, race, Collections.emptyList(), EmptyWindStore.INSTANCE, store, 0, 0, 0); diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiIdentifier.java b/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiIdentifier.java index b4a50799206..8e28eb8f6e6 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiIdentifier.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiIdentifier.java @@ -1,6 +1,6 @@ package com.sap.sailing.domain.racelog.tracking.test.mock; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; public class SmartphoneImeiIdentifier implements DeviceIdentifier { diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiJsonHandler.java b/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiJsonHandler.java index 2bb12bbfd3b..568a7d65e04 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiJsonHandler.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiJsonHandler.java @@ -1,7 +1,7 @@ package com.sap.sailing.domain.racelog.tracking.test.mock; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; import com.sap.sailing.server.gateway.serialization.racelog.tracking.DeviceIdentifierJsonHandler; public class SmartphoneImeiJsonHandler extends SmartphoneImeiSerializationHandler diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiMongoHandler.java b/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiMongoHandler.java index 39c94d2fac2..fbf81b864b7 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiMongoHandler.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiMongoHandler.java @@ -1,8 +1,8 @@ package com.sap.sailing.domain.racelog.tracking.test.mock; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; import com.sap.sailing.domain.persistence.racelog.tracking.DeviceIdentifierMongoHandler; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; public class SmartphoneImeiMongoHandler extends SmartphoneImeiSerializationHandler implements DeviceIdentifierMongoHandler { diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiSerializationHandler.java b/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiSerializationHandler.java index 1f5e4485067..c2f9daa1970 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiSerializationHandler.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiSerializationHandler.java @@ -1,7 +1,7 @@ package com.sap.sailing.domain.racelog.tracking.test.mock; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; import com.sap.sse.common.Util; public class SmartphoneImeiSerializationHandler { diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiStringSerializationHandler.java b/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiStringSerializationHandler.java index c6fcc9c94e6..b0ce6f98bd1 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiStringSerializationHandler.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiStringSerializationHandler.java @@ -1,6 +1,6 @@ package com.sap.sailing.domain.racelog.tracking.test.mock; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifierStringSerializationHandler; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifierStringSerializationHandler; public class SmartphoneImeiStringSerializationHandler extends SmartphoneImeiSerializationHandler implements DeviceIdentifierStringSerializationHandler { diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/PingDeviceIdentifier.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/PingDeviceIdentifier.java index cbedce015fd..6fbb46e8cd4 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/PingDeviceIdentifier.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/PingDeviceIdentifier.java @@ -2,7 +2,7 @@ package com.sap.sailing.domain.racelogtracking; import java.util.UUID; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; /** * A device identifier used to identify a non-existent, virtual device, which is used only once as an diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java index 40bbd2c82dc..3d4ca1c155e 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java @@ -2,6 +2,11 @@ package com.sap.sailing.domain.racelogtracking; import java.util.Set; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DefineMarkEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DenoteForTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.StartTrackingEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.ControlPoint; import com.sap.sailing.domain.base.Fleet; @@ -13,12 +18,7 @@ import com.sap.sailing.domain.common.racelog.tracking.NotDenotedForRaceLogTracki import com.sap.sailing.domain.common.racelog.tracking.RaceLogTrackingState; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.RegattaLeaderboard; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogCourseDesignChangedEvent; -import com.sap.sailing.domain.racelog.tracking.DefineMarkEvent; -import com.sap.sailing.domain.racelog.tracking.DenoteForTrackingEvent; import com.sap.sailing.domain.racelog.tracking.GPSFixStore; -import com.sap.sailing.domain.racelog.tracking.StartTrackingEvent; import com.sap.sailing.domain.racelogtracking.impl.RaceLogRaceTracker; import com.sap.sailing.domain.tracking.GPSFix; import com.sap.sailing.domain.tracking.TrackedRace; diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/Activator.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/Activator.java index 5433fcf2a5b..37b5c4242aa 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/Activator.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/Activator.java @@ -11,10 +11,10 @@ import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceRegistration; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifierStringSerializationHandler; +import com.sap.sailing.domain.abstractlog.race.tracking.SmartphoneUUIDIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TypeBasedServiceFinder; import com.sap.sailing.domain.persistence.racelog.tracking.DeviceIdentifierMongoHandler; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifierStringSerializationHandler; -import com.sap.sailing.domain.racelog.tracking.SmartphoneUUIDIdentifier; import com.sap.sailing.domain.racelogtracking.PingDeviceIdentifierImpl; import com.sap.sailing.domain.racelogtracking.RaceLogTrackingAdapterFactory; import com.sap.sailing.domain.trackfiles.TrackFileImportDeviceIdentifier; diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/PingDeviceIdentifierJsonHandler.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/PingDeviceIdentifierJsonHandler.java index aa1e690e85a..b38d8e5399c 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/PingDeviceIdentifierJsonHandler.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/PingDeviceIdentifierJsonHandler.java @@ -1,7 +1,7 @@ package com.sap.sailing.domain.racelogtracking.impl; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; import com.sap.sailing.server.gateway.serialization.racelog.tracking.DeviceIdentifierJsonHandler; public class PingDeviceIdentifierJsonHandler extends PingDeviceIdentifierSerializationHandler diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/PingDeviceIdentifierMongoHandler.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/PingDeviceIdentifierMongoHandler.java index 2a95aa119f7..1b9a0b55fa3 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/PingDeviceIdentifierMongoHandler.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/PingDeviceIdentifierMongoHandler.java @@ -1,8 +1,8 @@ package com.sap.sailing.domain.racelogtracking.impl; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; import com.sap.sailing.domain.persistence.racelog.tracking.DeviceIdentifierMongoHandler; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; public class PingDeviceIdentifierMongoHandler extends PingDeviceIdentifierSerializationHandler implements DeviceIdentifierMongoHandler { diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/PingDeviceIdentifierSerializationHandler.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/PingDeviceIdentifierSerializationHandler.java index e3049cacde8..6429460cbfb 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/PingDeviceIdentifierSerializationHandler.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/PingDeviceIdentifierSerializationHandler.java @@ -2,8 +2,8 @@ package com.sap.sailing.domain.racelogtracking.impl; import java.util.UUID; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; import com.sap.sailing.domain.racelogtracking.PingDeviceIdentifier; import com.sap.sailing.domain.racelogtracking.PingDeviceIdentifierImpl; import com.sap.sse.common.Util; diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/PingDeviceIdentifierStringSerializationHandler.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/PingDeviceIdentifierStringSerializationHandler.java index b039e9c656c..e6d3e50ce98 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/PingDeviceIdentifierStringSerializationHandler.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/PingDeviceIdentifierStringSerializationHandler.java @@ -1,6 +1,6 @@ package com.sap.sailing.domain.racelogtracking.impl; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifierStringSerializationHandler; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifierStringSerializationHandler; public class PingDeviceIdentifierStringSerializationHandler extends PingDeviceIdentifierSerializationHandler implements DeviceIdentifierStringSerializationHandler { diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogConnectivityParams.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogConnectivityParams.java index 071781242a5..7f9f4d0803e 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogConnectivityParams.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogConnectivityParams.java @@ -2,6 +2,9 @@ package com.sap.sailing.domain.racelogtracking.impl; import java.util.UUID; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceInformationFinder; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.DomainFactory; import com.sap.sailing.domain.base.Fleet; @@ -10,10 +13,7 @@ import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.common.racelog.tracking.RaceNotCreatedException; import com.sap.sailing.domain.leaderboard.Leaderboard; -import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.tracking.GPSFixStore; -import com.sap.sailing.domain.racelog.tracking.analyzing.impl.RaceInformationFinder; -import com.sap.sailing.domain.racelog.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer; import com.sap.sailing.domain.tracking.DynamicTrackedRegatta; import com.sap.sailing.domain.tracking.RaceTracker; import com.sap.sailing.domain.tracking.RaceTrackingConnectivityParameters; diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java index a7b0f8f3b59..c6c7dce0e4e 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java @@ -10,6 +10,22 @@ import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.LastPublishedCourseDesignFinder; +import com.sap.sailing.domain.abstractlog.race.impl.BaseRaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.tracking.DenoteForTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceCompetitorMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMapping; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMarkMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.StartTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.DeviceCompetitorMappingFinder; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.DeviceMappingFinder; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.DeviceMarkMappingFinder; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceInformationFinder; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RegisteredCompetitorsAnalyzer; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.ControlPoint; @@ -28,30 +44,14 @@ import com.sap.sailing.domain.base.impl.RaceDefinitionImpl; import com.sap.sailing.domain.common.PassingInstruction; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.TrackedRaceStatusEnum; +import com.sap.sailing.domain.common.abstractlog.NotRevokableException; import com.sap.sailing.domain.common.racelog.tracking.NoCorrespondingServiceRegisteredException; -import com.sap.sailing.domain.common.racelog.tracking.NotRevokableException; import com.sap.sailing.domain.common.racelog.tracking.RaceLogTrackingState; import com.sap.sailing.domain.common.racelog.tracking.RaceNotCreatedException; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; import com.sap.sailing.domain.markpassingcalculation.MarkPassingCalculator; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogCourseDesignChangedEvent; -import com.sap.sailing.domain.racelog.analyzing.impl.LastPublishedCourseDesignFinder; -import com.sap.sailing.domain.racelog.impl.BaseRaceLogEventVisitor; -import com.sap.sailing.domain.racelog.tracking.DenoteForTrackingEvent; -import com.sap.sailing.domain.racelog.tracking.DeviceCompetitorMappingEvent; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; -import com.sap.sailing.domain.racelog.tracking.DeviceMapping; -import com.sap.sailing.domain.racelog.tracking.DeviceMarkMappingEvent; import com.sap.sailing.domain.racelog.tracking.GPSFixReceivedListener; import com.sap.sailing.domain.racelog.tracking.GPSFixStore; -import com.sap.sailing.domain.racelog.tracking.StartTrackingEvent; -import com.sap.sailing.domain.racelog.tracking.analyzing.impl.DeviceCompetitorMappingFinder; -import com.sap.sailing.domain.racelog.tracking.analyzing.impl.DeviceMappingFinder; -import com.sap.sailing.domain.racelog.tracking.analyzing.impl.DeviceMarkMappingFinder; -import com.sap.sailing.domain.racelog.tracking.analyzing.impl.RaceInformationFinder; -import com.sap.sailing.domain.racelog.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer; -import com.sap.sailing.domain.racelog.tracking.analyzing.impl.RegisteredCompetitorsAnalyzer; import com.sap.sailing.domain.tracking.DynamicGPSFixTrack; import com.sap.sailing.domain.tracking.DynamicTrackedRace; import com.sap.sailing.domain.tracking.DynamicTrackedRegatta; @@ -374,7 +374,8 @@ public class RaceLogRaceTracker extends BaseRaceLogEventVisitor implements RaceT if (raceColumn.getTrackedRace(fleet) != null) { try { - raceLog.revokeEvent(params.getService().getServerAuthor(), event); + raceLog.revokeEvent(params.getService().getServerAuthor(), event, + "could not start tracking because tracked race already exists"); } catch (NotRevokableException e) {} throw new RaceNotCreatedException(String.format("Race for racelog (%s) has already been created", raceLog)); } diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java index 6169eccba58..a97f01df477 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java @@ -9,6 +9,21 @@ import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.Revokable; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventFactory; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.LastPublishedCourseDesignFinder; +import com.sap.sailing.domain.abstractlog.race.tracking.DefineMarkEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DenoteForTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; +import com.sap.sailing.domain.abstractlog.race.tracking.RegisterCompetitorEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.StartTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.AllEventsOfTypeFinder; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.LastEventOfTypeFinder; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RegisteredCompetitorsAnalyzer; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.ControlPoint; @@ -23,31 +38,16 @@ import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.base.impl.CourseDataImpl; import com.sap.sailing.domain.common.PassingInstruction; import com.sap.sailing.domain.common.RegattaIdentifier; +import com.sap.sailing.domain.common.abstractlog.NotRevokableException; import com.sap.sailing.domain.common.racelog.tracking.NoCorrespondingServiceRegisteredException; import com.sap.sailing.domain.common.racelog.tracking.NotDenotableForRaceLogTrackingException; import com.sap.sailing.domain.common.racelog.tracking.NotDenotedForRaceLogTrackingException; -import com.sap.sailing.domain.common.racelog.tracking.NotRevokableException; import com.sap.sailing.domain.common.racelog.tracking.RaceLogRaceTrackerExistsException; import com.sap.sailing.domain.common.racelog.tracking.RaceLogTrackingState; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.RegattaLeaderboard; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventFactory; -import com.sap.sailing.domain.racelog.Revokable; -import com.sap.sailing.domain.racelog.analyzing.impl.LastPublishedCourseDesignFinder; -import com.sap.sailing.domain.racelog.tracking.DefineMarkEvent; -import com.sap.sailing.domain.racelog.tracking.DenoteForTrackingEvent; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; -import com.sap.sailing.domain.racelog.tracking.RegisterCompetitorEvent; -import com.sap.sailing.domain.racelog.tracking.StartTrackingEvent; -import com.sap.sailing.domain.racelog.tracking.analyzing.impl.AllEventsOfTypeFinder; -import com.sap.sailing.domain.racelog.tracking.analyzing.impl.LastEventOfTypeFinder; -import com.sap.sailing.domain.racelog.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer; -import com.sap.sailing.domain.racelog.tracking.analyzing.impl.RegisteredCompetitorsAnalyzer; import com.sap.sailing.domain.racelogtracking.PingDeviceIdentifierImpl; import com.sap.sailing.domain.racelogtracking.RaceLogTrackingAdapter; import com.sap.sailing.domain.tracking.GPSFix; @@ -199,12 +199,14 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter { return baseDomainFactory.createWaypoint(newCP, pi); } - private void revokeAlreadyDefinedMarks(RaceLog raceLog, RaceLogEventAuthor author) { + private void revokeAlreadyDefinedMarks(RaceLog raceLog, AbstractLogEventAuthor author) { List markEvents = new AllEventsOfTypeFinder(raceLog, true, DefineMarkEvent.class).analyze(); for (RaceLogEvent event : markEvents) { try { - raceLog.revokeEvent(author, event); - } catch (NotRevokableException e) {} + raceLog.revokeEvent(author, event, "removing mark that was already defined"); + } catch (NotRevokableException e) { + logger.log(Level.WARNING, "Could not remove mark that was already defined by adding RevokeEvent", e); + } } } @@ -264,9 +266,11 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter { Revokable denoteForTrackingEvent = (Revokable) new LastEventOfTypeFinder(raceLog, true, DenoteForTrackingEvent.class).analyze(); Revokable startTrackingEvent = (Revokable) new LastEventOfTypeFinder(raceLog, true, StartTrackingEvent.class).analyze(); try { - raceLog.revokeEvent(service.getServerAuthor(), denoteForTrackingEvent); - raceLog.revokeEvent(service.getServerAuthor(), startTrackingEvent); - } catch (NotRevokableException e) {} + raceLog.revokeEvent(service.getServerAuthor(), denoteForTrackingEvent, "remove denotation"); + raceLog.revokeEvent(service.getServerAuthor(), startTrackingEvent, "reset start time upon removing denotation"); + } catch (NotRevokableException e) { + logger.log(Level.WARNING, "could not remove denotation by adding RevokeEvents", e); + } } @Override @@ -294,8 +298,11 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter { RegisterCompetitorEvent registerEvent = (RegisterCompetitorEvent) event; if (toBeRemoved.contains(registerEvent.getCompetitor())) { try { - raceLog.revokeEvent(service.getServerAuthor(), (RegisterCompetitorEvent) event); - } catch (NotRevokableException e) {} + raceLog.revokeEvent(service.getServerAuthor(), (RegisterCompetitorEvent) event, + "unregistering competitor because no longer selected for registration"); + } catch (NotRevokableException e) { + logger.log(Level.WARNING, "could not unregister competitor by adding RevokeEvent", e); + } } } } diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/SmartphoneUUIDMongoHandler.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/SmartphoneUUIDMongoHandler.java index 00c500d4baa..8442ed46d4c 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/SmartphoneUUIDMongoHandler.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/SmartphoneUUIDMongoHandler.java @@ -1,9 +1,9 @@ package com.sap.sailing.domain.racelogtracking.impl; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; +import com.sap.sailing.domain.abstractlog.race.tracking.SmartphoneUUIDSerializationHandler; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; import com.sap.sailing.domain.persistence.racelog.tracking.DeviceIdentifierMongoHandler; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; -import com.sap.sailing.domain.racelog.tracking.SmartphoneUUIDSerializationHandler; public class SmartphoneUUIDMongoHandler extends SmartphoneUUIDSerializationHandler implements DeviceIdentifierMongoHandler { diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/SmartphoneUUIDStringSerializationHandler.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/SmartphoneUUIDStringSerializationHandler.java index 9f47a25f841..64c0668ed46 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/SmartphoneUUIDStringSerializationHandler.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/SmartphoneUUIDStringSerializationHandler.java @@ -1,7 +1,7 @@ package com.sap.sailing.domain.racelogtracking.impl; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifierStringSerializationHandler; -import com.sap.sailing.domain.racelog.tracking.SmartphoneUUIDSerializationHandler; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifierStringSerializationHandler; +import com.sap.sailing.domain.abstractlog.race.tracking.SmartphoneUUIDSerializationHandler; public class SmartphoneUUIDStringSerializationHandler extends SmartphoneUUIDSerializationHandler implements DeviceIdentifierStringSerializationHandler { diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/TrackFileImportDeviceIdentifierJsonHandler.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/TrackFileImportDeviceIdentifierJsonHandler.java index 01248d6f0f3..beea49d3265 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/TrackFileImportDeviceIdentifierJsonHandler.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/TrackFileImportDeviceIdentifierJsonHandler.java @@ -4,8 +4,8 @@ import java.util.UUID; import org.json.simple.JSONObject; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; import com.sap.sailing.domain.trackfiles.TrackFileImportDeviceIdentifier; import com.sap.sailing.domain.trackfiles.TrackFileImportDeviceIdentifierImpl; import com.sap.sailing.server.gateway.serialization.racelog.tracking.DeviceIdentifierJsonHandler; diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/TrackFileImportDeviceIdentifierMongoHandler.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/TrackFileImportDeviceIdentifierMongoHandler.java index 8aea30b8147..87823eb0fa7 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/TrackFileImportDeviceIdentifierMongoHandler.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/TrackFileImportDeviceIdentifierMongoHandler.java @@ -4,9 +4,9 @@ import java.util.UUID; import com.mongodb.BasicDBObject; import com.mongodb.DBObject; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; import com.sap.sailing.domain.persistence.racelog.tracking.DeviceIdentifierMongoHandler; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; import com.sap.sailing.domain.trackfiles.TrackFileImportDeviceIdentifier; import com.sap.sailing.domain.trackfiles.TrackFileImportDeviceIdentifierImpl; import com.sap.sse.common.TimePoint; diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/TrackFileImportDeviceIdentifierStringSerializationHandler.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/TrackFileImportDeviceIdentifierStringSerializationHandler.java index 784b2b48043..20f16b1dc4c 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/TrackFileImportDeviceIdentifierStringSerializationHandler.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/TrackFileImportDeviceIdentifierStringSerializationHandler.java @@ -2,9 +2,9 @@ package com.sap.sailing.domain.racelogtracking.impl; import java.util.UUID; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifierStringSerializationHandler; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifierStringSerializationHandler; import com.sap.sailing.domain.trackfiles.TrackFileImportDeviceIdentifier; import com.sap.sailing.domain.trackfiles.TrackFileImportDeviceIdentifierImpl; import com.sap.sse.common.Util; diff --git a/java/com.sap.sailing.domain.shared.android.test/META-INF/MANIFEST.MF b/java/com.sap.sailing.domain.shared.android.test/META-INF/MANIFEST.MF index be0fba19f0b..ed9dc4586e3 100644 --- a/java/com.sap.sailing.domain.shared.android.test/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.domain.shared.android.test/META-INF/MANIFEST.MF @@ -7,9 +7,9 @@ Bundle-Vendor: SAP Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Require-Bundle: com.sap.sailing.domain.common;bundle-version="1.0.0", com.sap.sailing.domain.shared.android;bundle-version="1.0.0", + org.hamcrest;bundle-version="1.1.0", org.junit4;bundle-version="4.8.2", org.objenesis;bundle-version="1.3.0", - org.hamcrest;bundle-version="1.1.0", org.mockito.mockito-core;bundle-version="1.9.5", com.sap.sailing.domain.test, com.sap.sailing.domain.racelogtrackingadapter.testsupport;bundle-version="1.0.0", diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/AbortingFlagFinderTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/AbortingFlagFinderTest.java index 7128fd9300b..71ae4ca02de 100644 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/AbortingFlagFinderTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/AbortingFlagFinderTest.java @@ -8,10 +8,10 @@ import java.util.UUID; import org.junit.Test; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.AbortingFlagFinder; import com.sap.sailing.domain.common.racelog.Flags; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogFlagEvent; -import com.sap.sailing.domain.racelog.analyzing.impl.AbortingFlagFinder; public class AbortingFlagFinderTest extends RaceLogAnalyzerTest { diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/ConfirmedFinishPositioningListFinderTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/ConfirmedFinishPositioningListFinderTest.java index 55ad06f1a26..bada0503c17 100644 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/ConfirmedFinishPositioningListFinderTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/ConfirmedFinishPositioningListFinderTest.java @@ -9,12 +9,12 @@ import java.util.Arrays; import org.junit.Test; -import com.sap.sailing.domain.racelog.CompetitorResults; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogFinishPositioningConfirmedEvent; -import com.sap.sailing.domain.racelog.analyzing.impl.ConfirmedFinishPositioningListFinder; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.CompetitorResults; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.ConfirmedFinishPositioningListFinder; public class ConfirmedFinishPositioningListFinderTest extends PassAwareRaceLogAnalyzerTest { @@ -25,7 +25,7 @@ public class ConfirmedFinishPositioningListFinderTest extends } @Override - protected TargetPair getTargetEventsAndResultForPassAwareTests(int passId, RaceLogEventAuthor author) { + protected TargetPair getTargetEventsAndResultForPassAwareTests(int passId, AbstractLogEventAuthor author) { RaceLogFinishPositioningConfirmedEvent event = createEvent(RaceLogFinishPositioningConfirmedEvent.class, 1, passId, author); when(event.getPositionedCompetitorsIDsNamesMaxPointsReasons()).thenReturn(mock(CompetitorResults.class)); return new TargetPair(Arrays.asList(event), event.getPositionedCompetitorsIDsNamesMaxPointsReasons()); diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/FinishedTimeFinderTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/FinishedTimeFinderTest.java index 1350136e421..09f56c2cb77 100644 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/FinishedTimeFinderTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/FinishedTimeFinderTest.java @@ -8,12 +8,12 @@ import java.util.Arrays; import org.junit.Test; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogRaceStatusEvent; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.FinishedTimeFinder; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; -import com.sap.sailing.domain.racelog.analyzing.impl.FinishedTimeFinder; import com.sap.sse.common.TimePoint; public class FinishedTimeFinderTest extends PassAwareRaceLogAnalyzerTest { @@ -24,7 +24,7 @@ public class FinishedTimeFinderTest extends PassAwareRaceLogAnalyzerTest { @@ -24,7 +24,7 @@ public class FinishingTimeFinderTest extends PassAwareRaceLogAnalyzerTest { @@ -23,7 +23,7 @@ public class GateLineOpeningTimeFinderTest extends PassAwareRaceLogAnalyzerTest< } @Override - protected TargetPair getTargetEventsAndResultForPassAwareTests(int passId, RaceLogEventAuthor author) { + protected TargetPair getTargetEventsAndResultForPassAwareTests(int passId, AbstractLogEventAuthor author) { RaceLogGateLineOpeningTimeEvent event = createEvent(RaceLogGateLineOpeningTimeEvent.class, 1, passId, author); when(event.getGateLineOpeningTimes()).thenReturn(new GateLineOpeningTimes(2, 3)); return new TargetPair(Arrays.asList(event), new GateLineOpeningTimes(2, 3)); diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/IndividualRecallFinderTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/IndividualRecallFinderTest.java index 0aa8887583d..52282fd3c1c 100644 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/IndividualRecallFinderTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/IndividualRecallFinderTest.java @@ -8,19 +8,19 @@ import java.util.Arrays; import org.junit.Test; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.IndividualRecallFinder; import com.sap.sailing.domain.common.racelog.Flags; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogFlagEvent; -import com.sap.sailing.domain.racelog.analyzing.impl.IndividualRecallFinder; import com.sap.sse.common.TimePoint; public class IndividualRecallFinderTest extends PassAwareRaceLogAnalyzerTest { @Override protected TargetPair getTargetEventsAndResultForPassAwareTests( - int passId, RaceLogEventAuthor author) { + int passId, AbstractLogEventAuthor author) { RaceLogFlagEvent event = createEvent(RaceLogFlagEvent.class, 1, passId, author); when(event.getUpperFlag()).thenReturn(Flags.XRAY); when(event.isDisplayed()).thenReturn(true); diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/LastFlagsFinderTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/LastFlagsFinderTest.java index c5f84c32151..155c75c78be 100644 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/LastFlagsFinderTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/LastFlagsFinderTest.java @@ -10,10 +10,10 @@ import java.util.List; import org.junit.Test; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogFlagEvent; -import com.sap.sailing.domain.racelog.analyzing.impl.LastFlagsFinder; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.LastFlagsFinder; public class LastFlagsFinderTest extends RaceLogAnalyzerTest { diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/LastWindFixFinderTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/LastWindFixFinderTest.java index e6391c064d4..fd59f205a04 100644 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/LastWindFixFinderTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/LastWindFixFinderTest.java @@ -7,10 +7,10 @@ import static org.mockito.Mockito.when; import org.junit.Test; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogWindFixEvent; -import com.sap.sailing.domain.racelog.analyzing.impl.LastWindFixFinder; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.LastWindFixFinder; import com.sap.sailing.domain.tracking.Wind; public class LastWindFixFinderTest extends RaceLogAnalyzerTest { diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/PassAwareRaceLogAnalyzerTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/PassAwareRaceLogAnalyzerTest.java index 8ce10fa81eb..4ae79649f1b 100644 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/PassAwareRaceLogAnalyzerTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/PassAwareRaceLogAnalyzerTest.java @@ -10,10 +10,10 @@ import java.util.UUID; import org.junit.Test; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.analyzing.impl.RaceLogAnalyzer; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogAnalyzer; public abstract class PassAwareRaceLogAnalyzerTest, ResultType> extends RaceLogAnalyzerTest { @@ -41,18 +41,18 @@ public abstract class PassAwareRaceLogAnalyzerTest { @@ -24,7 +24,7 @@ public class ProtestStartTimeFinderTest extends PassAwareRaceLogAnalyzerTest> { @@ -41,14 +41,14 @@ public abstract class RaceLogAnalyzerTest T createEvent(Class type, long milliseconds, int passId, Serializable id) { - return createEvent(type, milliseconds, passId, id, mock(RaceLogEventAuthor.class)); + return createEvent(type, milliseconds, passId, id, mock(AbstractLogEventAuthor.class)); } - protected static T createEvent(Class type, long milliseconds, int passId, RaceLogEventAuthor author) { + protected static T createEvent(Class type, long milliseconds, int passId, AbstractLogEventAuthor author) { return createEvent(type, milliseconds, passId, UUID.randomUUID(), author); } - protected static T createEvent(Class type, long milliseconds, int passId, Serializable id, RaceLogEventAuthor author) { + protected static T createEvent(Class type, long milliseconds, int passId, Serializable id, AbstractLogEventAuthor author) { T event = mock(type); when(event.getAuthor()).thenReturn(author); when(event.getPassId()).thenReturn(passId); diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/RaceStatusAnalyzerTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/RaceStatusAnalyzerTest.java index b97fa3131da..92165c60f3b 100644 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/RaceStatusAnalyzerTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/RaceStatusAnalyzerTest.java @@ -12,16 +12,16 @@ import org.junit.Test; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.RaceLogRaceStatusEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceStatusAnalyzer; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedure; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; -import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; -import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; -import com.sap.sailing.domain.racelog.analyzing.impl.RaceStatusAnalyzer; -import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedure; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; @@ -35,7 +35,7 @@ public class RaceStatusAnalyzerTest extends PassAwareRaceLogAnalyzerTest { @@ -25,7 +25,7 @@ public class StartTimeFinderTest extends PassAwareRaceLogAnalyzerTest { diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/state/test/RaceStateTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/state/test/RaceStateTest.java index c087004a9d0..51992db2da1 100644 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/state/test/RaceStateTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/state/test/RaceStateTest.java @@ -13,6 +13,19 @@ import static org.mockito.Mockito.when; import org.junit.Before; import org.junit.Test; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventFactory; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogImpl; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogStartProcedureChangedEventImpl; +import com.sap.sailing.domain.abstractlog.race.state.RaceState; +import com.sap.sailing.domain.abstractlog.race.state.RaceStateChangedListener; +import com.sap.sailing.domain.abstractlog.race.state.impl.RaceStateImpl; +import com.sap.sailing.domain.abstractlog.race.state.impl.ReadonlyRaceStateImpl; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedure; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.GateStartRacingProcedure; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.RacingProcedureFactoryImpl; import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.configuration.ConfigurationLoader; import com.sap.sailing.domain.base.configuration.RacingProcedureConfiguration; @@ -23,26 +36,13 @@ import com.sap.sailing.domain.base.configuration.procedures.ESSConfiguration; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.domain.common.racelog.RacingProcedureType; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventFactory; -import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl; -import com.sap.sailing.domain.racelog.impl.RaceLogImpl; -import com.sap.sailing.domain.racelog.impl.RaceLogStartProcedureChangedEventImpl; -import com.sap.sailing.domain.racelog.state.RaceState; -import com.sap.sailing.domain.racelog.state.RaceStateChangedListener; -import com.sap.sailing.domain.racelog.state.impl.RaceStateImpl; -import com.sap.sailing.domain.racelog.state.impl.ReadonlyRaceStateImpl; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedure; -import com.sap.sailing.domain.racelog.state.racingprocedure.gate.GateStartRacingProcedure; -import com.sap.sailing.domain.racelog.state.racingprocedure.impl.RacingProcedureFactoryImpl; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; public class RaceStateTest { private RaceLog raceLog; - private RaceLogEventAuthor author; + private AbstractLogEventAuthor author; private RaceLogEventFactory factory; private RacingProcedureType defaultRacingProcedureType; private ConfigurationLoader configuration; @@ -54,7 +54,7 @@ public class RaceStateTest { @Before public void setUp() { raceLog = new RaceLogImpl("test-log"); - author = new RaceLogEventAuthorImpl("Test", 1); + author = new LogEventAuthorImpl("Test", 1); factory = RaceLogEventFactory.INSTANCE; defaultRacingProcedureType = RacingProcedureType.RRS26; configuration = new EmptyRegattaConfiguration(); diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogEventAuthorTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogEventAuthorTest.java index 526a492837e..d7d2a311b73 100644 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogEventAuthorTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogEventAuthorTest.java @@ -5,14 +5,14 @@ import static org.junit.Assert.assertTrue; import org.junit.Test; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; public class RaceLogEventAuthorTest { @Test public void testCompareToSame() { - RaceLogEventAuthor author = new RaceLogEventAuthorImpl("", 1); + AbstractLogEventAuthor author = new LogEventAuthorImpl("", 1); int result = author.compareTo(author); assertEquals(0, result); @@ -20,8 +20,8 @@ public class RaceLogEventAuthorTest { @Test public void testCompareToMinor() { - RaceLogEventAuthor author = new RaceLogEventAuthorImpl("", 1); - RaceLogEventAuthor minor = new RaceLogEventAuthorImpl("", 2); + AbstractLogEventAuthor author = new LogEventAuthorImpl("", 1); + AbstractLogEventAuthor minor = new LogEventAuthorImpl("", 2); int result = author.compareTo(minor); assertTrue(result > 0); @@ -29,8 +29,8 @@ public class RaceLogEventAuthorTest { @Test public void testCompareToMajor() { - RaceLogEventAuthor author = new RaceLogEventAuthorImpl("", 3); - RaceLogEventAuthor major = new RaceLogEventAuthorImpl("", 2); + AbstractLogEventAuthor author = new LogEventAuthorImpl("", 3); + AbstractLogEventAuthor major = new LogEventAuthorImpl("", 2); int result = author.compareTo(major); assertTrue(result < 0); diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogEventComparatorTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogEventComparatorTest.java index 1569f32c65b..017ed42d825 100644 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogEventComparatorTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogEventComparatorTest.java @@ -8,17 +8,17 @@ import static org.mockito.Mockito.when; import org.junit.Before; import org.junit.Test; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventComparator; import com.sap.sailing.domain.base.Timed; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.impl.RaceLogEventComparator; import com.sap.sse.common.impl.MillisecondsTimePoint; public class RaceLogEventComparatorTest { private RaceLogEvent eventOne; private RaceLogEvent eventTwo; - private RaceLogEventAuthor author; + private AbstractLogEventAuthor author; private RaceLogEventComparator comparator; @@ -26,15 +26,16 @@ public class RaceLogEventComparatorTest { public void setUp() { eventOne = mock(RaceLogEvent.class); eventTwo = mock(RaceLogEvent.class); - author = mock(RaceLogEventAuthor.class); + author = mock(AbstractLogEventAuthor.class); - comparator = RaceLogEventComparator.INSTANCE; + comparator = new RaceLogEventComparator(); } @Test public void testEqualsOnSame() { - when(eventOne.getAuthor()).thenReturn(mock(RaceLogEventAuthor.class)); + when(eventOne.getAuthor()).thenReturn(mock(AbstractLogEventAuthor.class)); when(eventOne.getCreatedAt()).thenReturn(new MillisecondsTimePoint(1)); + when(eventOne.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(1)); when(eventOne.getId()).thenReturn("a"); int result = comparator.compare(eventOne, eventOne); @@ -46,10 +47,12 @@ public class RaceLogEventComparatorTest { when(eventOne.getPassId()).thenReturn(0); when(eventOne.getAuthor()).thenReturn(author); when(eventOne.getCreatedAt()).thenReturn(new MillisecondsTimePoint(0)); + when(eventOne.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(1)); when(eventOne.getId()).thenReturn("a"); when(eventTwo.getPassId()).thenReturn(0); when(eventTwo.getAuthor()).thenReturn(author); when(eventTwo.getCreatedAt()).thenReturn(new MillisecondsTimePoint(0)); + when(eventTwo.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(1)); when(eventTwo.getId()).thenReturn("a"); int result = comparator.compare(eventOne, eventTwo); @@ -61,10 +64,12 @@ public class RaceLogEventComparatorTest { when(eventOne.getPassId()).thenReturn(0); when(eventOne.getAuthor()).thenReturn(author); when(eventOne.getCreatedAt()).thenReturn(new MillisecondsTimePoint(0)); + when(eventOne.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(1)); when(eventOne.getId()).thenReturn("a"); when(eventTwo.getPassId()).thenReturn(0); when(eventTwo.getAuthor()).thenReturn(author); when(eventTwo.getCreatedAt()).thenReturn(new MillisecondsTimePoint(0)); + when(eventTwo.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(1)); when(eventTwo.getId()).thenReturn("b"); int result = comparator.compare(eventOne, eventTwo); @@ -76,9 +81,11 @@ public class RaceLogEventComparatorTest { when(eventOne.getPassId()).thenReturn(0); when(eventOne.getAuthor()).thenReturn(author); when(eventOne.getCreatedAt()).thenReturn(new MillisecondsTimePoint(1)); + when(eventOne.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(1)); when(eventTwo.getPassId()).thenReturn(0); when(eventTwo.getAuthor()).thenReturn(author); when(eventTwo.getCreatedAt()).thenReturn(new MillisecondsTimePoint(2)); + when(eventTwo.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(2)); int result = comparator.compare(eventOne, eventTwo); assertTrue(result < 0); @@ -89,9 +96,11 @@ public class RaceLogEventComparatorTest { when(eventOne.getPassId()).thenReturn(0); when(eventOne.getAuthor()).thenReturn(author); when(eventOne.getCreatedAt()).thenReturn(new MillisecondsTimePoint(2)); + when(eventOne.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(2)); when(eventTwo.getPassId()).thenReturn(0); when(eventTwo.getAuthor()).thenReturn(author); when(eventTwo.getCreatedAt()).thenReturn(new MillisecondsTimePoint(1)); + when(eventTwo.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(1)); int result = comparator.compare(eventOne, eventTwo); assertTrue(result > 0); @@ -99,15 +108,19 @@ public class RaceLogEventComparatorTest { @Test public void testSamePassButLowerHigherAuthor() { - RaceLogEventAuthor minorAuthor = mock(RaceLogEventAuthor.class); - RaceLogEventAuthor majorAuthor = mock(RaceLogEventAuthor.class); + AbstractLogEventAuthor minorAuthor = mock(AbstractLogEventAuthor.class); + AbstractLogEventAuthor majorAuthor = mock(AbstractLogEventAuthor.class); when(minorAuthor.compareTo(majorAuthor)).thenReturn(-1); when(majorAuthor.compareTo(minorAuthor)).thenReturn(1); when(eventOne.getPassId()).thenReturn(0); when(eventOne.getAuthor()).thenReturn(minorAuthor); + when(eventOne.getCreatedAt()).thenReturn(new MillisecondsTimePoint(1)); + when(eventOne.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(1)); when(eventTwo.getPassId()).thenReturn(0); when(eventTwo.getAuthor()).thenReturn(majorAuthor); + when(eventTwo.getCreatedAt()).thenReturn(new MillisecondsTimePoint(1)); + when(eventTwo.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(1)); int result = comparator.compare(eventOne, eventTwo); assertTrue(result < 0); @@ -115,15 +128,19 @@ public class RaceLogEventComparatorTest { @Test public void testSamePassButHigherLowerAuthor() { - RaceLogEventAuthor minorAuthor = mock(RaceLogEventAuthor.class); - RaceLogEventAuthor majorAuthor = mock(RaceLogEventAuthor.class); + AbstractLogEventAuthor minorAuthor = mock(AbstractLogEventAuthor.class); + AbstractLogEventAuthor majorAuthor = mock(AbstractLogEventAuthor.class); when(minorAuthor.compareTo(majorAuthor)).thenReturn(-1); when(majorAuthor.compareTo(minorAuthor)).thenReturn(1); when(eventOne.getPassId()).thenReturn(0); when(eventOne.getAuthor()).thenReturn(majorAuthor); + when(eventOne.getCreatedAt()).thenReturn(new MillisecondsTimePoint(1)); + when(eventOne.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(1)); when(eventTwo.getPassId()).thenReturn(0); when(eventTwo.getAuthor()).thenReturn(minorAuthor); + when(eventTwo.getCreatedAt()).thenReturn(new MillisecondsTimePoint(1)); + when(eventTwo.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(1)); int result = comparator.compare(eventOne, eventTwo); assertTrue(result > 0); diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogEventImplTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogEventImplTest.java index 5f07da24c68..91b10656b99 100644 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogEventImplTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogEventImplTest.java @@ -6,11 +6,11 @@ import static org.mockito.Mockito.mock; import java.io.Serializable; import java.util.List; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventImpl; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; -import com.sap.sailing.domain.racelog.impl.RaceLogEventImpl; import com.sap.sse.common.TimePoint; public class RaceLogEventImplTest { @@ -28,7 +28,7 @@ public class RaceLogEventImplTest { private static class TestRaceLogEvent extends RaceLogEventImpl { private static final long serialVersionUID = -5856509136541176818L; - public TestRaceLogEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + public TestRaceLogEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, List pInvolvedBoats, int pPassId) { super(createdAt, author, logicalTimePoint, pId, pInvolvedBoats, pPassId); } diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogRevocationTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogRevocationTest.java index b58c451e4c3..9f4c9e36cfa 100644 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogRevocationTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogRevocationTest.java @@ -1,5 +1,7 @@ package com.sap.sailing.domain.racelog.test; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.isIn; import static org.junit.Assert.assertEquals; import java.util.UUID; @@ -7,31 +9,32 @@ import java.util.UUID; import org.junit.Before; import org.junit.Test; -import com.sap.sailing.domain.common.racelog.tracking.NotRevokableException; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventFactory; -import com.sap.sailing.domain.racelog.RevokeEvent; -import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl; -import com.sap.sailing.domain.racelog.impl.RaceLogImpl; -import com.sap.sailing.domain.racelog.tracking.DenoteForTrackingEvent; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogChangedListener; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventFactory; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogChangedVisitor; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogImpl; +import com.sap.sailing.domain.abstractlog.race.tracking.DenoteForTrackingEvent; +import com.sap.sailing.domain.common.abstractlog.NotRevokableException; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; public class RaceLogRevocationTest { private RaceLog serverRaceLog; - private RaceLogEventAuthor serverAuthor = new RaceLogEventAuthorImpl("server", 2); + private AbstractLogEventAuthor serverAuthor = new LogEventAuthorImpl("server", 2); private RaceLog clientARaceLog; private UUID clientAUUID = UUID.randomUUID(); - private RaceLogEventAuthor clientAAuthor = new RaceLogEventAuthorImpl("clientA", 3); + private AbstractLogEventAuthor clientAAuthor = new LogEventAuthorImpl("clientA", 3); private RaceLog clientBRaceLog; private UUID clientBUUID = UUID.randomUUID(); - private RaceLogEventAuthor clientBAuthor = new RaceLogEventAuthorImpl("clientB", 1); + private AbstractLogEventAuthor clientBAuthor = new LogEventAuthorImpl("clientB", 1); private RaceLog clientCRaceLog; private UUID clientCUUID = UUID.randomUUID(); - private RaceLogEventAuthor clientCAuthor = new RaceLogEventAuthorImpl("clientC", 0); + private AbstractLogEventAuthor clientCAuthor = new LogEventAuthorImpl("clientC", 0); @Before public void setup() { @@ -39,6 +42,19 @@ public class RaceLogRevocationTest { clientARaceLog = new RaceLogImpl("clientA"); clientBRaceLog = new RaceLogImpl("clientB"); clientCRaceLog = new RaceLogImpl("clientC"); + + addSendingListener(clientARaceLog, clientAUUID); + addSendingListener(clientBRaceLog, clientBUUID); + addSendingListener(clientCRaceLog, clientCUUID); + } + + private void addSendingListener(RaceLog raceLog, UUID uuid) { + raceLog.addListener(new RaceLogChangedVisitor(new RaceLogChangedListener() { + @Override + public void eventAdded(RaceLogEvent event) { + sendClientEvent(raceLog, event, uuid); + } + })); } private static TimePoint now() { @@ -51,6 +67,7 @@ public class RaceLogRevocationTest { if (clientEvent == null) { eventsToAdd = serverRaceLog.getEventsToDeliver(clientUUID); } else { + clientRaceLog.add(clientEvent); eventsToAdd = serverRaceLog.add(clientEvent, clientUUID); } for (RaceLogEvent eventToAdd : eventsToAdd) { @@ -98,18 +115,17 @@ public class RaceLogRevocationTest { sendClientAEvent(null); sendClientBEvent(null); sendClientCEvent(null); - + //they revoke the event independently try { clientARaceLog.revokeEvent(clientAAuthor, event); } catch (NotRevokableException e) { - //expected, because A does not have sufficient priority + //expected } - RevokeEvent revokeEventB = clientBRaceLog.revokeEvent(clientBAuthor, event); - RevokeEvent revokeEventC = clientCRaceLog.revokeEvent(clientCAuthor, event); - - sendClientBEvent(revokeEventB); - sendClientCEvent(revokeEventC); + clientBRaceLog.revokeEvent(clientBAuthor, event); + clientCRaceLog.revokeEvent(clientCAuthor, event); + //expected, because A does not have sufficient priority + assertThat("event not revoked due to insufficient author priority", event, isIn(clientARaceLog.getUnrevokedEvents())); //update clients sendClientAEvent(null); diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogTest.java index 54979261b8b..153f253b88a 100644 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogTest.java @@ -19,16 +19,16 @@ import org.junit.Test; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventFactory; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; -import com.sap.sailing.domain.racelog.RaceLogFlagEvent; -import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; -import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl; -import com.sap.sailing.domain.racelog.impl.RaceLogEventImpl; -import com.sap.sailing.domain.racelog.impl.RaceLogImpl; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventFactory; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventImpl; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogImpl; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; @@ -40,7 +40,7 @@ public class RaceLogTest { private static class MockRaceLogEventForSorting extends RaceLogEventImpl { public MockRaceLogEventForSorting(long createdAtMillis) { super(new MillisecondsTimePoint(createdAtMillis), - /* author */ new RaceLogEventAuthorImpl("Dummy Author", /* priority */ 0), + /* author */ new LogEventAuthorImpl("Dummy Author", /* priority */ 0), MillisecondsTimePoint.now(), /* ID */ UUID.randomUUID(), /* pInvolvedBoats */ null, /* pass ID */ 1); } @@ -242,12 +242,14 @@ public class RaceLogTest { RaceLogEvent eventTwo = mock(RaceLogEvent.class); when(eventOne.getPassId()).thenReturn(0); - when(eventOne.getAuthor()).thenReturn(mock(RaceLogEventAuthor.class)); + when(eventOne.getAuthor()).thenReturn(mock(AbstractLogEventAuthor.class)); when(eventOne.getCreatedAt()).thenReturn(new MillisecondsTimePoint(0)); + when(eventOne.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(0)); when(eventOne.getId()).thenReturn("a"); when(eventTwo.getPassId()).thenReturn(1); - when(eventTwo.getAuthor()).thenReturn(mock(RaceLogEventAuthor.class)); + when(eventTwo.getAuthor()).thenReturn(mock(AbstractLogEventAuthor.class)); when(eventTwo.getCreatedAt()).thenReturn(new MillisecondsTimePoint(0)); + when(eventTwo.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(0)); when(eventTwo.getId()).thenReturn("b"); assertTrue(raceLog.add(eventOne)); @@ -263,15 +265,17 @@ public class RaceLogTest { public void testAddEventSamePassAndSameAuthorAndSameTimePointButDifferentId() { RaceLogEvent eventOne = mock(RaceLogEvent.class); RaceLogEvent eventTwo = mock(RaceLogEvent.class); - RaceLogEventAuthor author = mock(RaceLogEventAuthor.class); + AbstractLogEventAuthor author = mock(AbstractLogEventAuthor.class); when(eventOne.getPassId()).thenReturn(0); when(eventOne.getAuthor()).thenReturn(author); when(eventOne.getCreatedAt()).thenReturn(new MillisecondsTimePoint(0)); + when(eventOne.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(0)); when(eventOne.getId()).thenReturn("a"); when(eventTwo.getPassId()).thenReturn(0); when(eventTwo.getAuthor()).thenReturn(author); when(eventTwo.getCreatedAt()).thenReturn(new MillisecondsTimePoint(0)); + when(eventTwo.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(0)); when(eventTwo.getId()).thenReturn("b"); assertTrue(raceLog.add(eventOne)); @@ -287,15 +291,17 @@ public class RaceLogTest { public void testWontAddEventSamePassAndSameAuthorAndSameTimePointAndSameId() { RaceLogEvent eventOne = mock(RaceLogEvent.class); RaceLogEvent eventTwo = mock(RaceLogEvent.class); - RaceLogEventAuthor author = mock(RaceLogEventAuthor.class); + AbstractLogEventAuthor author = mock(AbstractLogEventAuthor.class); when(eventOne.getPassId()).thenReturn(0); when(eventOne.getAuthor()).thenReturn(author); when(eventOne.getCreatedAt()).thenReturn(new MillisecondsTimePoint(0)); + when(eventOne.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(0)); when(eventOne.getId()).thenReturn("a"); when(eventTwo.getPassId()).thenReturn(0); when(eventTwo.getAuthor()).thenReturn(author); when(eventTwo.getCreatedAt()).thenReturn(new MillisecondsTimePoint(0)); + when(eventTwo.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(0)); when(eventTwo.getId()).thenReturn("a"); assertTrue(raceLog.add(eventOne)); @@ -360,8 +366,8 @@ public class RaceLogTest { RaceLogEvent event1 = mock(RaceLogEvent.class); RaceLogEvent event2 = mock(RaceLogEvent.class); RaceLogEvent event3 = mock(RaceLogEvent.class); - RaceLogEventAuthor minorAuthor = mock(RaceLogEventAuthor.class); - RaceLogEventAuthor majorAuthor = mock(RaceLogEventAuthor.class); + AbstractLogEventAuthor minorAuthor = mock(AbstractLogEventAuthor.class); + AbstractLogEventAuthor majorAuthor = mock(AbstractLogEventAuthor.class); when(minorAuthor.compareTo(majorAuthor)).thenReturn(-1); when(majorAuthor.compareTo(minorAuthor)).thenReturn(1); @@ -389,8 +395,8 @@ public class RaceLogTest { RaceLogEvent event2 = mock(RaceLogEvent.class); RaceLogEvent event3 = mock(RaceLogEvent.class); RaceLogEvent event4 = mock(RaceLogEvent.class); - RaceLogEventAuthor minorAuthor = mock(RaceLogEventAuthor.class); - RaceLogEventAuthor majorAuthor = mock(RaceLogEventAuthor.class); + AbstractLogEventAuthor minorAuthor = mock(AbstractLogEventAuthor.class); + AbstractLogEventAuthor majorAuthor = mock(AbstractLogEventAuthor.class); when(minorAuthor.compareTo(majorAuthor)).thenReturn(-1); when(majorAuthor.compareTo(minorAuthor)).thenReturn(1); @@ -419,7 +425,7 @@ public class RaceLogTest { assertEquals(event2, Util.get(raceLog.getFixesDescending(), 2)); raceLog.unlockAfterRead(); } - private RaceLogEventAuthor author = new RaceLogEventAuthorImpl("Test Author", 1); + private AbstractLogEventAuthor author = new LogEventAuthorImpl("Test Author", 1); @Test public void testAddingEventsFromMultipleClients() { @@ -446,14 +452,14 @@ public class RaceLogTest { TimePoint createdAtEventOne = new MillisecondsTimePoint(100); RaceLogEvent eventOne = mock(RaceLogEvent.class); - when(eventOne.getAuthor()).thenReturn(mock(RaceLogEventAuthor.class)); + when(eventOne.getAuthor()).thenReturn(mock(AbstractLogEventAuthor.class)); when(eventOne.getCreatedAt()).thenReturn(createdAtEventOne); when(eventOne.getTimePoint()).thenReturn(createdAtEventOne); raceLog.add(eventOne); TimePoint createdAtEventTwo = new MillisecondsTimePoint(99); RaceLogEvent eventTwo = mock(RaceLogEvent.class); - when(eventTwo.getAuthor()).thenReturn(mock(RaceLogEventAuthor.class)); + when(eventTwo.getAuthor()).thenReturn(mock(AbstractLogEventAuthor.class)); when(eventTwo.getCreatedAt()).thenReturn(createdAtEventTwo); when(eventTwo.getTimePoint()).thenReturn(createdAtEventTwo); raceLog.add(eventTwo); diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/SerializeRaceLogEventsTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/SerializeRaceLogEventsTest.java index d513705230a..f2abb2999af 100755 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/SerializeRaceLogEventsTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/SerializeRaceLogEventsTest.java @@ -11,12 +11,12 @@ import java.io.ObjectOutputStream; import org.junit.Before; import org.junit.Test; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEventFactory; -import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; -import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl; -import com.sap.sailing.domain.racelog.impl.RaceLogImpl; -import com.sap.sailing.domain.racelog.tracking.DeviceCompetitorMappingEvent; +import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventFactory; +import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogImpl; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceCompetitorMappingEvent; import com.sap.sailing.domain.racelog.tracking.test.mock.SmartphoneImeiIdentifier; import com.sap.sailing.domain.test.AbstractLeaderboardTest; import com.sap.sse.common.Util; @@ -60,7 +60,7 @@ public class SerializeRaceLogEventsTest { @Test public void testRaceLogSerializationWithSingleEvent() throws IOException, ClassNotFoundException { RaceLogStartTimeEvent startTimeEvent = eventFactory.createStartTimeEvent(MillisecondsTimePoint.now(), - new RaceLogEventAuthorImpl("Author Name", /* priority */0), /* passId */1, /* startTime */ + new LogEventAuthorImpl("Author Name", /* priority */0), /* passId */1, /* startTime */ MillisecondsTimePoint.now()); raceLog.add(startTimeEvent); oos.writeObject(raceLog); @@ -80,7 +80,7 @@ public class SerializeRaceLogEventsTest { @Test public void testRaceLogSerializationWithEventContainingDeviceIdentifier() throws IOException, ClassNotFoundException { DeviceCompetitorMappingEvent mappingEvent = eventFactory.createDeviceCompetitorMappingEvent( - MillisecondsTimePoint.now(), new RaceLogEventAuthorImpl("Author Name", /* priority */0), new SmartphoneImeiIdentifier("1948364938463903"), + MillisecondsTimePoint.now(), new LogEventAuthorImpl("Author Name", /* priority */0), new SmartphoneImeiIdentifier("1948364938463903"), AbstractLeaderboardTest.createCompetitor("Test Competitor"), 0, new MillisecondsTimePoint(0), new MillisecondsTimePoint(10)); raceLog.add(mappingEvent); oos.writeObject(raceLog); diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/AbstractRaceLogTrackingTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/AbstractRaceLogTrackingTest.java index ce9d3fc2c35..251fa779f10 100644 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/AbstractRaceLogTrackingTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/AbstractRaceLogTrackingTest.java @@ -2,19 +2,19 @@ package com.sap.sailing.domain.racelog.tracking.analyzing.test; import org.junit.Before; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventRestoreFactory; -import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl; -import com.sap.sailing.domain.racelog.impl.RaceLogImpl; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventRestoreFactory; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogImpl; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; public abstract class AbstractRaceLogTrackingTest { protected RaceLog log; - protected final RaceLogEventAuthor author = new RaceLogEventAuthorImpl("author0", 0); - protected final RaceLogEventAuthor author1 = new RaceLogEventAuthorImpl("author1", 1); + protected final AbstractLogEventAuthor author = new LogEventAuthorImpl("author0", 0); + protected final AbstractLogEventAuthor author1 = new LogEventAuthorImpl("author1", 1); protected final TimePoint now = MillisecondsTimePoint.now(); protected final RaceLogEventRestoreFactory factory = RaceLogEventRestoreFactory.INSTANCE; diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/DeviceMappingFinderTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/DeviceMappingFinderTest.java index f3e662e58b1..26904d76029 100644 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/DeviceMappingFinderTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/DeviceMappingFinderTest.java @@ -10,13 +10,13 @@ import junit.framework.Assert; import org.junit.Test; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMapping; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.DeviceCompetitorMappingFinder; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.impl.CompetitorImpl; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; -import com.sap.sailing.domain.racelog.tracking.DeviceMapping; -import com.sap.sailing.domain.racelog.tracking.analyzing.impl.DeviceCompetitorMappingFinder; import com.sap.sailing.domain.racelog.tracking.test.mock.SmartphoneImeiIdentifier; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; @@ -40,14 +40,14 @@ public class DeviceMappingFinderTest extends AbstractRaceLogTrackingTest { return millis == null ? null : new MillisecondsTimePoint(millis); } - private Serializable addMapping(RaceLogEventAuthor author, DeviceIdentifier device, Long from, Long to, Competitor item) { + private Serializable addMapping(AbstractLogEventAuthor author, DeviceIdentifier device, Long from, Long to, Competitor item) { RaceLogEvent mapping = factory.createDeviceCompetitorMappingEvent(t(), author, t(), UUID.randomUUID(), device, item, 0, t(from), t(to)); log.add(mapping); return mapping.getId(); } - private void closeMapping(RaceLogEventAuthor author, DeviceIdentifier device, Serializable mappingId, long millis) { + private void closeMapping(AbstractLogEventAuthor author, DeviceIdentifier device, Serializable mappingId, long millis) { RaceLogEvent mapping = factory.createCloseOpenEndedDeviceMappingEvent(t(), author, t(), UUID.randomUUID(), 0, mappingId, new MillisecondsTimePoint(millis)); log.add(mapping); diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/RevokeEventTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/RevokeEventTest.java index 5661ee4f4ef..6344333f059 100644 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/RevokeEventTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/RevokeEventTest.java @@ -6,15 +6,15 @@ import junit.framework.Assert; import org.junit.Test; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RevokeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogRevokeEvent; import com.sap.sse.common.Util; public class RevokeEventTest extends AbstractRaceLogTrackingTest { @Test public void revokedEventIsExcluded() { RaceLogEvent event = factory.createDeviceCompetitorMappingEvent(now, author, now, UUID.randomUUID(), null, null, 0, null, null); - RevokeEvent revokeEvent = factory.createRevokeEvent(now.plus(1), author, now.plus(1), UUID.randomUUID(), 0, event.getId(), + RaceLogRevokeEvent revokeEvent = factory.createRevokeEvent(now.plus(1), author, now.plus(1), UUID.randomUUID(), 0, event.getId(), null, null, null); log.add(event); @@ -28,7 +28,7 @@ public class RevokeEventTest extends AbstractRaceLogTrackingTest { @Test public void eventRevokedByAuthorWithLowerPrioIsNotExcluded() { RaceLogEvent event = factory.createDeviceCompetitorMappingEvent(now, author, now, UUID.randomUUID(), null, null, 0, null, null); - RevokeEvent revokeEvent = factory.createRevokeEvent(now.plus(1), author1, now.plus(1), UUID.randomUUID(), 0, event.getId(), + RaceLogRevokeEvent revokeEvent = factory.createRevokeEvent(now.plus(1), author1, now.plus(1), UUID.randomUUID(), 0, event.getId(), null, null, null); log.add(event); @@ -42,9 +42,9 @@ public class RevokeEventTest extends AbstractRaceLogTrackingTest { @Test public void revokingRevokeEventIsNotHarmful() { RaceLogEvent event = factory.createDeviceCompetitorMappingEvent(now, author, now, UUID.randomUUID(), null, null, 0, null, null); - RevokeEvent revokeEvent = factory.createRevokeEvent(now.plus(1), author, now.plus(1), UUID.randomUUID(), 0, event.getId(), + RaceLogRevokeEvent revokeEvent = factory.createRevokeEvent(now.plus(1), author, now.plus(1), UUID.randomUUID(), 0, event.getId(), null, null, null); - RevokeEvent revokeEvent2 = factory.createRevokeEvent(now.plus(2), author, now.plus(2), UUID.randomUUID(), 2, revokeEvent.getId(), + RaceLogRevokeEvent revokeEvent2 = factory.createRevokeEvent(now.plus(2), author, now.plus(2), UUID.randomUUID(), 2, revokeEvent.getId(), null, null, null); log.add(event); diff --git a/java/com.sap.sailing.domain.shared.android/META-INF/MANIFEST.MF b/java/com.sap.sailing.domain.shared.android/META-INF/MANIFEST.MF index 252178cccfb..eb48cdd64bd 100644 --- a/java/com.sap.sailing.domain.shared.android/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.domain.shared.android/META-INF/MANIFEST.MF @@ -9,32 +9,38 @@ Require-Bundle: com.sap.sailing.domain.common;bundle-version="1.0.0", com.sap.sse.datamining.shared;bundle-version="1.0.0", com.sap.sse.common, com.sap.sse -Export-Package: com.sap.sailing.domain.base, +Export-Package: com.sap.sailing.domain.abstractlog, + com.sap.sailing.domain.abstractlog.impl, + com.sap.sailing.domain.abstractlog.race, + com.sap.sailing.domain.abstractlog.race.analyzing.impl, + com.sap.sailing.domain.abstractlog.race.impl, + com.sap.sailing.domain.abstractlog.race.scoring, + com.sap.sailing.domain.abstractlog.race.scoring.impl, + com.sap.sailing.domain.abstractlog.race.state, + com.sap.sailing.domain.abstractlog.race.state.impl, + com.sap.sailing.domain.abstractlog.race.state.racingprocedure, + com.sap.sailing.domain.abstractlog.race.state.racingprocedure.basic, + com.sap.sailing.domain.abstractlog.race.state.racingprocedure.basic.impl, + com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ess, + com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ess.impl, + com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate, + com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.impl, + com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl, + com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26, + com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.impl, + com.sap.sailing.domain.abstractlog.race.tracking, + com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl, + com.sap.sailing.domain.abstractlog.race.tracking.events, + com.sap.sailing.domain.abstractlog.race.tracking.impl, + com.sap.sailing.domain.abstractlog.regatta, + com.sap.sailing.domain.abstractlog.regatta.impl, + com.sap.sailing.domain.base, com.sap.sailing.domain.base.configuration, com.sap.sailing.domain.base.configuration.impl, com.sap.sailing.domain.base.configuration.procedures, com.sap.sailing.domain.base.impl, com.sap.sailing.domain.base.racegroup, com.sap.sailing.domain.base.racegroup.impl, - com.sap.sailing.domain.racelog, - com.sap.sailing.domain.racelog.analyzing.impl, - com.sap.sailing.domain.racelog.impl, - com.sap.sailing.domain.racelog.scoring, - com.sap.sailing.domain.racelog.scoring.impl, - com.sap.sailing.domain.racelog.state, - com.sap.sailing.domain.racelog.state.impl, - com.sap.sailing.domain.racelog.state.racingprocedure, - com.sap.sailing.domain.racelog.state.racingprocedure.ess, - com.sap.sailing.domain.racelog.state.racingprocedure.ess.impl, - com.sap.sailing.domain.racelog.state.racingprocedure.gate, - com.sap.sailing.domain.racelog.state.racingprocedure.gate.impl, - com.sap.sailing.domain.racelog.state.racingprocedure.impl, - com.sap.sailing.domain.racelog.state.racingprocedure.rrs26, - com.sap.sailing.domain.racelog.state.racingprocedure.rrs26.impl, - com.sap.sailing.domain.racelog.tracking, - com.sap.sailing.domain.racelog.tracking.analyzing.impl, - com.sap.sailing.domain.racelog.tracking.events, - com.sap.sailing.domain.racelog.tracking.impl, com.sap.sailing.domain.tracking, com.sap.sailing.domain.tracking.impl, com.sap.sailing.util.impl diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/AbstractLog.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/AbstractLog.java new file mode 100644 index 00000000000..3877094188f --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/AbstractLog.java @@ -0,0 +1,131 @@ +package com.sap.sailing.domain.abstractlog; + +import java.io.Serializable; +import java.util.HashSet; +import java.util.NavigableSet; +import java.util.UUID; + +import com.sap.sailing.domain.common.abstractlog.NotRevokableException; +import com.sap.sailing.domain.tracking.Track; +import com.sap.sse.common.TimePoint; +import com.sap.sse.common.WithID; + +/** + * Special kind of {@link Track} for recording {@link AbstractLogEvent}s. + * + *

+ * Keeps track of the {@link AbstractLogEvent}'s pass and returns only the events of the current pass on + * {@link #getFixes()}. Use {@link #getRawFixes()} to receive all events in a {@link AbstractLog}. + *

+ * + * The visitor pattern presents a problem in combination with the generic event type: such events + * that + * + * @param Event visitor type - must be able to visit all events of type {@link EventT} + * @param Event type + */ +public interface AbstractLog, VisitorT> +extends Track, WithID { + + /** + * Adds a {@link AbstractLogEvent} to the AbstractLog. + * + * @param event + * {@link AbstractLogEvent} to be added. + * @return true if the element was added, false otherwise. + */ + boolean add(EventT event); + + /** + * Add a {@link VisitorT} as a listener for additions. + */ + void addListener(VisitorT listener); + + /** + * Remove a listener. + */ + void removeListener(VisitorT listener); + + /** + * Removes all listeners + * @return + */ + HashSet removeAllListeners(); + + /** + * Checks if the log is empty. + */ + boolean isEmpty(); + + Iterable getRawFixesDescending(); + + Iterable getFixesDescending(); + + void addAllListeners(HashSet listeners); + + Iterable getAllListeners(); + + /** + * Adds an event to this log and returns {@link #getEventsToDeliver(UUID)} + * (excluding the new event) + */ + Iterable add(EventT event, UUID clientId); + + /** + * Returns a superset of all log events that were added to this log but not yet returned to + * the client with ID clientId by this method. In general, the list returned is not a true + * superset but equals exactly those events not yet delivered to the client. However, if the server + * was re-started since the client last called this method, and since the underlying data structures + * are not durably stored, the entire set of all log events would be delivered to the client once. + */ + Iterable getEventsToDeliver(UUID clientId); + + /** + * Returns all {@link #getRawFixes() raw fixes} and marks them as delivered to the client identified by clientId + * so that when that ID appears in a subsequent call to {@link #add(AbstractLogEvent, UUID)}, the fixes returned by this call + * are already considered delivered to the client identified by clientId. + */ + Iterable getRawFixes(UUID clientId); + + /** + * Like {@link #add(AbstractLogEvent)}, only that no events are triggered. Use this method only when loading a log, + * e.g., from a replication or master data import or when loading from the database. + * + * @return true if the event was actually added which is the case if there was no equal event contained + * in this log yet + */ + boolean load(EventT event); + + /** + * Search for the event by its {@link AbstractLogEvent#getId() id}. + * Caller needs to hold the read lock. + */ + EventT getEventById(Serializable id); + + /** + * Get a {@link NavigableSet} of unrevoked events regardless of the {@code pass}. Events are sorted by + * their {@link TimePoint} and the oldest is returned first. + * @return + */ + NavigableSet getUnrevokedEvents(); + + /** + * Get a {@link NavigableSet} of unrevoked events regardless of the {@code pass}. + * @return + */ + NavigableSet getUnrevokedEventsDescending(); + + /** + * Merges all events from the other log into this. + */ + void merge(AbstractLog other); + + /** + * Inserts a {@link RevokeEvent} for {@code toRevoke}, if latter is revokable, exists in the racelog + * and has not yet been revoked. + * + * @param author The author for the {@code RevokeEvent}. + */ + void revokeEvent(AbstractLogEventAuthor author, EventT toRevoke, String reason) throws NotRevokableException; + void revokeEvent(AbstractLogEventAuthor author, EventT toRevoke) throws NotRevokableException; +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/AbstractLogAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/AbstractLogAnalyzer.java new file mode 100644 index 00000000000..2174f3e53f9 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/AbstractLogAnalyzer.java @@ -0,0 +1,41 @@ +package com.sap.sailing.domain.abstractlog; + + +/** + * Analyzer to perform a query over a given AbstractLog. Each subclass defines its ResultType. + * + * @param + * type of analysis result. + */ +public abstract class AbstractLogAnalyzer, +EventT extends AbstractLogEvent, VisitorT, ResultType> { + + protected LogT log; + + public AbstractLogAnalyzer(LogT log) { + this.log = log; + } + + public LogT getLog() { + return log; + } + + public ResultType analyze() { + log.lockForRead(); + try { + return performAnalysis(); + } finally { + log.unlockAfterRead(); + } + } + + protected abstract ResultType performAnalysis(); + + protected Iterable getAllEvents() { + return log.getRawFixes(); + } + + protected Iterable getAllEventsDescending() { + return log.getRawFixesDescending(); + } +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/AbstractLogEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/AbstractLogEvent.java new file mode 100644 index 00000000000..412b6307ac1 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/AbstractLogEvent.java @@ -0,0 +1,81 @@ +package com.sap.sailing.domain.abstractlog; + +import java.io.Serializable; + +import com.sap.sailing.domain.base.Timed; +import com.sap.sse.common.TimePoint; +import com.sap.sse.common.WithID; + +/** + *

+ * A {@link AbstractLogEvent} is an entry in an AbstractLog. + *

+ * + *

+ * Such an entry may influence the state of a race (scheduled, started, finished, ...), contain information about the + * current displayed flags (AP, N, X, P, etc.) of a race or indicate some other change regarding the race. See + * subclasses of {@link AbstractLogEvent} for a full list of possibilities. + *

+ * + *

+ * A {@link AbstractLogEvent} may be associated to a certain pass. For a race a new pass is initiated whenever a new + * start time is proposed (e.g. after the race was aborted). Currently the pass is only used by the RaceLog + * implementation. It should be refactored out of AbstractLog to a later point in time. + *

+ * + *

+ * Each {@link AbstractLogEvent} carries two timestamps. + * + * The timestamp received with {@link AbstractLogEvent#getCreatedAt()} denotes the point in time the event was created. + * + * The timestamp received with {@link AbstractLogEvent#getLogicalTimePoint()} denotes the logical point in time the + * event has occurred (sometimes called 'event time'). This timestamp might be different from + * {@link AbstractLogEvent#getCreatedAt()}. For example setting the start time of race to a point in time in the past, + * results in a {@link AbstractLogEvent} returning "now" on {@link AbstractLogEvent#getCreatedAt()} and such a point in + * time that a complete startphase could have occured on {@link AbstractLogEvent#getTimePoint()}. + * + * To ensure an ordering there should be no two {@link AbstractLogEvent}s returning the same point in time on + * {@link AbstractLogEvent#getCreatedAt()} per pass. + * + * The {@link AbstractLogEvent}'s {@link Timed} interface redirects to {@link AbstractLogEvent#getCreatedAt()} (was + * {@link AbstractLogEvent#getLogicalTimePoint()}!). + *

+ * + *

+ * AbstractLog events have an author that has a name and a priority assigned. This can be used to represent multiple + * concurrent authors such as a device used on a starting vessel, another device used at the finish line and + * yet another device used on shore. In case more than one device make a statement about something, such as the start + * time or the start procedure, the statement from the device with the highest priority needs to take precedence. + *

+ */ +public interface AbstractLogEvent extends Timed, WithID, Serializable { + + /** + * Gets the {@link TimePoint} this event was created at. + */ + TimePoint getCreatedAt(); + + /** + * Gets the event's logical timestamp. + * + * @return + */ + TimePoint getLogicalTimePoint(); + + /** + * Visitor pattern to implement certain {@link AbstractLogEvent} subclass specific behavior. + */ + void accept(VisitorT visitor); + + /** + * Gets the {@link AbstractLogEventAuthor} author of this event. + */ + AbstractLogEventAuthor getAuthor(); + + /** + * Gets a short info about the most relevant data of the event. + * + * @return + */ + String getShortInfo(); +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventAuthor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/AbstractLogEventAuthor.java old mode 100755 new mode 100644 similarity index 75% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventAuthor.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/AbstractLogEventAuthor.java index 07f9cda357e..0e54f84218b --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventAuthor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/AbstractLogEventAuthor.java @@ -1,9 +1,9 @@ -package com.sap.sailing.domain.racelog; +package com.sap.sailing.domain.abstractlog; import com.sap.sse.common.Named; /** - * Multiple devices may concurrently post to a single {@link RaceLog}. In this case it is important to understand + * Multiple devices may concurrently post to a single {@link AbstractLog}. In this case it is important to understand * who posted what. The "who" is described by instances of this class. In particular, an author has a name and a * priority which is then used to arbitrate between different posts on the same subject, such as a race's start time * or transitions from one race phase to another. @@ -11,7 +11,7 @@ import com.sap.sse.common.Named; * @author Axel Uhl (d043530) * */ -public interface RaceLogEventAuthor extends Named, Comparable { +public interface AbstractLogEventAuthor extends Named, Comparable { public static final int PRIORITY_COMPATIBILITY = 16; public static final String NAME_COMPATIBILITY = "Compatibility"; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/Revokable.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/Revokable.java similarity index 82% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/Revokable.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/Revokable.java index e9671fb7abf..77f5c400bf6 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/Revokable.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/Revokable.java @@ -1,4 +1,7 @@ -package com.sap.sailing.domain.racelog; +package com.sap.sailing.domain.abstractlog; + +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; /** diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RevokeEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/RevokeEvent.java similarity index 76% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RevokeEvent.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/RevokeEvent.java index b15624063fb..dacb6a23f96 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RevokeEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/RevokeEvent.java @@ -1,7 +1,9 @@ -package com.sap.sailing.domain.racelog; +package com.sap.sailing.domain.abstractlog; import java.io.Serializable; +import com.sap.sailing.domain.abstractlog.race.RaceLog; + /** * Revokes the event referenced by {@link #getRevokedEventId()}. * A {@link RevokeEvent} cannot itself be revoked. Instead, e.g. the original event should be resubmitted. @@ -9,7 +11,7 @@ import java.io.Serializable; * @see Revokable * */ -public interface RevokeEvent extends RaceLogEvent { +public interface RevokeEvent extends AbstractLogEvent { Serializable getRevokedEventId(); /** diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogEventComparator.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogEventComparator.java new file mode 100644 index 00000000000..c08bf09c3ac --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogEventComparator.java @@ -0,0 +1,51 @@ +package com.sap.sailing.domain.abstractlog.impl; + +import java.io.Serializable; +import java.util.Comparator; + +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.base.Timed; +import com.sap.sailing.domain.tracking.impl.TimedComparator; + +/** + * Comparator sorting by pass, then by {@link AbstractLogEventAuthor}, then by {@link RaceLogEvent#getCreatedAt()} + * timestamp. + * + * If one of the passed objects is not a {@link RaceLogEvent}, sorting is done by {@link Timed#getTimePoint()}. + */ +public class AbstractLogEventComparator implements Comparator, Serializable { + private static final long serialVersionUID = -1337219742246147546L; + private Comparator timedComparator; + + public AbstractLogEventComparator() { + this.timedComparator = TimedComparator.INSTANCE; + } + + @Override + public int compare(Timed o1, Timed o2) { + if (o1 instanceof RaceLogEvent && o2 instanceof RaceLogEvent) { + return compareEvents((RaceLogEvent) o1, (RaceLogEvent) o2); + } + + // fallback to timed comparison + return timedComparator.compare(o1, o2); + } + + protected int compareEvents(RaceLogEvent e1, RaceLogEvent e2) { + //compare author priorities + int result = e1.getAuthor().compareTo(e2.getAuthor()); + if (result != 0) return result; + + //compare created at timepoints + result = e1.getCreatedAt().compareTo(e2.getCreatedAt()); + if (result != 0) return result; + + //compare logical timepoints + result = e1.getLogicalTimePoint().compareTo(e2.getLogicalTimePoint()); + if (result != 0) return result; + + //compare ids + return e1.getId().toString().compareTo(e2.getId().toString()); + } +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogEventImpl.java new file mode 100644 index 00000000000..d6e50866d1c --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogEventImpl.java @@ -0,0 +1,64 @@ +package com.sap.sailing.domain.abstractlog.impl; + +import java.io.Serializable; + +import com.sap.sailing.domain.abstractlog.AbstractLogEvent; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sse.common.TimePoint; + +public abstract class AbstractLogEventImpl implements AbstractLogEvent { + + private static final long serialVersionUID = -5810258278984777732L; + + private final TimePoint createdAt; + private final TimePoint logicalTimePoint; + private final Serializable id; + private final AbstractLogEventAuthor author; + + public AbstractLogEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, + Serializable pId) { + this.createdAt = createdAt; + this.author = author; + this.logicalTimePoint = logicalTimePoint; + this.id = pId; + } + + @Override + public TimePoint getCreatedAt() { + return createdAt; + } + + /* + * Redirects to getCreatedAt() + */ + @Override + public TimePoint getTimePoint() { + return getCreatedAt(); + } + + @Override + public TimePoint getLogicalTimePoint() { + return logicalTimePoint; + } + + @Override + public Serializable getId() { + return id; + } + + @Override + public AbstractLogEventAuthor getAuthor() { + return author; + } + + @Override + public String toString() { + return getClass().getName() + ": createdAt: " + getCreatedAt() + ", logicalTimePoint: " + getLogicalTimePoint() + + ", id: " + getId() + ", author: "+ getAuthor(); + } + + @Override + public String getShortInfo() { + return ""; + } +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogImpl.java similarity index 55% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogImpl.java index 3e4c05f8b25..c4c587c3263 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogImpl.java @@ -1,8 +1,9 @@ -package com.sap.sailing.domain.racelog.impl; +package com.sap.sailing.domain.abstractlog.impl; import java.io.IOException; import java.io.ObjectInputStream; import java.io.Serializable; +import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -14,27 +15,23 @@ import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; +import com.sap.sailing.domain.abstractlog.AbstractLog; +import com.sap.sailing.domain.abstractlog.AbstractLogEvent; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.Revokable; +import com.sap.sailing.domain.abstractlog.RevokeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventComparator; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogImpl; import com.sap.sailing.domain.base.Timed; -import com.sap.sailing.domain.common.racelog.tracking.NotRevokableException; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventFactory; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; -import com.sap.sailing.domain.racelog.Revokable; -import com.sap.sailing.domain.racelog.RevokeEvent; +import com.sap.sailing.domain.common.abstractlog.NotRevokableException; import com.sap.sailing.domain.tracking.Track; import com.sap.sailing.domain.tracking.impl.PartialNavigableSetView; import com.sap.sailing.domain.tracking.impl.TrackImpl; import com.sap.sailing.util.impl.ArrayListNavigableSet; -import com.sap.sse.common.impl.MillisecondsTimePoint; /** - * {@link Track} implementation for {@link RaceLogEvent}s. - * - *

- * "Fix" validity is decided based on the {@link #getCurrentPassId() current pass}. The validity is not cached. - *

+ * {@link Track} implementation for {@link AbstractLogEvent}s. * *

* {@link TrackImpl#getDummyFix(com.sap.sailing.domain.common.TimePoint)} is not overridden, see @@ -43,28 +40,28 @@ import com.sap.sse.common.impl.MillisecondsTimePoint; *

* */ -public class RaceLogImpl extends TrackImpl implements RaceLog { +public abstract class AbstractLogImpl, VisitorT> +extends TrackImpl implements AbstractLog { private static final long serialVersionUID = -176745401321893502L; - private static final String DefaultLockName = RaceLogImpl.class.getName() + ".lock"; - private final static Logger logger = Logger.getLogger(RaceLogImpl.class.getName()); + private static final String DefaultLockName = AbstractLogImpl.class.getName() + ".lock"; + private final static Logger logger = Logger.getLogger(AbstractLogImpl.class.getName()); private Set revokedEventIds = new HashSet(); /** * Clients can use the {@link #add(RaceLogEvent, UUID)} method */ - private transient Map> eventsDeliveredToClient = new HashMap>(); + private transient Map> eventsDeliveredToClient = new HashMap>(); - private Map eventsById = new HashMap(); + private Map eventsById = new HashMap(); private final Serializable id; - private transient Set listeners; - private int currentPassId; + private transient Set listeners; /** * Initializes a new {@link RaceLogImpl} with the default lock name. */ - public RaceLogImpl(Serializable identifier) { - this(DefaultLockName, identifier); + public AbstractLogImpl(Serializable identifier, Comparator comparator) { + this(DefaultLockName, identifier, comparator); } /** @@ -73,11 +70,10 @@ public class RaceLogImpl extends TrackImpl implements RaceLog { * @param nameForReadWriteLock * name of lock. */ - public RaceLogImpl(String nameForReadWriteLock, Serializable identifier) { - super(new ArrayListNavigableSet(RaceLogEventComparator.INSTANCE), nameForReadWriteLock); + public AbstractLogImpl(String nameForReadWriteLock, Serializable identifier, Comparator comparator) { + super(new ArrayListNavigableSet(comparator), nameForReadWriteLock); - this.listeners = new HashSet(); - this.currentPassId = DefaultPassId; + this.listeners = new HashSet(); this.id = identifier; } @@ -85,27 +81,16 @@ public class RaceLogImpl extends TrackImpl implements RaceLog { public Serializable getId() { return this.id; } - - @Override - public int getCurrentPassId() { - return currentPassId; - } - - /** - * Sets a new active pass id. Ignored if new and current are equal. - * - * @param newPassId - * to be set. - */ - public void setCurrentPassId(int newPassId) { - if (newPassId != this.currentPassId) { - logger.finer(String.format("Changing pass id to %d", newPassId)); - this.currentPassId = newPassId; + + protected void onSuccessfulAdd(EventT event, boolean notifyListeners) { + revokeIfNecessary(event); + eventsById.put(event.getId(), event); + if (notifyListeners) { + notifyListenersAboutReceive(event); } } - @Override - public boolean add(RaceLogEvent event) { + protected boolean add(EventT event, boolean notifyListeners) { boolean isAdded = false; lockForWrite(); try { @@ -115,42 +100,26 @@ public class RaceLogImpl extends TrackImpl implements RaceLog { } if (isAdded) { logger.finer(String.format("%s (%s) was added to log %s.", event, event.getClass().getName(), getId())); - // FIXME with out-of-order delivery would destroy currentPassId; need to check at least the createdAt time - // point - setCurrentPassId(Math.max(event.getPassId(), this.currentPassId)); - revokeIfNecessary(event); - eventsById.put(event.getId(), event); - notifyListenersAboutReceive(event); + onSuccessfulAdd(event, true); } else { logger.fine(String.format("%s (%s) was not added to race log %s because it already existed there.", event, event.getClass().getName(), getId())); } return isAdded; } + + @Override + public boolean add(EventT event) { + return add(event, true); + } @Override - public boolean load(RaceLogEvent event) { - boolean isAdded = false; - lockForWrite(); - try { - isAdded = getInternalRawFixes().add(event); - } finally { - unlockAfterWrite(); - } - if (isAdded) { - logger.finer(String.format("%s (%s) was loaded into log.", event, event.getClass().getName())); - setCurrentPassId(Math.max(event.getPassId(), this.currentPassId)); - revokeIfNecessary(event); - eventsById.put(event.getId(), event); - } else { - logger.finer(String - .format("%s (%s) was not loaded into log because it already existed there.", event, event.getClass().getName())); - } - return isAdded; + public boolean load(EventT event) { + return add(event, false); } - private void revokeIfNecessary(RaceLogEvent newEvent) { + private void revokeIfNecessary(EventT newEvent) { if (newEvent instanceof RevokeEvent) { - RevokeEvent revokeEvent = (RevokeEvent) newEvent; + RevokeEvent revokeEvent = (RevokeEvent) newEvent; try { checkIfSuccessfullyRevokes(revokeEvent); lockForWrite(); @@ -162,9 +131,9 @@ public class RaceLogImpl extends TrackImpl implements RaceLog { } } - private void checkIfSuccessfullyRevokes(RevokeEvent revokeEvent) throws NotRevokableException { + private void checkIfSuccessfullyRevokes(RevokeEvent revokeEvent) throws NotRevokableException { lockForRead(); - RaceLogEvent revokedEvent = getEventById(revokeEvent.getRevokedEventId()); + EventT revokedEvent = getEventById(revokeEvent.getRevokedEventId()); unlockAfterRead(); if (revokedEvent == null) { @@ -186,30 +155,30 @@ public class RaceLogImpl extends TrackImpl implements RaceLog { } @Override - public Iterable add(RaceLogEvent event, UUID clientId) { + public Iterable add(EventT event, UUID clientId) { add(event); return getEventsToDeliver(clientId, event); } @Override - public Iterable getEventsToDeliver(UUID clientId) { + public Iterable getEventsToDeliver(UUID clientId) { return getEventsToDeliver(clientId, null); } - protected Iterable getEventsToDeliver(UUID clientId, RaceLogEvent suppressedEvent) { - final LinkedHashSet stillToDeliverToClient; + protected Iterable getEventsToDeliver(UUID clientId, EventT suppressedEvent) { + final LinkedHashSet stillToDeliverToClient; lockForRead(); try { - stillToDeliverToClient = new LinkedHashSet(getInternalRawFixes()); + stillToDeliverToClient = new LinkedHashSet(getInternalRawFixes()); } finally { unlockAfterRead(); } stillToDeliverToClient.remove(suppressedEvent); - Set deliveredToClient = eventsDeliveredToClient.get(clientId); + Set deliveredToClient = eventsDeliveredToClient.get(clientId); if (deliveredToClient != null) { stillToDeliverToClient.removeAll(deliveredToClient); } else { - deliveredToClient = new HashSet(); + deliveredToClient = new HashSet(); eventsDeliveredToClient.put(clientId, deliveredToClient); } deliveredToClient.addAll(stillToDeliverToClient); @@ -217,12 +186,12 @@ public class RaceLogImpl extends TrackImpl implements RaceLog { return stillToDeliverToClient; } - protected void notifyListenersAboutReceive(RaceLogEvent event) { - Set workingListeners = new HashSet(); + protected void notifyListenersAboutReceive(EventT event) { + Set workingListeners = new HashSet(); synchronized (listeners) { workingListeners.addAll(listeners); } - for (RaceLogEventVisitor listener : workingListeners) { + for (VisitorT listener : workingListeners) { try { event.accept(listener); } catch (Throwable t) { @@ -239,29 +208,19 @@ public class RaceLogImpl extends TrackImpl implements RaceLog { } @Override - public void addListener(RaceLogEventVisitor listener) { + public void addListener(VisitorT listener) { synchronized (listeners) { listeners.add(listener); } } @Override - public void removeListener(RaceLogEventVisitor listener) { + public void removeListener(VisitorT listener) { synchronized (listeners) { listeners.remove(listener); } } - @Override - protected NavigableSet getInternalFixes() { - return new PartialNavigableSetView(super.getInternalFixes()) { - @Override - protected boolean isValid(RaceLogEvent e) { - return e.getPassId() == getCurrentPassId(); - } - }; - } - /** * When deserializing, needs to initialize empty set of listeners. Furthermore, as a migration effort, when the * {@link #eventsById} field was introduced, old clients get null as its value when deserializing which @@ -270,13 +229,13 @@ public class RaceLogImpl extends TrackImpl implements RaceLog { */ private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { ois.defaultReadObject(); - listeners = new HashSet(); - eventsDeliveredToClient = new HashMap>(); + listeners = new HashSet(); + eventsDeliveredToClient = new HashMap>(); if (eventsById == null) { - eventsById = new HashMap(); + eventsById = new HashMap(); lockForRead(); try { - for (RaceLogEvent event : getRawFixes()) { + for (EventT event : getRawFixes()) { eventsById.put(event.getId(), event); } } finally { @@ -287,9 +246,9 @@ public class RaceLogImpl extends TrackImpl implements RaceLog { revokedEventIds = new HashSet(); lockForRead(); try { - for (RaceLogEvent event : getRawFixes()) { + for (EventT event : getRawFixes()) { if (event instanceof RevokeEvent) { - revokedEventIds.add(((RevokeEvent)event).getRevokedEventId()); + revokedEventIds.add(((RevokeEvent)event).getRevokedEventId()); } } } finally { @@ -299,43 +258,43 @@ public class RaceLogImpl extends TrackImpl implements RaceLog { } @Override - public Iterable getRawFixesDescending() { + public Iterable getRawFixesDescending() { return getRawFixes().descendingSet(); } @Override - public Iterable getFixesDescending() { + public Iterable getFixesDescending() { return getFixes().descendingSet(); } @Override - public HashSet removeAllListeners() { + public HashSet removeAllListeners() { synchronized (listeners) { - HashSet clonedListeners = new HashSet(listeners); - listeners = new HashSet(); + HashSet clonedListeners = new HashSet(listeners); + listeners = new HashSet(); return clonedListeners; } } @Override - public void addAllListeners(HashSet listeners) { + public void addAllListeners(HashSet listeners) { synchronized (listeners) { this.listeners.addAll(listeners); } } @Override - public Iterable getAllListeners() { + public Iterable getAllListeners() { return this.listeners; } @Override - public Iterable getRawFixes(UUID clientId) { + public Iterable getRawFixes(UUID clientId) { assertReadLock(); - NavigableSet result = getRawFixes(); - Set edtc = eventsDeliveredToClient.get(clientId); + NavigableSet result = getRawFixes(); + Set edtc = eventsDeliveredToClient.get(clientId); if (edtc == null) { - edtc = new HashSet(); + edtc = new HashSet(); eventsDeliveredToClient.put(clientId, edtc); } edtc.addAll(result); @@ -343,41 +302,41 @@ public class RaceLogImpl extends TrackImpl implements RaceLog { } @Override - public RaceLogEvent getEventById(Serializable id) { + public EventT getEventById(Serializable id) { assertReadLock(); return eventsById.get(id); } @Override - public NavigableSet getUnrevokedEvents() { - return new PartialNavigableSetView(super.getInternalFixes()) { + public NavigableSet getUnrevokedEvents() { + return new PartialNavigableSetView(super.getInternalFixes()) { @Override - protected boolean isValid(RaceLogEvent e) { + protected boolean isValid(EventT e) { return ! (e instanceof RevokeEvent) && ! revokedEventIds.contains(e.getId()); } }; } @Override - public NavigableSet getUnrevokedEventsDescending() { - return new PartialNavigableSetView(super.getInternalFixes().descendingSet()) { + public NavigableSet getUnrevokedEventsDescending() { + return new PartialNavigableSetView(super.getInternalFixes().descendingSet()) { @Override - protected boolean isValid(RaceLogEvent e) { + protected boolean isValid(EventT e) { return ! (e instanceof RevokeEvent) && ! revokedEventIds.contains(e.getId()); } }; } @Override - public void merge(RaceLog other) { + public void merge(AbstractLog other) { lockForWrite(); other.lockForRead(); try { - RaceLogEventComparator comparator = RaceLogEventComparator.INSTANCE; - Iterator thisIter = getRawFixes().iterator(); - Iterator otherIter = other.getRawFixes().iterator(); - RaceLogEvent thisEvent = null; - RaceLogEvent otherEvent = null; + RaceLogEventComparator comparator = new RaceLogEventComparator(); + Iterator thisIter = getRawFixes().iterator(); + Iterator otherIter = other.getRawFixes().iterator(); + EventT thisEvent = null; + EventT otherEvent = null; while (otherIter.hasNext() || otherEvent != null) { if (thisEvent == null && thisIter.hasNext()) { thisEvent = thisIter.next(); @@ -413,20 +372,19 @@ public class RaceLogImpl extends TrackImpl implements RaceLog { } @Override - public RevokeEvent revokeEvent(RaceLogEventAuthor author, RaceLogEvent toRevoke) throws NotRevokableException { - return revokeEvent(author, toRevoke, null); + public void revokeEvent(AbstractLogEventAuthor author, EventT toRevoke) throws NotRevokableException { + revokeEvent(author, toRevoke, null); } + protected abstract EventT createRevokeEvent(AbstractLogEventAuthor author, EventT toRevoke, String reason); + @Override - public RevokeEvent revokeEvent(RaceLogEventAuthor author, RaceLogEvent toRevoke, String reason) throws NotRevokableException { + public void revokeEvent(AbstractLogEventAuthor author, EventT toRevoke, String reason) throws NotRevokableException { if (toRevoke == null) { throw new NotRevokableException("Received null as event to revoke"); } - RevokeEvent revokeEvent = RaceLogEventFactory.INSTANCE.createRevokeEvent( - MillisecondsTimePoint.now(), author, getCurrentPassId(), toRevoke.getId(), - toRevoke.getClass().getSimpleName(), toRevoke.getShortInfo(), reason); - checkIfSuccessfullyRevokes(revokeEvent); + EventT revokeEvent = createRevokeEvent(author, toRevoke, reason); + checkIfSuccessfullyRevokes((RevokeEvent) revokeEvent); add(revokeEvent); - return revokeEvent; } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventAuthorImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/LogEventAuthorImpl.java similarity index 59% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventAuthorImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/LogEventAuthorImpl.java index b60091116c3..c8479d1f34b 100755 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventAuthorImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/LogEventAuthorImpl.java @@ -1,17 +1,17 @@ -package com.sap.sailing.domain.racelog.impl; +package com.sap.sailing.domain.abstractlog.impl; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sse.common.impl.NamedImpl; -public class RaceLogEventAuthorImpl extends NamedImpl implements RaceLogEventAuthor { +public class LogEventAuthorImpl extends NamedImpl implements AbstractLogEventAuthor { private static final long serialVersionUID = -5602802911563685812L; private final int priority; - public static RaceLogEventAuthor createCompatibilityAuthor() { - return new RaceLogEventAuthorImpl(NAME_COMPATIBILITY, PRIORITY_COMPATIBILITY); + public static AbstractLogEventAuthor createCompatibilityAuthor() { + return new LogEventAuthorImpl(NAME_COMPATIBILITY, PRIORITY_COMPATIBILITY); } - public RaceLogEventAuthorImpl(String name, int priority) { + public LogEventAuthorImpl(String name, int priority) { super(name); this.priority = priority; } @@ -22,7 +22,7 @@ public class RaceLogEventAuthorImpl extends NamedImpl implements RaceLogEventAut } @Override - public int compareTo(RaceLogEventAuthor other) { + public int compareTo(AbstractLogEventAuthor other) { /** as '0' has a higher priority than '1' the compare method ranks a '0' priority higher than a '1' priority */ Integer result = new Integer(getPriority()).compareTo(other.getPriority()); return -result; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/events/RevokeEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/RevokeEventImpl.java similarity index 57% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/events/RevokeEventImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/RevokeEventImpl.java index 79452f6226d..d4e44c5f421 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/events/RevokeEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/RevokeEventImpl.java @@ -1,16 +1,12 @@ -package com.sap.sailing.domain.racelog.tracking.events; +package com.sap.sailing.domain.abstractlog.impl; import java.io.Serializable; -import java.util.Collections; -import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; -import com.sap.sailing.domain.racelog.RevokeEvent; -import com.sap.sailing.domain.racelog.impl.RaceLogEventImpl; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.RevokeEvent; import com.sap.sse.common.TimePoint; -public class RevokeEventImpl extends RaceLogEventImpl implements RevokeEvent { +public abstract class RevokeEventImpl extends AbstractLogEventImpl implements RevokeEvent { private static final long serialVersionUID = -30864810737555657L; private final Serializable revokedEventId; @@ -18,21 +14,16 @@ public class RevokeEventImpl extends RaceLogEventImpl implements RevokeEvent { private final String revokedEventType; private final String revokedEventShortInfo; - public RevokeEventImpl(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, - Serializable pId, int pPassId, Serializable revokedEventId, String revokedEventType, + public RevokeEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, + Serializable pId, Serializable revokedEventId, String revokedEventType, String revokedEventShortInfo, String reason) { - super(createdAt, author, logicalTimePoint, pId, Collections.emptyList(), pPassId); + super(createdAt, author, logicalTimePoint, pId); this.revokedEventId = revokedEventId; this.reason = reason; this.revokedEventType = revokedEventType; this.revokedEventShortInfo = revokedEventShortInfo; } - @Override - public void accept(RaceLogEventVisitor visitor) { - visitor.visit(this); - } - @Override public Serializable getRevokedEventId() { return revokedEventId; @@ -61,5 +52,5 @@ public class RevokeEventImpl extends RaceLogEventImpl implements RevokeEvent { @Override public String getReason() { return reason; - } + } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/CompetitorResults.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/CompetitorResults.java similarity index 83% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/CompetitorResults.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/CompetitorResults.java index 31d63a75e82..624672b9710 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/CompetitorResults.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/CompetitorResults.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog; +package com.sap.sailing.domain.abstractlog.race; import java.io.Serializable; import java.util.List; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/InvalidatesLeaderboardCache.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/InvalidatesLeaderboardCache.java similarity index 84% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/InvalidatesLeaderboardCache.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/InvalidatesLeaderboardCache.java index 5282ce66d41..c9315446304 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/InvalidatesLeaderboardCache.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/InvalidatesLeaderboardCache.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog; +package com.sap.sailing.domain.abstractlog.race; /** * Marker interface that all classes implementing {@link RaceLogEvent} should diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLog.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLog.java new file mode 100644 index 00000000000..84199147b1f --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLog.java @@ -0,0 +1,18 @@ +package com.sap.sailing.domain.abstractlog.race; + +import com.sap.sailing.domain.abstractlog.AbstractLog; +import com.sap.sse.common.WithID; + +/** +* "Fix" validity is decided based on the {@link #getCurrentPassId() current pass}. The validity is not cached. +*/ +public interface RaceLog extends AbstractLog, WithID { + public static final int DefaultPassId = 0; + + /** + * Gets the current pass id. + * + * @return the pass id. + */ + int getCurrentPassId(); +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogChangedListener.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogChangedListener.java similarity index 78% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogChangedListener.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogChangedListener.java index 2fd55f1271c..741d05ee87d 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogChangedListener.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogChangedListener.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog; +package com.sap.sailing.domain.abstractlog.race; public interface RaceLogChangedListener { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogCourseAreaChangedEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogCourseAreaChangedEvent.java similarity index 70% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogCourseAreaChangedEvent.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogCourseAreaChangedEvent.java index 4dc1a1f0749..a4c30b8f705 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogCourseAreaChangedEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogCourseAreaChangedEvent.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog; +package com.sap.sailing.domain.abstractlog.race; import java.io.Serializable; 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/abstractlog/race/RaceLogCourseDesignChangedEvent.java similarity index 73% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogCourseDesignChangedEvent.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogCourseDesignChangedEvent.java index c15383bb7b6..97592723862 100644 --- 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/abstractlog/race/RaceLogCourseDesignChangedEvent.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog; +package com.sap.sailing.domain.abstractlog.race; import com.sap.sailing.domain.base.CourseBase; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEvent.java new file mode 100644 index 00000000000..9319be74b8e --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEvent.java @@ -0,0 +1,27 @@ +package com.sap.sailing.domain.abstractlog.race; + +import java.util.List; + +import com.sap.sailing.domain.abstractlog.AbstractLogEvent; +import com.sap.sailing.domain.base.Competitor; + +public interface RaceLogEvent extends AbstractLogEvent { + + /** + * Gets the event's pass identifier. + * + * Each {@link RaceLogEvent} is associated to a certain pass. A pass is every attempt to start and run a race. A + * new pass is initiated when a new start time is proposed (e.g. after the race was aborted). There might be certain + * event type that are not strictly bound to its pass. + * + */ + int getPassId(); + + /** + * Gets the list of associated {@link Competitor}s. + * + * A {@link RaceLogEvent} might be associated with a list of competitors, which are somehow relevant for this + * kind of event. An example is a list of competitors who are marked for an individual recall. + */ + List getInvolvedBoats(); +} 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/abstractlog/race/RaceLogEventFactory.java similarity index 57% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventFactory.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventFactory.java index be0d5398c3c..8ebca9345cb 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/abstractlog/race/RaceLogEventFactory.java @@ -1,8 +1,20 @@ -package com.sap.sailing.domain.racelog; +package com.sap.sailing.domain.abstractlog.race; import java.io.Serializable; import java.util.List; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventFactoryImpl; +import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationEvent; +import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationType; +import com.sap.sailing.domain.abstractlog.race.tracking.CloseOpenEndedDeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DefineMarkEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DenoteForTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceCompetitorMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMarkMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.RegisterCompetitorEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.StartTrackingEvent; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseBase; @@ -10,117 +22,105 @@ import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.domain.common.racelog.RacingProcedureType; -import com.sap.sailing.domain.racelog.impl.RaceLogEventFactoryImpl; -import com.sap.sailing.domain.racelog.scoring.AdditionalScoringInformationEvent; -import com.sap.sailing.domain.racelog.scoring.AdditionalScoringInformationType; -import com.sap.sailing.domain.racelog.tracking.CloseOpenEndedDeviceMappingEvent; -import com.sap.sailing.domain.racelog.tracking.DefineMarkEvent; -import com.sap.sailing.domain.racelog.tracking.DenoteForTrackingEvent; -import com.sap.sailing.domain.racelog.tracking.DeviceCompetitorMappingEvent; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; -import com.sap.sailing.domain.racelog.tracking.DeviceMarkMappingEvent; -import com.sap.sailing.domain.racelog.tracking.RegisterCompetitorEvent; -import com.sap.sailing.domain.racelog.tracking.StartTrackingEvent; import com.sap.sailing.domain.tracking.Wind; import com.sap.sse.common.TimePoint; public interface RaceLogEventFactory { RaceLogEventFactory INSTANCE = new RaceLogEventFactoryImpl(); - RaceLogFlagEvent createFlagEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, Serializable id, List involvedBoats, + RaceLogFlagEvent createFlagEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, Serializable id, List involvedBoats, int passId, Flags upperFlag, Flags lowerFlag, boolean isDisplayed); - RaceLogFlagEvent createFlagEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, int passId, Flags upperFlag, + RaceLogFlagEvent createFlagEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, Flags upperFlag, Flags lowerFlag, boolean isDisplayed); - RaceLogStartTimeEvent createStartTimeEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, Serializable id, + RaceLogStartTimeEvent createStartTimeEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, Serializable id, List involvedBoats, int passId, TimePoint startTime); - RaceLogStartTimeEvent createStartTimeEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, int passId, TimePoint startTime); + RaceLogStartTimeEvent createStartTimeEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, TimePoint startTime); - RaceLogRaceStatusEvent createRaceStatusEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, Serializable id, + RaceLogRaceStatusEvent createRaceStatusEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, Serializable id, List competitors, int passId, RaceLogRaceStatus nextStatus); - RaceLogRaceStatusEvent createRaceStatusEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, int passId, RaceLogRaceStatus nextStatus); + RaceLogRaceStatusEvent createRaceStatusEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, RaceLogRaceStatus nextStatus); - RaceLogPassChangeEvent createPassChangeEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, Serializable id, + RaceLogPassChangeEvent createPassChangeEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, Serializable id, List competitors, int passId); - RaceLogPassChangeEvent createPassChangeEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, int passId); + RaceLogPassChangeEvent createPassChangeEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId); - RaceLogCourseAreaChangedEvent createCourseAreaChangedEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + RaceLogCourseAreaChangedEvent createCourseAreaChangedEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, Serializable id, List competitors, int passId, Serializable courseAreaId); - RaceLogCourseAreaChangedEvent createCourseAreaChangedEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + RaceLogCourseAreaChangedEvent createCourseAreaChangedEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, Serializable courseAreaId); - RaceLogCourseDesignChangedEvent createCourseDesignChangedEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + RaceLogCourseDesignChangedEvent createCourseDesignChangedEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, Serializable id, List competitors, int passId, CourseBase courseData); - RaceLogCourseDesignChangedEvent createCourseDesignChangedEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + RaceLogCourseDesignChangedEvent createCourseDesignChangedEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, CourseBase courseData); RaceLogFinishPositioningListChangedEvent createFinishPositioningListChangedEvent(TimePoint logicalTimePoint, - RaceLogEventAuthor author, Serializable id, List competitors, + AbstractLogEventAuthor author, Serializable id, List competitors, int passId, CompetitorResults positionedCompetitors); - RaceLogFinishPositioningListChangedEvent createFinishPositioningListChangedEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + RaceLogFinishPositioningListChangedEvent createFinishPositioningListChangedEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, CompetitorResults positionedCompetitors); - RaceLogFinishPositioningConfirmedEvent createFinishPositioningConfirmedEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + RaceLogFinishPositioningConfirmedEvent createFinishPositioningConfirmedEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, Serializable id, List competitors, int passId, CompetitorResults positionedCompetitors); - RaceLogFinishPositioningConfirmedEvent createFinishPositioningConfirmedEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + RaceLogFinishPositioningConfirmedEvent createFinishPositioningConfirmedEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, CompetitorResults positionedCompetitors); - RaceLogPathfinderEvent createPathfinderEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, Serializable id, + RaceLogPathfinderEvent createPathfinderEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, Serializable id, List competitors, int passId, String pathfinderId); - RaceLogPathfinderEvent createPathfinderEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, int passId, String pathfinderId); + RaceLogPathfinderEvent createPathfinderEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, String pathfinderId); - RaceLogGateLineOpeningTimeEvent createGateLineOpeningTimeEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + RaceLogGateLineOpeningTimeEvent createGateLineOpeningTimeEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, Serializable id, List competitors, int passId, Long gateLaunchStopTime, Long golfDownTime); - RaceLogGateLineOpeningTimeEvent createGateLineOpeningTimeEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + RaceLogGateLineOpeningTimeEvent createGateLineOpeningTimeEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, Long gateLaunchStopTime, Long golfDownTime); - RaceLogStartProcedureChangedEvent createStartProcedureChangedEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + RaceLogStartProcedureChangedEvent createStartProcedureChangedEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, Serializable id, List competitors, int passId, RacingProcedureType type); - RaceLogStartProcedureChangedEvent createStartProcedureChangedEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + RaceLogStartProcedureChangedEvent createStartProcedureChangedEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, RacingProcedureType type); - RaceLogProtestStartTimeEvent createProtestStartTimeEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + RaceLogProtestStartTimeEvent createProtestStartTimeEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, Serializable id, List competitors, int passId, TimePoint protestStartTime); - RaceLogProtestStartTimeEvent createProtestStartTimeEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, int passId, TimePoint protestStartTime); + RaceLogProtestStartTimeEvent createProtestStartTimeEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, TimePoint protestStartTime); - RaceLogWindFixEvent createWindFixEvent(TimePoint eventTime, RaceLogEventAuthor author, int currentPassId, Wind wind); + RaceLogWindFixEvent createWindFixEvent(TimePoint eventTime, AbstractLogEventAuthor author, int currentPassId, Wind wind); - RaceLogWindFixEvent createWindFixEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + RaceLogWindFixEvent createWindFixEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, Serializable id, List competitors, int passId, Wind wind); - DeviceCompetitorMappingEvent createDeviceCompetitorMappingEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + DeviceCompetitorMappingEvent createDeviceCompetitorMappingEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, DeviceIdentifier device, Competitor mappedTo, int passId, TimePoint from, TimePoint to); - DeviceMarkMappingEvent createDeviceMarkMappingEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + DeviceMarkMappingEvent createDeviceMarkMappingEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, DeviceIdentifier device, Mark mappedTo, int passId, TimePoint from, TimePoint to); - DenoteForTrackingEvent createDenoteForTrackingEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, int passId, + DenoteForTrackingEvent createDenoteForTrackingEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, String raceName, BoatClass boatClass, Serializable raceId); - StartTrackingEvent createStartTrackingEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, int passId); + StartTrackingEvent createStartTrackingEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId); - RevokeEvent createRevokeEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, int passId, Serializable revokedEventId, - String revokedEventType, String revokedEventShortInfo, String reason); + RaceLogRevokeEvent createRevokeEvent(AbstractLogEventAuthor author, int passId, RaceLogEvent toRevoke, String reason); - RegisterCompetitorEvent createRegisterCompetitorEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, int passId, Competitor competitor); + RegisterCompetitorEvent createRegisterCompetitorEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, Competitor competitor); - DefineMarkEvent createDefineMarkEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, int passId, Mark mark); + DefineMarkEvent createDefineMarkEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, Mark mark); - CloseOpenEndedDeviceMappingEvent createCloseOpenEndedDeviceMappingEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, int passId, + CloseOpenEndedDeviceMappingEvent createCloseOpenEndedDeviceMappingEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, Serializable deviceMappingEventId, TimePoint closingTimePoint); - AdditionalScoringInformationEvent createAdditionalScoringInformationEvent(TimePoint timePoint, Serializable id, RaceLogEventAuthor author, int currentPassId, + AdditionalScoringInformationEvent createAdditionalScoringInformationEvent(TimePoint timePoint, Serializable id, AbstractLogEventAuthor author, int currentPassId, AdditionalScoringInformationType informationType); } 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/abstractlog/race/RaceLogEventRestoreFactory.java similarity index 63% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventRestoreFactory.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventRestoreFactory.java index 27d1c48c1d0..70b2c2942bc 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/abstractlog/race/RaceLogEventRestoreFactory.java @@ -1,8 +1,20 @@ -package com.sap.sailing.domain.racelog; +package com.sap.sailing.domain.abstractlog.race; import java.io.Serializable; import java.util.List; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventRestoreFactoryImpl; +import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationEvent; +import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationType; +import com.sap.sailing.domain.abstractlog.race.tracking.CloseOpenEndedDeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DefineMarkEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DenoteForTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceCompetitorMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMarkMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.RegisterCompetitorEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.StartTrackingEvent; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseBase; @@ -10,91 +22,80 @@ import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.domain.common.racelog.RacingProcedureType; -import com.sap.sailing.domain.racelog.impl.RaceLogEventRestoreFactoryImpl; -import com.sap.sailing.domain.racelog.scoring.AdditionalScoringInformationEvent; -import com.sap.sailing.domain.racelog.scoring.AdditionalScoringInformationType; -import com.sap.sailing.domain.racelog.tracking.CloseOpenEndedDeviceMappingEvent; -import com.sap.sailing.domain.racelog.tracking.DefineMarkEvent; -import com.sap.sailing.domain.racelog.tracking.DenoteForTrackingEvent; -import com.sap.sailing.domain.racelog.tracking.DeviceCompetitorMappingEvent; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; -import com.sap.sailing.domain.racelog.tracking.DeviceMarkMappingEvent; -import com.sap.sailing.domain.racelog.tracking.RegisterCompetitorEvent; -import com.sap.sailing.domain.racelog.tracking.StartTrackingEvent; import com.sap.sailing.domain.tracking.Wind; import com.sap.sse.common.TimePoint; public interface RaceLogEventRestoreFactory extends RaceLogEventFactory { RaceLogEventRestoreFactory INSTANCE = new RaceLogEventRestoreFactoryImpl(); - RaceLogFlagEvent createFlagEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + RaceLogFlagEvent createFlagEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List involvedBoats, int passId, Flags upperFlag, Flags lowerFlag, boolean isDisplayed); - RaceLogStartTimeEvent createStartTimeEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + RaceLogStartTimeEvent createStartTimeEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List involvedBoats, int passId, TimePoint startTime); - RaceLogRaceStatusEvent createRaceStatusEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + RaceLogRaceStatusEvent createRaceStatusEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, int passId, RaceLogRaceStatus nextStatus); - RaceLogPassChangeEvent createPassChangeEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + RaceLogPassChangeEvent createPassChangeEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, int passId); - RaceLogCourseAreaChangedEvent createCourseAreaChangedEvent(TimePoint createdAt, RaceLogEventAuthor author, + RaceLogCourseAreaChangedEvent createCourseAreaChangedEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, int passId, Serializable courseAreaId); - RaceLogCourseDesignChangedEvent createCourseDesignChangedEvent(TimePoint createdAt, RaceLogEventAuthor author, + RaceLogCourseDesignChangedEvent createCourseDesignChangedEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, int passId, CourseBase courseData); RaceLogFinishPositioningListChangedEvent createFinishPositioningListChangedEvent(TimePoint createdAt, - RaceLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, + AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, int passId, CompetitorResults positionedCompetitors); RaceLogFinishPositioningConfirmedEvent createFinishPositioningConfirmedEvent(TimePoint createdAt, - RaceLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, + AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, int passId, CompetitorResults positionedCompetitors); - RaceLogPathfinderEvent createPathfinderEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + RaceLogPathfinderEvent createPathfinderEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, int passId, String pathfinderId); - RaceLogGateLineOpeningTimeEvent createGateLineOpeningTimeEvent(TimePoint createdAt, RaceLogEventAuthor author, + RaceLogGateLineOpeningTimeEvent createGateLineOpeningTimeEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, int passId, Long gateLaunchStopTime, Long golfDownTime); - RaceLogStartProcedureChangedEvent createStartProcedureChangedEvent(TimePoint createdAt, RaceLogEventAuthor author, + RaceLogStartProcedureChangedEvent createStartProcedureChangedEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, int passId, RacingProcedureType type); - RaceLogProtestStartTimeEvent createProtestStartTimeEvent(TimePoint createdAt, RaceLogEventAuthor author, + RaceLogProtestStartTimeEvent createProtestStartTimeEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, int passId, TimePoint protestStartTime); - RaceLogWindFixEvent createWindFixEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + RaceLogWindFixEvent createWindFixEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, Integer passId, Wind wind); - DeviceCompetitorMappingEvent createDeviceCompetitorMappingEvent(TimePoint createdAt, RaceLogEventAuthor author, + DeviceCompetitorMappingEvent createDeviceCompetitorMappingEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, DeviceIdentifier device, Competitor mappedTo, int passId, TimePoint from, TimePoint to); - DeviceMarkMappingEvent createDeviceMarkMappingEvent(TimePoint createdAt, RaceLogEventAuthor author, + DeviceMarkMappingEvent createDeviceMarkMappingEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, DeviceIdentifier device, Mark mappedTo, int passId, TimePoint from, TimePoint to); - DenoteForTrackingEvent createDenoteForTrackingEvent(TimePoint createdAt, RaceLogEventAuthor author, + DenoteForTrackingEvent createDenoteForTrackingEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, int passId, String raceName, BoatClass boatClass, Serializable raceId); - StartTrackingEvent createStartTrackingEvent(TimePoint createdAt, RaceLogEventAuthor author, + StartTrackingEvent createStartTrackingEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, int passId); - RevokeEvent createRevokeEvent(TimePoint createdAt, RaceLogEventAuthor author, + RaceLogRevokeEvent createRevokeEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, int passId, Serializable revokedEventId, String revokedEventType, String revokedEventShortInfo, String reason); - RegisterCompetitorEvent createRegisterCompetitorEvent(TimePoint createdAt, RaceLogEventAuthor author, + RegisterCompetitorEvent createRegisterCompetitorEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, int passId, Competitor competitor); - DefineMarkEvent createDefineMarkEvent(TimePoint createdAt, RaceLogEventAuthor author, + DefineMarkEvent createDefineMarkEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, int passId, Mark mark); - CloseOpenEndedDeviceMappingEvent createCloseOpenEndedDeviceMappingEvent(TimePoint createdAt, RaceLogEventAuthor author, + CloseOpenEndedDeviceMappingEvent createCloseOpenEndedDeviceMappingEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, int passId, Serializable deviceMappingEventId, TimePoint closingTimePoint); - AdditionalScoringInformationEvent createAdditionalScoringInformationEvent(TimePoint createdAt, RaceLogEventAuthor author, + AdditionalScoringInformationEvent createAdditionalScoringInformationEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, List competitors, int passId, AdditionalScoringInformationType informationType); } 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/abstractlog/race/RaceLogEventVisitor.java similarity index 62% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventVisitor.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventVisitor.java index c746af2090c..6ea42fabadc 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/abstractlog/race/RaceLogEventVisitor.java @@ -1,16 +1,18 @@ -package com.sap.sailing.domain.racelog; +package com.sap.sailing.domain.abstractlog.race; -import com.sap.sailing.domain.racelog.scoring.AdditionalScoringInformationEvent; -import com.sap.sailing.domain.racelog.tracking.CloseOpenEndedDeviceMappingEvent; -import com.sap.sailing.domain.racelog.tracking.DefineMarkEvent; -import com.sap.sailing.domain.racelog.tracking.DenoteForTrackingEvent; -import com.sap.sailing.domain.racelog.tracking.DeviceCompetitorMappingEvent; -import com.sap.sailing.domain.racelog.tracking.DeviceMarkMappingEvent; -import com.sap.sailing.domain.racelog.tracking.RegisterCompetitorEvent; -import com.sap.sailing.domain.racelog.tracking.StartTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.CloseOpenEndedDeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DefineMarkEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DenoteForTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceCompetitorMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMarkMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.RegisterCompetitorEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.StartTrackingEvent; public interface RaceLogEventVisitor { + public void visit(RaceLogRevokeEvent event); + public void visit(RaceLogFlagEvent event); public void visit(RaceLogPassChangeEvent event); @@ -45,8 +47,6 @@ public interface RaceLogEventVisitor { public void visit(StartTrackingEvent event); - public void visit(RevokeEvent event); - public void visit(RegisterCompetitorEvent event); public void visit(DefineMarkEvent event); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogFinishPositioningConfirmedEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogFinishPositioningConfirmedEvent.java similarity index 89% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogFinishPositioningConfirmedEvent.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogFinishPositioningConfirmedEvent.java index 69f35dd2244..801779a9631 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogFinishPositioningConfirmedEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogFinishPositioningConfirmedEvent.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog; +package com.sap.sailing.domain.abstractlog.race; /** diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogFinishPositioningEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogFinishPositioningEvent.java similarity index 87% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogFinishPositioningEvent.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogFinishPositioningEvent.java index f0ae8e1fba3..c49931b9055 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogFinishPositioningEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogFinishPositioningEvent.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog; +package com.sap.sailing.domain.abstractlog.race; public abstract interface RaceLogFinishPositioningEvent extends RaceLogEvent { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogFinishPositioningListChangedEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogFinishPositioningListChangedEvent.java similarity index 66% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogFinishPositioningListChangedEvent.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogFinishPositioningListChangedEvent.java index 7eeb1265a60..9fac2be5e73 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogFinishPositioningListChangedEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogFinishPositioningListChangedEvent.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog; +package com.sap.sailing.domain.abstractlog.race; public interface RaceLogFinishPositioningListChangedEvent extends RaceLogFinishPositioningEvent { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogFlagEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogFlagEvent.java similarity index 76% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogFlagEvent.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogFlagEvent.java index 7d679c5f97f..ae9c8914158 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogFlagEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogFlagEvent.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog; +package com.sap.sailing.domain.abstractlog.race; import com.sap.sailing.domain.common.racelog.Flags; 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/abstractlog/race/RaceLogGateLineOpeningTimeEvent.java similarity index 92% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogGateLineOpeningTimeEvent.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogGateLineOpeningTimeEvent.java index 40f0a0ccf39..0d47e0a10f6 100644 --- 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/abstractlog/race/RaceLogGateLineOpeningTimeEvent.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog; +package com.sap.sailing.domain.abstractlog.race; import com.sap.sse.common.Util; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogPassChangeEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogPassChangeEvent.java similarity index 75% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogPassChangeEvent.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogPassChangeEvent.java index 8c4ad0381e7..dde56f00c84 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogPassChangeEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogPassChangeEvent.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog; +package com.sap.sailing.domain.abstractlog.race; /** * Special event type to indiate a pass change. diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogPathfinderEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogPathfinderEvent.java similarity index 66% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogPathfinderEvent.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogPathfinderEvent.java index 163b5ebbe5e..5ac17d28d94 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogPathfinderEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogPathfinderEvent.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog; +package com.sap.sailing.domain.abstractlog.race; public interface RaceLogPathfinderEvent extends RaceLogEvent { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogProtestStartTimeEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogProtestStartTimeEvent.java similarity index 86% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogProtestStartTimeEvent.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogProtestStartTimeEvent.java index d0fba77e303..50aeeaefd38 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogProtestStartTimeEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogProtestStartTimeEvent.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog; +package com.sap.sailing.domain.abstractlog.race; import com.sap.sse.common.TimePoint; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogRaceStatusEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogRaceStatusEvent.java similarity index 82% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogRaceStatusEvent.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogRaceStatusEvent.java index 8a50a4ada86..87ce47c6c1d 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogRaceStatusEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogRaceStatusEvent.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog; +package com.sap.sailing.domain.abstractlog.race; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogRevokeEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogRevokeEvent.java new file mode 100644 index 00000000000..9bef1e8f5ce --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogRevokeEvent.java @@ -0,0 +1,7 @@ +package com.sap.sailing.domain.abstractlog.race; + +import com.sap.sailing.domain.abstractlog.RevokeEvent; + +public interface RaceLogRevokeEvent extends RaceLogEvent, RevokeEvent { + +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogStartProcedureChangedEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogStartProcedureChangedEvent.java similarity index 80% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogStartProcedureChangedEvent.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogStartProcedureChangedEvent.java index 2526df4332c..0864c5736f5 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogStartProcedureChangedEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogStartProcedureChangedEvent.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog; +package com.sap.sailing.domain.abstractlog.race; import com.sap.sailing.domain.common.racelog.RacingProcedureType; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogStartTimeEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogStartTimeEvent.java similarity index 87% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogStartTimeEvent.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogStartTimeEvent.java index 00720b0de56..73379f4041c 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogStartTimeEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogStartTimeEvent.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog; +package com.sap.sailing.domain.abstractlog.race; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sse.common.TimePoint; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogWindFixEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogWindFixEvent.java similarity index 86% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogWindFixEvent.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogWindFixEvent.java index b4815a71177..bbfd333a491 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogWindFixEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogWindFixEvent.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog; +package com.sap.sailing.domain.abstractlog.race; import com.sap.sailing.domain.tracking.Wind; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/AbortingFlagFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/AbortingFlagFinder.java similarity index 74% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/AbortingFlagFinder.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/AbortingFlagFinder.java index 9c615632204..4c35629749c 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/AbortingFlagFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/AbortingFlagFinder.java @@ -1,9 +1,9 @@ -package com.sap.sailing.domain.racelog.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.analyzing.impl; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent; import com.sap.sailing.domain.common.racelog.Flags; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogFlagEvent; public class AbortingFlagFinder extends RaceLogAnalyzer { @@ -13,11 +13,11 @@ public class AbortingFlagFinder extends RaceLogAnalyzer { @Override protected RaceLogFlagEvent performAnalysis() { - if (raceLog.getCurrentPassId() <= RaceLog.DefaultPassId) { + if (getLog().getCurrentPassId() <= RaceLog.DefaultPassId) { return null; } - int lastButOnePass = raceLog.getCurrentPassId() - 1; + int lastButOnePass = getLog().getCurrentPassId() - 1; for (RaceLogEvent event : getAllEventsDescending()) { if (event.getPassId() == lastButOnePass && event instanceof RaceLogFlagEvent) { RaceLogFlagEvent flagEvent = (RaceLogFlagEvent) event; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/AdditionalScoringInformationFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/AdditionalScoringInformationFinder.java similarity index 82% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/AdditionalScoringInformationFinder.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/AdditionalScoringInformationFinder.java index 46133b89834..3b4ef55d25d 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/AdditionalScoringInformationFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/AdditionalScoringInformationFinder.java @@ -1,12 +1,12 @@ -package com.sap.sailing.domain.racelog.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.analyzing.impl; import java.util.ArrayList; import java.util.List; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.scoring.AdditionalScoringInformationEvent; -import com.sap.sailing.domain.racelog.scoring.AdditionalScoringInformationType; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationEvent; +import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationType; /** * Returns all {@link AdditionalScoringInformationEvent}s from the race log @@ -47,7 +47,7 @@ public class AdditionalScoringInformationFinder extends RaceLogAnalyzer performAnalysis() { final List result = new ArrayList(); // fetch all unrevoked events starting with newest going to oldest - for (RaceLogEvent event : getRaceLog().getUnrevokedEventsDescending()) { + for (RaceLogEvent event : getLog().getUnrevokedEventsDescending()) { if (event instanceof AdditionalScoringInformationEvent) { result.add((AdditionalScoringInformationEvent) event); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/ConfirmedFinishPositioningListFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/ConfirmedFinishPositioningListFinder.java similarity index 67% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/ConfirmedFinishPositioningListFinder.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/ConfirmedFinishPositioningListFinder.java index dd595be2f31..e1ce52945f6 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/ConfirmedFinishPositioningListFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/ConfirmedFinishPositioningListFinder.java @@ -1,9 +1,9 @@ -package com.sap.sailing.domain.racelog.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.analyzing.impl; -import com.sap.sailing.domain.racelog.CompetitorResults; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogFinishPositioningConfirmedEvent; +import com.sap.sailing.domain.abstractlog.race.CompetitorResults; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent; public class ConfirmedFinishPositioningListFinder extends RaceLogAnalyzer { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/FinishPositioningListFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/FinishPositioningListFinder.java similarity index 65% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/FinishPositioningListFinder.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/FinishPositioningListFinder.java index 978bdd8da82..01d81e8a84d 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/FinishPositioningListFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/FinishPositioningListFinder.java @@ -1,9 +1,9 @@ -package com.sap.sailing.domain.racelog.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.analyzing.impl; -import com.sap.sailing.domain.racelog.CompetitorResults; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogFinishPositioningListChangedEvent; +import com.sap.sailing.domain.abstractlog.race.CompetitorResults; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningListChangedEvent; public class FinishPositioningListFinder extends RaceLogAnalyzer { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/FinishedTimeFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/FinishedTimeFinder.java similarity index 72% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/FinishedTimeFinder.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/FinishedTimeFinder.java index c8f97fc2f06..68e155adc8a 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/FinishedTimeFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/FinishedTimeFinder.java @@ -1,9 +1,9 @@ -package com.sap.sailing.domain.racelog.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.analyzing.impl; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogRaceStatusEvent; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; import com.sap.sse.common.TimePoint; public class FinishedTimeFinder extends RaceLogAnalyzer { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/FinishingTimeFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/FinishingTimeFinder.java similarity index 72% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/FinishingTimeFinder.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/FinishingTimeFinder.java index ad856a00433..b5b34628d6f 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/FinishingTimeFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/FinishingTimeFinder.java @@ -1,9 +1,9 @@ -package com.sap.sailing.domain.racelog.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.analyzing.impl; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogRaceStatusEvent; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; import com.sap.sse.common.TimePoint; public class FinishingTimeFinder extends RaceLogAnalyzer { 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/abstractlog/race/analyzing/impl/GateLineOpeningTimeFinder.java similarity index 59% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/GateLineOpeningTimeFinder.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/GateLineOpeningTimeFinder.java index 9b3c1720f1f..f5d608c5a70 100644 --- 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/abstractlog/race/analyzing/impl/GateLineOpeningTimeFinder.java @@ -1,9 +1,9 @@ -package com.sap.sailing.domain.racelog.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.analyzing.impl; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogGateLineOpeningTimeEvent; -import com.sap.sailing.domain.racelog.RaceLogGateLineOpeningTimeEvent.GateLineOpeningTimes; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogGateLineOpeningTimeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogGateLineOpeningTimeEvent.GateLineOpeningTimes; public class GateLineOpeningTimeFinder extends RaceLogAnalyzer { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/IndividualRecallDisplayedFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/IndividualRecallDisplayedFinder.java similarity index 79% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/IndividualRecallDisplayedFinder.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/IndividualRecallDisplayedFinder.java index fb6b20e650e..5bcc7715a4e 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/IndividualRecallDisplayedFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/IndividualRecallDisplayedFinder.java @@ -1,8 +1,8 @@ -package com.sap.sailing.domain.racelog.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.analyzing.impl; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent; import com.sap.sailing.domain.common.racelog.Flags; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogFlagEvent; import com.sap.sse.common.TimePoint; public class IndividualRecallDisplayedFinder extends IndividualRecallFinder { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/IndividualRecallFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/IndividualRecallFinder.java similarity index 72% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/IndividualRecallFinder.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/IndividualRecallFinder.java index 4bbdce14757..95518f1f3a9 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/IndividualRecallFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/IndividualRecallFinder.java @@ -1,8 +1,8 @@ -package com.sap.sailing.domain.racelog.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.analyzing.impl; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogFlagEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent; import com.sap.sse.common.TimePoint; public abstract class IndividualRecallFinder extends RaceLogAnalyzer { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/IndividualRecallRemovedFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/IndividualRecallRemovedFinder.java similarity index 79% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/IndividualRecallRemovedFinder.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/IndividualRecallRemovedFinder.java index 740ad9169a5..4e5e763dd1f 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/IndividualRecallRemovedFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/IndividualRecallRemovedFinder.java @@ -1,8 +1,8 @@ -package com.sap.sailing.domain.racelog.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.analyzing.impl; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent; import com.sap.sailing.domain.common.racelog.Flags; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogFlagEvent; import com.sap.sse.common.TimePoint; public class IndividualRecallRemovedFinder extends IndividualRecallFinder { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/IsFinishedAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/IsFinishedAnalyzer.java similarity index 88% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/IsFinishedAnalyzer.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/IsFinishedAnalyzer.java index 2f26e16577e..ac547b18688 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/IsFinishedAnalyzer.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/IsFinishedAnalyzer.java @@ -1,6 +1,6 @@ -package com.sap.sailing.domain.racelog.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.analyzing.impl; -import com.sap.sailing.domain.racelog.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sse.common.TimePoint; public class IsFinishedAnalyzer extends RaceLogAnalyzer { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/IsInFinishingPhaseAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/IsInFinishingPhaseAnalyzer.java similarity index 88% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/IsInFinishingPhaseAnalyzer.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/IsInFinishingPhaseAnalyzer.java index a26bd31959f..20f8a42a147 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/IsInFinishingPhaseAnalyzer.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/IsInFinishingPhaseAnalyzer.java @@ -1,6 +1,6 @@ -package com.sap.sailing.domain.racelog.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.analyzing.impl; -import com.sap.sailing.domain.racelog.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sse.common.TimePoint; public class IsInFinishingPhaseAnalyzer extends RaceLogAnalyzer { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/IsIndividualRecallDisplayedAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/IsIndividualRecallDisplayedAnalyzer.java similarity index 91% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/IsIndividualRecallDisplayedAnalyzer.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/IsIndividualRecallDisplayedAnalyzer.java index 1e1ede1be12..ef15f88cfd0 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/IsIndividualRecallDisplayedAnalyzer.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/IsIndividualRecallDisplayedAnalyzer.java @@ -1,6 +1,6 @@ -package com.sap.sailing.domain.racelog.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.analyzing.impl; -import com.sap.sailing.domain.racelog.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sse.common.TimePoint; public class IsIndividualRecallDisplayedAnalyzer extends RaceLogAnalyzer { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/LastFlagsFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/LastFlagsFinder.java similarity index 93% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/LastFlagsFinder.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/LastFlagsFinder.java index d673ffc1c02..0d25623da77 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/LastFlagsFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/LastFlagsFinder.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.analyzing.impl; import java.util.ArrayList; import java.util.Collections; @@ -6,9 +6,9 @@ import java.util.Comparator; import java.util.Iterator; import java.util.List; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogFlagEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent; import com.sap.sse.common.TimePoint; /** diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/LastPublishedCourseDesignFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/LastPublishedCourseDesignFinder.java similarity index 69% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/LastPublishedCourseDesignFinder.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/LastPublishedCourseDesignFinder.java index 9ee61de7fba..bbb8ddcc0ce 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/LastPublishedCourseDesignFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/LastPublishedCourseDesignFinder.java @@ -1,9 +1,9 @@ -package com.sap.sailing.domain.racelog.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.analyzing.impl; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.base.CourseBase; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogCourseDesignChangedEvent; -import com.sap.sailing.domain.racelog.RaceLogEvent; public class LastPublishedCourseDesignFinder extends RaceLogAnalyzer { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/LastWindFixFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/LastWindFixFinder.java similarity index 68% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/LastWindFixFinder.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/LastWindFixFinder.java index 9cbf1c716bf..54a3c535a8a 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/LastWindFixFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/LastWindFixFinder.java @@ -1,8 +1,8 @@ -package com.sap.sailing.domain.racelog.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.analyzing.impl; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogWindFixEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; import com.sap.sailing.domain.tracking.Wind; public class LastWindFixFinder extends RaceLogAnalyzer { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/PathfinderFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/PathfinderFinder.java similarity index 64% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/PathfinderFinder.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/PathfinderFinder.java index a885ab5e5f0..161fdb16f81 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/PathfinderFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/PathfinderFinder.java @@ -1,8 +1,8 @@ -package com.sap.sailing.domain.racelog.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.analyzing.impl; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogPathfinderEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogPathfinderEvent; public class PathfinderFinder extends RaceLogAnalyzer { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/ProtestStartTimeFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/ProtestStartTimeFinder.java similarity index 66% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/ProtestStartTimeFinder.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/ProtestStartTimeFinder.java index 8e6c8996f7b..d58d5bc1d0b 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/ProtestStartTimeFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/ProtestStartTimeFinder.java @@ -1,8 +1,8 @@ -package com.sap.sailing.domain.racelog.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.analyzing.impl; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogProtestStartTimeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogProtestStartTimeEvent; import com.sap.sse.common.TimePoint; public class ProtestStartTimeFinder extends RaceLogAnalyzer { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/RRS26StartModeFlagFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RRS26StartModeFlagFinder.java similarity index 87% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/RRS26StartModeFlagFinder.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RRS26StartModeFlagFinder.java index 9ad54b69cf1..ee295352e91 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/RRS26StartModeFlagFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RRS26StartModeFlagFinder.java @@ -1,13 +1,13 @@ -package com.sap.sailing.domain.racelog.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.analyzing.impl; import java.util.Arrays; import java.util.List; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RacingProcedureType; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogFlagEvent; public class RRS26StartModeFlagFinder extends RaceLogAnalyzer { @@ -29,7 +29,7 @@ public class RRS26StartModeFlagFinder extends RaceLogAnalyzer { public RRS26StartModeFlagFinder(RacingProcedureTypeAnalyzer procedureAnalyzer, RaceLog raceLog, List startModeFlags) { super(raceLog); - if (raceLog != procedureAnalyzer.getRaceLog()) { + if (raceLog != procedureAnalyzer.getLog()) { throw new IllegalArgumentException("Both analyzers must operate on the same race log."); } this.procedureAnalyzer = procedureAnalyzer; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceLogAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceLogAnalyzer.java new file mode 100644 index 00000000000..d2264a3f2b4 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceLogAnalyzer.java @@ -0,0 +1,22 @@ +package com.sap.sailing.domain.abstractlog.race.analyzing.impl; + +import com.sap.sailing.domain.abstractlog.AbstractLogAnalyzer; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; + +public abstract class RaceLogAnalyzer extends AbstractLogAnalyzer + { + + public RaceLogAnalyzer(RaceLog raceLog) { + super(raceLog); + } + + protected Iterable getPassEvents() { + return log.getFixes(); + } + + protected Iterable getPassEventsDescending() { + return log.getFixesDescending(); + } +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/RaceStatusAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceStatusAnalyzer.java similarity index 81% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/RaceStatusAnalyzer.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceStatusAnalyzer.java index 62f687fd31e..d43cba46956 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/RaceStatusAnalyzer.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceStatusAnalyzer.java @@ -1,13 +1,13 @@ -package com.sap.sailing.domain.racelog.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.analyzing.impl; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogRaceStatusEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent; +import com.sap.sailing.domain.abstractlog.race.impl.BaseRaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogRaceStatusEventComparator; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ReadonlyRacingProcedure; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; -import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; -import com.sap.sailing.domain.racelog.impl.BaseRaceLogEventVisitor; -import com.sap.sailing.domain.racelog.impl.RaceLogRaceStatusEventComparator; -import com.sap.sailing.domain.racelog.state.racingprocedure.ReadonlyRacingProcedure; import com.sap.sailing.util.impl.ArrayListNavigableSet; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/RacingProcedureTypeAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RacingProcedureTypeAnalyzer.java similarity index 72% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/RacingProcedureTypeAnalyzer.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RacingProcedureTypeAnalyzer.java index d9cb4231081..d3a004f4a33 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/RacingProcedureTypeAnalyzer.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RacingProcedureTypeAnalyzer.java @@ -1,9 +1,9 @@ -package com.sap.sailing.domain.racelog.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.analyzing.impl; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogStartProcedureChangedEvent; import com.sap.sailing.domain.common.racelog.RacingProcedureType; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogStartProcedureChangedEvent; public class RacingProcedureTypeAnalyzer extends RaceLogAnalyzer { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/StartTimeFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/StartTimeFinder.java similarity index 64% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/StartTimeFinder.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/StartTimeFinder.java index 4648a96b878..23957a79541 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/StartTimeFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/StartTimeFinder.java @@ -1,8 +1,8 @@ -package com.sap.sailing.domain.racelog.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.analyzing.impl; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent; import com.sap.sse.common.TimePoint; public class StartTimeFinder extends RaceLogAnalyzer { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/WindFixesFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/WindFixesFinder.java similarity index 73% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/WindFixesFinder.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/WindFixesFinder.java index 0c94fc329c6..cad009c8d4b 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/WindFixesFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/WindFixesFinder.java @@ -1,11 +1,11 @@ -package com.sap.sailing.domain.racelog.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.analyzing.impl; import java.util.ArrayList; import java.util.List; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogWindFixEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; import com.sap.sailing.domain.tracking.Wind; public class WindFixesFinder extends RaceLogAnalyzer> { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/AbstractRaceLogChangedVisitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/AbstractRaceLogChangedVisitor.java similarity index 59% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/AbstractRaceLogChangedVisitor.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/AbstractRaceLogChangedVisitor.java index 5e8c5cb046d..a01b4e0c5c3 100755 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/AbstractRaceLogChangedVisitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/AbstractRaceLogChangedVisitor.java @@ -1,29 +1,29 @@ -package com.sap.sailing.domain.racelog.impl; +package com.sap.sailing.domain.abstractlog.race.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.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.RaceLogProtestStartTimeEvent; -import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; -import com.sap.sailing.domain.racelog.RaceLogStartProcedureChangedEvent; -import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; -import com.sap.sailing.domain.racelog.RaceLogWindFixEvent; -import com.sap.sailing.domain.racelog.RevokeEvent; -import com.sap.sailing.domain.racelog.scoring.AdditionalScoringInformationEvent; -import com.sap.sailing.domain.racelog.tracking.CloseOpenEndedDeviceMappingEvent; -import com.sap.sailing.domain.racelog.tracking.DefineMarkEvent; -import com.sap.sailing.domain.racelog.tracking.DenoteForTrackingEvent; -import com.sap.sailing.domain.racelog.tracking.DeviceCompetitorMappingEvent; -import com.sap.sailing.domain.racelog.tracking.DeviceMarkMappingEvent; -import com.sap.sailing.domain.racelog.tracking.RegisterCompetitorEvent; -import com.sap.sailing.domain.racelog.tracking.StartTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogCourseAreaChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningListChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogGateLineOpeningTimeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogPassChangeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogPathfinderEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogProtestStartTimeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogRaceStatusEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogRevokeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogStartProcedureChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; +import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.CloseOpenEndedDeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DefineMarkEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DenoteForTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceCompetitorMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMarkMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.RegisterCompetitorEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.StartTrackingEvent; public abstract class AbstractRaceLogChangedVisitor implements RaceLogEventVisitor { protected abstract void notifyListenerAboutEventAdded(RaceLogEvent event); @@ -108,7 +108,7 @@ public abstract class AbstractRaceLogChangedVisitor implements RaceLogEventVisit } @Override - public void visit(RevokeEvent event) { + public void visit(RaceLogRevokeEvent event) { notifyListenerAboutEventAdded(event); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/BaseRaceLogEventVisitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/BaseRaceLogEventVisitor.java similarity index 51% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/BaseRaceLogEventVisitor.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/BaseRaceLogEventVisitor.java index cc86383f8f7..54365c8642a 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/BaseRaceLogEventVisitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/BaseRaceLogEventVisitor.java @@ -1,28 +1,28 @@ -package com.sap.sailing.domain.racelog.impl; +package com.sap.sailing.domain.abstractlog.race.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.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.RaceLogProtestStartTimeEvent; -import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; -import com.sap.sailing.domain.racelog.RaceLogStartProcedureChangedEvent; -import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; -import com.sap.sailing.domain.racelog.RaceLogWindFixEvent; -import com.sap.sailing.domain.racelog.RevokeEvent; -import com.sap.sailing.domain.racelog.scoring.AdditionalScoringInformationEvent; -import com.sap.sailing.domain.racelog.tracking.CloseOpenEndedDeviceMappingEvent; -import com.sap.sailing.domain.racelog.tracking.DefineMarkEvent; -import com.sap.sailing.domain.racelog.tracking.DenoteForTrackingEvent; -import com.sap.sailing.domain.racelog.tracking.DeviceCompetitorMappingEvent; -import com.sap.sailing.domain.racelog.tracking.DeviceMarkMappingEvent; -import com.sap.sailing.domain.racelog.tracking.RegisterCompetitorEvent; -import com.sap.sailing.domain.racelog.tracking.StartTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogCourseAreaChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningListChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogGateLineOpeningTimeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogPassChangeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogPathfinderEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogProtestStartTimeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogRaceStatusEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogRevokeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogStartProcedureChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; +import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.CloseOpenEndedDeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DefineMarkEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DenoteForTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceCompetitorMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMarkMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.RegisterCompetitorEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.StartTrackingEvent; /** * Base class implementing {@link RaceLogEventVisitor}. Every method is implemented as a no-op. @@ -115,7 +115,7 @@ public abstract class BaseRaceLogEventVisitor implements RaceLogEventVisitor { } @Override - public void visit(RevokeEvent event) { + public void visit(RaceLogRevokeEvent event) { } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/CompetitorResultsImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/CompetitorResultsImpl.java similarity index 74% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/CompetitorResultsImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/CompetitorResultsImpl.java index 66c8326d61c..576fa702a42 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/CompetitorResultsImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/CompetitorResultsImpl.java @@ -1,10 +1,10 @@ -package com.sap.sailing.domain.racelog.impl; +package com.sap.sailing.domain.abstractlog.race.impl; import java.io.Serializable; import java.util.ArrayList; +import com.sap.sailing.domain.abstractlog.race.CompetitorResults; import com.sap.sailing.domain.common.MaxPointsReason; -import com.sap.sailing.domain.racelog.CompetitorResults; import com.sap.sse.common.Util; public class CompetitorResultsImpl extends ArrayList> implements CompetitorResults { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/NoAddingRaceLogWrapper.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/NoAddingRaceLogWrapper.java similarity index 88% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/NoAddingRaceLogWrapper.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/NoAddingRaceLogWrapper.java index 54ed306b72b..dfa13638b36 100755 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/NoAddingRaceLogWrapper.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/NoAddingRaceLogWrapper.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog.impl; +package com.sap.sailing.domain.abstractlog.race.impl; import java.io.Serializable; import java.util.Collections; @@ -9,12 +9,12 @@ import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; -import com.sap.sailing.domain.common.racelog.tracking.NotRevokableException; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; -import com.sap.sailing.domain.racelog.RevokeEvent; +import com.sap.sailing.domain.abstractlog.AbstractLog; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.common.abstractlog.NotRevokableException; import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; @@ -230,18 +230,18 @@ public class NoAddingRaceLogWrapper implements RaceLog { } @Override - public void merge(RaceLog other) { + public void merge(AbstractLog other) { innerRaceLog.merge(other); } @Override - public RevokeEvent revokeEvent(RaceLogEventAuthor author, RaceLogEvent toRevoke) throws NotRevokableException { - return innerRaceLog.revokeEvent(author, toRevoke); - } - - @Override - public RevokeEvent revokeEvent(RaceLogEventAuthor author, RaceLogEvent toRevoke, String reason) + public void revokeEvent(AbstractLogEventAuthor author, RaceLogEvent toRevoke, String reason) throws NotRevokableException { - return innerRaceLog.revokeEvent(author, toRevoke, reason); + innerRaceLog.revokeEvent(author, toRevoke, reason); + } + + @Override + public void revokeEvent(AbstractLogEventAuthor author, RaceLogEvent toRevoke) throws NotRevokableException { + innerRaceLog.revokeEvent(author, toRevoke); } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogChangedVisitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogChangedVisitor.java similarity index 64% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogChangedVisitor.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogChangedVisitor.java index fbc9092a2d4..42d6b95525e 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogChangedVisitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogChangedVisitor.java @@ -1,7 +1,7 @@ -package com.sap.sailing.domain.racelog.impl; +package com.sap.sailing.domain.abstractlog.race.impl; -import com.sap.sailing.domain.racelog.RaceLogChangedListener; -import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogChangedListener; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; public class RaceLogChangedVisitor extends AbstractRaceLogChangedVisitor { private final RaceLogChangedListener listener; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogCourseAreaChangeEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogCourseAreaChangeEventImpl.java similarity index 62% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogCourseAreaChangeEventImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogCourseAreaChangeEventImpl.java index 17261fdcb1d..c56772b5540 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogCourseAreaChangeEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogCourseAreaChangeEventImpl.java @@ -1,12 +1,12 @@ -package com.sap.sailing.domain.racelog.impl; +package com.sap.sailing.domain.abstractlog.race.impl; import java.io.Serializable; import java.util.List; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLogCourseAreaChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelog.RaceLogCourseAreaChangedEvent; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; import com.sap.sse.common.TimePoint; public class RaceLogCourseAreaChangeEventImpl extends RaceLogEventImpl implements @@ -16,7 +16,7 @@ RaceLogCourseAreaChangedEvent { private final Serializable courseAreaId; public RaceLogCourseAreaChangeEventImpl(TimePoint createdAt, - RaceLogEventAuthor author, TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId, Serializable courseAreaId) { + AbstractLogEventAuthor author, TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId, Serializable courseAreaId) { super(createdAt, author, pTimePoint, pId, pInvolvedBoats, pPassId); this.courseAreaId = courseAreaId; } 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/abstractlog/race/impl/RaceLogCourseDesignChangedEventImpl.java similarity index 67% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogCourseDesignChangedEventImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogCourseDesignChangedEventImpl.java index 47b92367e11..5fd11a31252 100644 --- 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/abstractlog/race/impl/RaceLogCourseDesignChangedEventImpl.java @@ -1,13 +1,13 @@ -package com.sap.sailing.domain.racelog.impl; +package com.sap.sailing.domain.abstractlog.race.impl; import java.io.Serializable; import java.util.List; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseBase; -import com.sap.sailing.domain.racelog.RaceLogCourseDesignChangedEvent; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; import com.sap.sse.common.TimePoint; public class RaceLogCourseDesignChangedEventImpl extends RaceLogEventImpl implements RaceLogCourseDesignChangedEvent { @@ -16,7 +16,7 @@ public class RaceLogCourseDesignChangedEventImpl extends RaceLogEventImpl implem private final CourseBase courseDesign; public RaceLogCourseDesignChangedEventImpl(TimePoint createdAt, - RaceLogEventAuthor author, TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId, CourseBase courseDesign) { + AbstractLogEventAuthor author, TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId, CourseBase courseDesign) { super(createdAt, author, pTimePoint, pId, pInvolvedBoats, pPassId); this.courseDesign = courseDesign; } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogEventComparator.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogEventComparator.java new file mode 100644 index 00000000000..eeed5f1688c --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogEventComparator.java @@ -0,0 +1,27 @@ +package com.sap.sailing.domain.abstractlog.race.impl; + +import java.io.Serializable; +import java.util.Comparator; + +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.impl.AbstractLogEventComparator; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.base.Timed; + +/** + * Comparator sorting by pass, then by {@link AbstractLogEventAuthor}, then by {@link RaceLogEvent#getCreatedAt()} + * timestamp. + * + * If one of the passed objects is not a {@link RaceLogEvent}, sorting is done by {@link Timed#getTimePoint()}. + */ +public class RaceLogEventComparator extends AbstractLogEventComparator implements Comparator, Serializable { + private static final long serialVersionUID = 6146135178558781346L; + + protected int compareEvents(RaceLogEvent e1, RaceLogEvent e2) { + //compare passes + int result = e1.getPassId() - e2.getPassId(); + if (result != 0) return result; + + return super.compareEvents(e1, e2); + } +} 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/abstractlog/race/impl/RaceLogEventFactoryImpl.java similarity index 66% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventFactoryImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogEventFactoryImpl.java index 196850d7d22..af29e3d106f 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/abstractlog/race/impl/RaceLogEventFactoryImpl.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog.impl; +package com.sap.sailing.domain.abstractlog.race.impl; import java.io.Serializable; import java.util.ArrayList; @@ -6,6 +6,41 @@ import java.util.Collections; import java.util.List; import java.util.UUID; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.CompetitorResults; +import com.sap.sailing.domain.abstractlog.race.RaceLogCourseAreaChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventFactory; +import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogGateLineOpeningTimeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogPassChangeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogPathfinderEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogProtestStartTimeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogRaceStatusEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogRevokeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogStartProcedureChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; +import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationEvent; +import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationType; +import com.sap.sailing.domain.abstractlog.race.scoring.impl.AdditionalScoringInformationEventImpl; +import com.sap.sailing.domain.abstractlog.race.tracking.CloseOpenEndedDeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DefineMarkEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DenoteForTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceCompetitorMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMarkMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.RegisterCompetitorEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.StartTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.events.CloseOpenEndedDeviceMappingEventImpl; +import com.sap.sailing.domain.abstractlog.race.tracking.events.DefineMarkEventImpl; +import com.sap.sailing.domain.abstractlog.race.tracking.events.DenoteForTrackingEventImpl; +import com.sap.sailing.domain.abstractlog.race.tracking.events.DeviceCompetitorMappingEventImpl; +import com.sap.sailing.domain.abstractlog.race.tracking.events.DeviceMarkMappingEventImpl; +import com.sap.sailing.domain.abstractlog.race.tracking.events.RegisterCompetitorEventImpl; +import com.sap.sailing.domain.abstractlog.race.tracking.events.StartTrackingEventImpl; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseBase; @@ -13,41 +48,6 @@ import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.domain.common.racelog.RacingProcedureType; -import com.sap.sailing.domain.racelog.CompetitorResults; -import com.sap.sailing.domain.racelog.RaceLogCourseAreaChangedEvent; -import com.sap.sailing.domain.racelog.RaceLogCourseDesignChangedEvent; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -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.RaceLogProtestStartTimeEvent; -import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; -import com.sap.sailing.domain.racelog.RaceLogStartProcedureChangedEvent; -import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; -import com.sap.sailing.domain.racelog.RaceLogWindFixEvent; -import com.sap.sailing.domain.racelog.RevokeEvent; -import com.sap.sailing.domain.racelog.scoring.AdditionalScoringInformationEvent; -import com.sap.sailing.domain.racelog.scoring.AdditionalScoringInformationType; -import com.sap.sailing.domain.racelog.scoring.impl.AdditionalScoringInformationEventImpl; -import com.sap.sailing.domain.racelog.tracking.CloseOpenEndedDeviceMappingEvent; -import com.sap.sailing.domain.racelog.tracking.DefineMarkEvent; -import com.sap.sailing.domain.racelog.tracking.DenoteForTrackingEvent; -import com.sap.sailing.domain.racelog.tracking.DeviceCompetitorMappingEvent; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; -import com.sap.sailing.domain.racelog.tracking.DeviceMarkMappingEvent; -import com.sap.sailing.domain.racelog.tracking.RegisterCompetitorEvent; -import com.sap.sailing.domain.racelog.tracking.StartTrackingEvent; -import com.sap.sailing.domain.racelog.tracking.events.CloseOpenEndedDeviceMappingEventImpl; -import com.sap.sailing.domain.racelog.tracking.events.DefineMarkEventImpl; -import com.sap.sailing.domain.racelog.tracking.events.DenoteForTrackingEventImpl; -import com.sap.sailing.domain.racelog.tracking.events.DeviceCompetitorMappingEventImpl; -import com.sap.sailing.domain.racelog.tracking.events.DeviceMarkMappingEventImpl; -import com.sap.sailing.domain.racelog.tracking.events.RegisterCompetitorEventImpl; -import com.sap.sailing.domain.racelog.tracking.events.RevokeEventImpl; -import com.sap.sailing.domain.racelog.tracking.events.StartTrackingEventImpl; import com.sap.sailing.domain.tracking.Wind; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; @@ -55,77 +55,77 @@ import com.sap.sse.common.impl.MillisecondsTimePoint; public class RaceLogEventFactoryImpl implements RaceLogEventFactory { @Override - public RaceLogFlagEvent createFlagEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, Serializable id, + public RaceLogFlagEvent createFlagEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, Serializable id, List involvedBoats, int passId, Flags upperFlag, Flags lowerFlag, boolean isDisplayed) { return new RaceLogFlagEventImpl(MillisecondsTimePoint.now(), author, logicalTimePoint, id, involvedBoats, passId, upperFlag, lowerFlag, isDisplayed); } @Override - public RaceLogFlagEvent createFlagEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, int passId, Flags upperFlag, + public RaceLogFlagEvent createFlagEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, Flags upperFlag, Flags lowerFlag, boolean isDisplayed) { return createFlagEvent(logicalTimePoint, author, UUID.randomUUID(), new ArrayList(), passId, upperFlag, lowerFlag, isDisplayed); } @Override - public RaceLogStartTimeEvent createStartTimeEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + public RaceLogStartTimeEvent createStartTimeEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, Serializable id, List involvedBoats, int passId, TimePoint startTime) { return new RaceLogStartTimeEventImpl(MillisecondsTimePoint.now(), author, logicalTimePoint, id, involvedBoats, passId, startTime); } @Override - public RaceLogStartTimeEvent createStartTimeEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, int passId, TimePoint startTime) { + public RaceLogStartTimeEvent createStartTimeEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, TimePoint startTime) { return createStartTimeEvent(logicalTimePoint, author, UUID.randomUUID(), new ArrayList(), passId, startTime); } @Override - public RaceLogRaceStatusEvent createRaceStatusEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + public RaceLogRaceStatusEvent createRaceStatusEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, Serializable id, List competitors, int passId, RaceLogRaceStatus nextStatus) { return new RaceLogRaceStatusEventImpl(MillisecondsTimePoint.now(), author, logicalTimePoint, id, competitors, passId, nextStatus); } @Override - public RaceLogRaceStatusEvent createRaceStatusEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, int passId, RaceLogRaceStatus nextStatus) { + public RaceLogRaceStatusEvent createRaceStatusEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, RaceLogRaceStatus nextStatus) { return createRaceStatusEvent(logicalTimePoint, author, UUID.randomUUID(), new ArrayList(), passId, nextStatus); } @Override - public RaceLogPassChangeEvent createPassChangeEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + public RaceLogPassChangeEvent createPassChangeEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, Serializable id, List competitors, int passId) { return new RaceLogPassChangeEventImpl(MillisecondsTimePoint.now(), author, logicalTimePoint, id, competitors, passId); } @Override - public RaceLogPassChangeEvent createPassChangeEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, int passId) { + public RaceLogPassChangeEvent createPassChangeEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId) { return createPassChangeEvent(logicalTimePoint, author, UUID.randomUUID(), new ArrayList(), passId); } @Override - public RaceLogCourseAreaChangedEvent createCourseAreaChangedEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + public RaceLogCourseAreaChangedEvent createCourseAreaChangedEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, Serializable id, List competitors, int passId, Serializable courseAreaId) { return new RaceLogCourseAreaChangeEventImpl(MillisecondsTimePoint.now(), author, logicalTimePoint, id, competitors, passId, courseAreaId); } @Override - public RaceLogCourseAreaChangedEvent createCourseAreaChangedEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + public RaceLogCourseAreaChangedEvent createCourseAreaChangedEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, Serializable courseAreaId) { return createCourseAreaChangedEvent(logicalTimePoint, author, UUID.randomUUID(), new ArrayList(), passId, courseAreaId); } @Override - public RaceLogCourseDesignChangedEvent createCourseDesignChangedEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + public RaceLogCourseDesignChangedEvent createCourseDesignChangedEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, Serializable id, List competitors, int passId, CourseBase courseData) { return new RaceLogCourseDesignChangedEventImpl(MillisecondsTimePoint.now(), author, logicalTimePoint, id, competitors, passId, courseData); } @Override - public RaceLogCourseDesignChangedEvent createCourseDesignChangedEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + public RaceLogCourseDesignChangedEvent createCourseDesignChangedEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, CourseBase courseData) { return createCourseDesignChangedEvent(logicalTimePoint, author, UUID.randomUUID(), new ArrayList(), passId, courseData); @@ -133,7 +133,7 @@ public class RaceLogEventFactoryImpl implements RaceLogEventFactory { @Override public RaceLogFinishPositioningListChangedEventImpl createFinishPositioningListChangedEvent(TimePoint logicalTimePoint, - RaceLogEventAuthor author, Serializable id, List competitors, + AbstractLogEventAuthor author, Serializable id, List competitors, int passId, CompetitorResults positionedCompetitors) { return new RaceLogFinishPositioningListChangedEventImpl(MillisecondsTimePoint.now(), author, logicalTimePoint, id, competitors, passId, positionedCompetitors); @@ -141,143 +141,142 @@ public class RaceLogEventFactoryImpl implements RaceLogEventFactory { @Override public RaceLogFinishPositioningListChangedEventImpl createFinishPositioningListChangedEvent(TimePoint logicalTimePoint, - RaceLogEventAuthor author, int passId, CompetitorResults positionedCompetitors) { + AbstractLogEventAuthor author, int passId, CompetitorResults positionedCompetitors) { return createFinishPositioningListChangedEvent(logicalTimePoint, author, UUID.randomUUID(), new ArrayList(), passId, positionedCompetitors); } @Override public RaceLogFinishPositioningConfirmedEvent createFinishPositioningConfirmedEvent(TimePoint logicalTimePoint, - RaceLogEventAuthor author, Serializable id, List competitors, int passId, CompetitorResults positionedCompetitors) { + AbstractLogEventAuthor author, Serializable id, List competitors, int passId, CompetitorResults positionedCompetitors) { return new RaceLogFinishPositioningConfirmedEventImpl(MillisecondsTimePoint.now(), author, logicalTimePoint, id, competitors, passId, positionedCompetitors); } @Override - public RaceLogFinishPositioningConfirmedEvent createFinishPositioningConfirmedEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + public RaceLogFinishPositioningConfirmedEvent createFinishPositioningConfirmedEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, CompetitorResults positionedCompetitors) { return createFinishPositioningConfirmedEvent(logicalTimePoint, author, UUID.randomUUID(), new ArrayList(), passId, positionedCompetitors); } @Override - public RaceLogPathfinderEvent createPathfinderEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + public RaceLogPathfinderEvent createPathfinderEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, Serializable id, List competitors, int passId, String pathfinderId) { return new RaceLogPathfinderEventImpl(MillisecondsTimePoint.now(), author, logicalTimePoint, id, competitors, passId, pathfinderId); } @Override - public RaceLogPathfinderEvent createPathfinderEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, int passId, String pathfinderId) { + public RaceLogPathfinderEvent createPathfinderEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, String pathfinderId) { return createPathfinderEvent(logicalTimePoint, author, UUID.randomUUID(), new ArrayList(), passId, pathfinderId); } @Override - public RaceLogGateLineOpeningTimeEvent createGateLineOpeningTimeEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + public RaceLogGateLineOpeningTimeEvent createGateLineOpeningTimeEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, Serializable id, List competitors, int passId, Long gateLaunchStopTime, Long golfDownTime) { return new RaceLogGateLineOpeningTimeEventImpl(MillisecondsTimePoint.now(), author, logicalTimePoint, id, competitors, passId, gateLaunchStopTime, golfDownTime); } @Override - public RaceLogGateLineOpeningTimeEvent createGateLineOpeningTimeEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + public RaceLogGateLineOpeningTimeEvent createGateLineOpeningTimeEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, Long gateLaunchStopTime, Long golfDownTime) { return createGateLineOpeningTimeEvent(logicalTimePoint, author, UUID.randomUUID(), new ArrayList(), passId, gateLaunchStopTime, golfDownTime); } @Override - public RaceLogStartProcedureChangedEvent createStartProcedureChangedEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + public RaceLogStartProcedureChangedEvent createStartProcedureChangedEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, Serializable id, List competitors, int passId, RacingProcedureType type) { return new RaceLogStartProcedureChangedEventImpl(MillisecondsTimePoint.now(), author, logicalTimePoint, id, competitors, passId, type); } @Override - public RaceLogStartProcedureChangedEvent createStartProcedureChangedEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + public RaceLogStartProcedureChangedEvent createStartProcedureChangedEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, RacingProcedureType type) { return createStartProcedureChangedEvent(logicalTimePoint, author, UUID.randomUUID(), new ArrayList(), passId, type); } @Override - public RaceLogProtestStartTimeEvent createProtestStartTimeEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + public RaceLogProtestStartTimeEvent createProtestStartTimeEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, Serializable id, List competitors, int passId, TimePoint protestStartTime) { return new RaceLogProtestStartTimeEventImpl(MillisecondsTimePoint.now(), author, logicalTimePoint, id, competitors, passId, protestStartTime); } @Override - public RaceLogProtestStartTimeEvent createProtestStartTimeEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + public RaceLogProtestStartTimeEvent createProtestStartTimeEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, TimePoint protestStartTime) { return createProtestStartTimeEvent(logicalTimePoint, author, UUID.randomUUID(), new ArrayList(), passId, protestStartTime); } @Override - public RaceLogWindFixEvent createWindFixEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, int passId, Wind wind) { + public RaceLogWindFixEvent createWindFixEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, Wind wind) { return createWindFixEvent(logicalTimePoint, author, UUID.randomUUID(), new ArrayList(), passId, wind); } @Override - public RaceLogWindFixEvent createWindFixEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, Serializable id, + public RaceLogWindFixEvent createWindFixEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, Serializable id, List competitors, int passId, Wind wind) { return new RaceLogWindFixEventImpl(MillisecondsTimePoint.now(), author, logicalTimePoint, id, competitors, passId, wind); } @Override - public DeviceCompetitorMappingEvent createDeviceCompetitorMappingEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + public DeviceCompetitorMappingEvent createDeviceCompetitorMappingEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, DeviceIdentifier device, Competitor mappedTo, int passId, TimePoint from, TimePoint to) { return new DeviceCompetitorMappingEventImpl(MillisecondsTimePoint.now(), author, logicalTimePoint, UUID.randomUUID(), passId, mappedTo, device, from, to); } @Override - public DeviceMarkMappingEvent createDeviceMarkMappingEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + public DeviceMarkMappingEvent createDeviceMarkMappingEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, DeviceIdentifier device, Mark mappedTo, int passId, TimePoint from, TimePoint to) { return new DeviceMarkMappingEventImpl(MillisecondsTimePoint.now(), author, logicalTimePoint, UUID.randomUUID(), passId, mappedTo, device, from, to); } @Override - public DenoteForTrackingEvent createDenoteForTrackingEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, int passId, + public DenoteForTrackingEvent createDenoteForTrackingEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, String raceName, BoatClass boatClass, Serializable raceId) { return new DenoteForTrackingEventImpl(MillisecondsTimePoint.now(), author, logicalTimePoint, UUID.randomUUID(), passId, raceName, boatClass, raceId); } @Override - public StartTrackingEvent createStartTrackingEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, int passId) { + public StartTrackingEvent createStartTrackingEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId) { return new StartTrackingEventImpl(MillisecondsTimePoint.now(), author, logicalTimePoint, UUID.randomUUID(), passId); } @Override - public RevokeEvent createRevokeEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, int passId, Serializable revokedEventId, - String revokedEventType, String revokedEventShortInfo, String reason) { - return new RevokeEventImpl(MillisecondsTimePoint.now(), author, logicalTimePoint, UUID.randomUUID(), - passId, revokedEventId, revokedEventType, revokedEventShortInfo, reason); + public RaceLogRevokeEvent createRevokeEvent(AbstractLogEventAuthor author, int passId, RaceLogEvent toRevoke, String reason) { + return new RaceLogRevokeEventImpl(MillisecondsTimePoint.now(), author, MillisecondsTimePoint.now(), UUID.randomUUID(), + passId, toRevoke.getId(), toRevoke.getClass().getName(), toRevoke.getShortInfo(), reason); } @Override - public RegisterCompetitorEvent createRegisterCompetitorEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + public RegisterCompetitorEvent createRegisterCompetitorEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, Competitor competitor) { return new RegisterCompetitorEventImpl(MillisecondsTimePoint.now(), author, logicalTimePoint, UUID.randomUUID(), passId, competitor); } @Override - public DefineMarkEvent createDefineMarkEvent(TimePoint logicalTimePoint, RaceLogEventAuthor author, + public DefineMarkEvent createDefineMarkEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, Mark mark) { return new DefineMarkEventImpl(MillisecondsTimePoint.now(), author, logicalTimePoint, UUID.randomUUID(), passId, mark); } @Override public CloseOpenEndedDeviceMappingEvent createCloseOpenEndedDeviceMappingEvent(TimePoint logicalTimePoint, - RaceLogEventAuthor author, int passId, Serializable deviceMappingEventId, TimePoint closingTimePoint) { + AbstractLogEventAuthor author, int passId, Serializable deviceMappingEventId, TimePoint closingTimePoint) { return new CloseOpenEndedDeviceMappingEventImpl(MillisecondsTimePoint.now(), author, logicalTimePoint, UUID.randomUUID(), passId, deviceMappingEventId, closingTimePoint); } @Override public AdditionalScoringInformationEvent createAdditionalScoringInformationEvent(TimePoint timePoint, Serializable id, - RaceLogEventAuthor author, int currentPassId, AdditionalScoringInformationType informationType) { + AbstractLogEventAuthor author, int currentPassId, AdditionalScoringInformationType informationType) { return new AdditionalScoringInformationEventImpl(MillisecondsTimePoint.now(), author, timePoint, id, Collections.emptyList(), currentPassId, informationType); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogEventImpl.java new file mode 100644 index 00000000000..67215a51a0b --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogEventImpl.java @@ -0,0 +1,40 @@ +package com.sap.sailing.domain.abstractlog.race.impl; + +import java.io.Serializable; +import java.util.List; + +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.impl.AbstractLogEventImpl; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.base.Competitor; +import com.sap.sse.common.TimePoint; + +public abstract class RaceLogEventImpl extends AbstractLogEventImpl implements RaceLogEvent { + private final List involvedBoats; + private final int passId; + + private static final long serialVersionUID = -2557594972618769182L; + + public RaceLogEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, + Serializable pId, List pInvolvedBoats, int pPassId) { + super(createdAt, author, logicalTimePoint, pId); + this.involvedBoats = pInvolvedBoats; + this.passId = pPassId; + } + + @Override + public List getInvolvedBoats() { + return involvedBoats; + } + + @Override + public int getPassId() { + return passId; + } + + @Override + public String toString() { + return super.toString() + ", involvedBoats: " + getInvolvedBoats() + ", passId: " + getPassId(); + } +} 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/abstractlog/race/impl/RaceLogEventRestoreFactoryImpl.java similarity index 59% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventRestoreFactoryImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogEventRestoreFactoryImpl.java index f00cdefb8e8..9224fee263f 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/abstractlog/race/impl/RaceLogEventRestoreFactoryImpl.java @@ -1,8 +1,43 @@ -package com.sap.sailing.domain.racelog.impl; +package com.sap.sailing.domain.abstractlog.race.impl; import java.io.Serializable; import java.util.List; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.CompetitorResults; +import com.sap.sailing.domain.abstractlog.race.RaceLogCourseAreaChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventRestoreFactory; +import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningListChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogGateLineOpeningTimeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogPassChangeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogPathfinderEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogProtestStartTimeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogRaceStatusEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogRevokeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogStartProcedureChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; +import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationEvent; +import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationType; +import com.sap.sailing.domain.abstractlog.race.scoring.impl.AdditionalScoringInformationEventImpl; +import com.sap.sailing.domain.abstractlog.race.tracking.CloseOpenEndedDeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DefineMarkEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DenoteForTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceCompetitorMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMarkMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.RegisterCompetitorEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.StartTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.events.CloseOpenEndedDeviceMappingEventImpl; +import com.sap.sailing.domain.abstractlog.race.tracking.events.DefineMarkEventImpl; +import com.sap.sailing.domain.abstractlog.race.tracking.events.DenoteForTrackingEventImpl; +import com.sap.sailing.domain.abstractlog.race.tracking.events.DeviceCompetitorMappingEventImpl; +import com.sap.sailing.domain.abstractlog.race.tracking.events.DeviceMarkMappingEventImpl; +import com.sap.sailing.domain.abstractlog.race.tracking.events.RegisterCompetitorEventImpl; +import com.sap.sailing.domain.abstractlog.race.tracking.events.StartTrackingEventImpl; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseBase; @@ -10,103 +45,67 @@ import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.domain.common.racelog.RacingProcedureType; -import com.sap.sailing.domain.racelog.CompetitorResults; -import com.sap.sailing.domain.racelog.RaceLogCourseAreaChangedEvent; -import com.sap.sailing.domain.racelog.RaceLogCourseDesignChangedEvent; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -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.RaceLogProtestStartTimeEvent; -import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; -import com.sap.sailing.domain.racelog.RaceLogStartProcedureChangedEvent; -import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; -import com.sap.sailing.domain.racelog.RaceLogWindFixEvent; -import com.sap.sailing.domain.racelog.RevokeEvent; -import com.sap.sailing.domain.racelog.scoring.AdditionalScoringInformationEvent; -import com.sap.sailing.domain.racelog.scoring.AdditionalScoringInformationType; -import com.sap.sailing.domain.racelog.scoring.impl.AdditionalScoringInformationEventImpl; -import com.sap.sailing.domain.racelog.tracking.CloseOpenEndedDeviceMappingEvent; -import com.sap.sailing.domain.racelog.tracking.DefineMarkEvent; -import com.sap.sailing.domain.racelog.tracking.DenoteForTrackingEvent; -import com.sap.sailing.domain.racelog.tracking.DeviceCompetitorMappingEvent; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; -import com.sap.sailing.domain.racelog.tracking.DeviceMarkMappingEvent; -import com.sap.sailing.domain.racelog.tracking.RegisterCompetitorEvent; -import com.sap.sailing.domain.racelog.tracking.StartTrackingEvent; -import com.sap.sailing.domain.racelog.tracking.events.CloseOpenEndedDeviceMappingEventImpl; -import com.sap.sailing.domain.racelog.tracking.events.DefineMarkEventImpl; -import com.sap.sailing.domain.racelog.tracking.events.DenoteForTrackingEventImpl; -import com.sap.sailing.domain.racelog.tracking.events.DeviceCompetitorMappingEventImpl; -import com.sap.sailing.domain.racelog.tracking.events.DeviceMarkMappingEventImpl; -import com.sap.sailing.domain.racelog.tracking.events.RegisterCompetitorEventImpl; -import com.sap.sailing.domain.racelog.tracking.events.RevokeEventImpl; -import com.sap.sailing.domain.racelog.tracking.events.StartTrackingEventImpl; import com.sap.sailing.domain.tracking.Wind; import com.sap.sse.common.TimePoint; public class RaceLogEventRestoreFactoryImpl extends RaceLogEventFactoryImpl implements RaceLogEventRestoreFactory { @Override - public RaceLogFlagEvent createFlagEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + public RaceLogFlagEvent createFlagEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List involvedBoats, int passId, Flags upperFlag, Flags lowerFlag, boolean isDisplayed) { return new RaceLogFlagEventImpl(createdAt, author, logicalTimePoint, id, involvedBoats, passId, upperFlag, lowerFlag, isDisplayed); } @Override - public RaceLogStartTimeEvent createStartTimeEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + public RaceLogStartTimeEvent createStartTimeEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List involvedBoats, int passId, TimePoint startTime) { return new RaceLogStartTimeEventImpl(createdAt, author, logicalTimePoint, id, involvedBoats, passId, startTime); } @Override - public RaceLogRaceStatusEvent createRaceStatusEvent(TimePoint createdAt, RaceLogEventAuthor author, + public RaceLogRaceStatusEvent createRaceStatusEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, int passId, RaceLogRaceStatus nextStatus) { return new RaceLogRaceStatusEventImpl(createdAt, author, logicalTimePoint, id, competitors, passId, nextStatus); } @Override - public RaceLogPassChangeEvent createPassChangeEvent(TimePoint createdAt, RaceLogEventAuthor author, + public RaceLogPassChangeEvent createPassChangeEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, int passId) { return new RaceLogPassChangeEventImpl(createdAt, author, logicalTimePoint, id, competitors, passId); } @Override - public RaceLogCourseAreaChangedEvent createCourseAreaChangedEvent(TimePoint createdAt, RaceLogEventAuthor author, + public RaceLogCourseAreaChangedEvent createCourseAreaChangedEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, int passId, Serializable courseAreaId) { return new RaceLogCourseAreaChangeEventImpl(createdAt, author, logicalTimePoint, id, competitors, passId, courseAreaId); } @Override public RaceLogCourseDesignChangedEvent createCourseDesignChangedEvent(TimePoint createdAt, - RaceLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, int passId, CourseBase courseData) { + AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, int passId, CourseBase courseData) { return new RaceLogCourseDesignChangedEventImpl(createdAt, author, logicalTimePoint, id, competitors, passId, courseData); } @Override public RaceLogFinishPositioningListChangedEvent createFinishPositioningListChangedEvent(TimePoint createdAt, - RaceLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, int passId, CompetitorResults positionedCompetitors) { + AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, int passId, CompetitorResults positionedCompetitors) { return new RaceLogFinishPositioningListChangedEventImpl(createdAt, author, logicalTimePoint, id, competitors, passId, positionedCompetitors); } @Override public RaceLogFinishPositioningConfirmedEvent createFinishPositioningConfirmedEvent(TimePoint createdAt, - RaceLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, int passId, CompetitorResults positionedCompetitors) { + AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, int passId, CompetitorResults positionedCompetitors) { return new RaceLogFinishPositioningConfirmedEventImpl(createdAt, author, logicalTimePoint, id, competitors, passId, positionedCompetitors); } @Override - public RaceLogPathfinderEvent createPathfinderEvent(TimePoint createdAt, RaceLogEventAuthor author, + public RaceLogPathfinderEvent createPathfinderEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, int passId, String pathfinderId) { return new RaceLogPathfinderEventImpl(createdAt, author, logicalTimePoint, id, competitors, passId, pathfinderId); } @Override - public RaceLogGateLineOpeningTimeEvent createGateLineOpeningTimeEvent(TimePoint createdAt, RaceLogEventAuthor author, + public RaceLogGateLineOpeningTimeEvent createGateLineOpeningTimeEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, int passId, Long gateLaunchStopTime, Long golfDownTime) { return new RaceLogGateLineOpeningTimeEventImpl(createdAt, author, logicalTimePoint, id, competitors, passId, gateLaunchStopTime, @@ -114,69 +113,69 @@ public class RaceLogEventRestoreFactoryImpl extends RaceLogEventFactoryImpl impl } @Override - public RaceLogStartProcedureChangedEvent createStartProcedureChangedEvent(TimePoint createdAt, RaceLogEventAuthor author, + public RaceLogStartProcedureChangedEvent createStartProcedureChangedEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, int passId, RacingProcedureType type) { return new RaceLogStartProcedureChangedEventImpl(createdAt, author, logicalTimePoint, id, competitors, passId, type); } @Override - public RaceLogProtestStartTimeEvent createProtestStartTimeEvent(TimePoint createdAt, RaceLogEventAuthor author, + public RaceLogProtestStartTimeEvent createProtestStartTimeEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, int passId, TimePoint protestStartTime) { return new RaceLogProtestStartTimeEventImpl(createdAt, author, logicalTimePoint, id, competitors, passId, protestStartTime); } @Override - public RaceLogWindFixEvent createWindFixEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + public RaceLogWindFixEvent createWindFixEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, Integer passId, Wind wind) { return new RaceLogWindFixEventImpl(createdAt, author, logicalTimePoint, id, competitors, passId, wind); } @Override - public DeviceCompetitorMappingEvent createDeviceCompetitorMappingEvent(TimePoint createdAt, RaceLogEventAuthor author, + public DeviceCompetitorMappingEvent createDeviceCompetitorMappingEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, DeviceIdentifier device, Competitor mappedTo, int passId, TimePoint from, TimePoint to) { return new DeviceCompetitorMappingEventImpl(createdAt, author, logicalTimePoint, pId, passId, mappedTo, device, from, to); } @Override - public DeviceMarkMappingEvent createDeviceMarkMappingEvent(TimePoint createdAt, RaceLogEventAuthor author, + public DeviceMarkMappingEvent createDeviceMarkMappingEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, DeviceIdentifier device, Mark mappedTo, int passId, TimePoint from, TimePoint to) { return new DeviceMarkMappingEventImpl(createdAt, author, logicalTimePoint, pId, passId, mappedTo, device, from, to); } @Override - public DenoteForTrackingEvent createDenoteForTrackingEvent(TimePoint createdAt, RaceLogEventAuthor author, + public DenoteForTrackingEvent createDenoteForTrackingEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, int passId, String raceName, BoatClass boatClass, Serializable raceId) { return new DenoteForTrackingEventImpl(createdAt, author, logicalTimePoint, pId, passId, raceName, boatClass, raceId); } @Override - public StartTrackingEvent createStartTrackingEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + public StartTrackingEvent createStartTrackingEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, int passId) { return new StartTrackingEventImpl(createdAt, author, logicalTimePoint, pId, passId); } @Override - public RevokeEvent createRevokeEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + public RaceLogRevokeEvent createRevokeEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, int passId, Serializable revokedEventId, String revokedEventType, String revokedEventShortInfo, String reason) { - return new RevokeEventImpl(createdAt, author, logicalTimePoint, pId, passId, revokedEventId, revokedEventType, revokedEventShortInfo, reason); + return new RaceLogRevokeEventImpl(createdAt, author, logicalTimePoint, pId, passId, revokedEventId, revokedEventType, revokedEventShortInfo, reason); } @Override - public RegisterCompetitorEvent createRegisterCompetitorEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + public RegisterCompetitorEvent createRegisterCompetitorEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, int passId, Competitor competitor) { return new RegisterCompetitorEventImpl(createdAt, author, logicalTimePoint, pId, passId, competitor); } @Override - public DefineMarkEvent createDefineMarkEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + public DefineMarkEvent createDefineMarkEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, int passId, Mark mark) { return new DefineMarkEventImpl(createdAt, author, logicalTimePoint, pId, passId, mark); } @Override public CloseOpenEndedDeviceMappingEvent createCloseOpenEndedDeviceMappingEvent(TimePoint createdAt, - RaceLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, int passId, + AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, int passId, Serializable deviceMappingEventId, TimePoint closingTimePoint) { return new CloseOpenEndedDeviceMappingEventImpl(createdAt, author, logicalTimePoint, pId, passId, deviceMappingEventId, closingTimePoint); @@ -184,7 +183,7 @@ public class RaceLogEventRestoreFactoryImpl extends RaceLogEventFactoryImpl impl @Override public AdditionalScoringInformationEvent createAdditionalScoringInformationEvent(TimePoint createdAt, - RaceLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, List competitors, int passId, + AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, List competitors, int passId, AdditionalScoringInformationType informationType) { return new AdditionalScoringInformationEventImpl(createdAt, author, logicalTimePoint, pId, competitors, passId, informationType); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFinishPositioningConfirmedEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogFinishPositioningConfirmedEventImpl.java similarity index 54% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFinishPositioningConfirmedEventImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogFinishPositioningConfirmedEventImpl.java index ae288065dd2..7ce91ea3d68 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFinishPositioningConfirmedEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogFinishPositioningConfirmedEventImpl.java @@ -1,13 +1,13 @@ -package com.sap.sailing.domain.racelog.impl; +package com.sap.sailing.domain.abstractlog.race.impl; import java.io.Serializable; import java.util.List; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.CompetitorResults; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelog.CompetitorResults; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; -import com.sap.sailing.domain.racelog.RaceLogFinishPositioningConfirmedEvent; import com.sap.sse.common.TimePoint; public class RaceLogFinishPositioningConfirmedEventImpl extends RaceLogFinishPositioningEventImpl implements RaceLogFinishPositioningConfirmedEvent { @@ -15,7 +15,7 @@ public class RaceLogFinishPositioningConfirmedEventImpl extends RaceLogFinishPos private static final long serialVersionUID = 5028181339200048499L; public RaceLogFinishPositioningConfirmedEventImpl(TimePoint createdAt, - RaceLogEventAuthor author, TimePoint pTimePoint, Serializable pId, List pCompetitors, int pPassId, CompetitorResults positionedCompetitors) { + AbstractLogEventAuthor author, TimePoint pTimePoint, Serializable pId, List pCompetitors, int pPassId, CompetitorResults positionedCompetitors) { super(createdAt, author, pTimePoint, pId, pCompetitors, pPassId, positionedCompetitors); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFinishPositioningEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogFinishPositioningEventImpl.java similarity index 75% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFinishPositioningEventImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogFinishPositioningEventImpl.java index 2776e2f6517..6d8b84c3734 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFinishPositioningEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogFinishPositioningEventImpl.java @@ -1,12 +1,12 @@ -package com.sap.sailing.domain.racelog.impl; +package com.sap.sailing.domain.abstractlog.race.impl; import java.io.Serializable; import java.util.List; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.CompetitorResults; +import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningEvent; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelog.CompetitorResults; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogFinishPositioningEvent; import com.sap.sse.common.TimePoint; public abstract class RaceLogFinishPositioningEventImpl extends RaceLogEventImpl implements RaceLogFinishPositioningEvent { @@ -15,7 +15,7 @@ public abstract class RaceLogFinishPositioningEventImpl extends RaceLogEventImpl private final CompetitorResults positionedCompetitors; - public RaceLogFinishPositioningEventImpl(TimePoint createdAt, RaceLogEventAuthor author, TimePoint pTimePoint, + public RaceLogFinishPositioningEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId, CompetitorResults positionedCompetitors) { super(createdAt, author, pTimePoint, pId, pInvolvedBoats, pPassId); this.positionedCompetitors = positionedCompetitors; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFinishPositioningListChangedEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogFinishPositioningListChangedEventImpl.java similarity index 55% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFinishPositioningListChangedEventImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogFinishPositioningListChangedEventImpl.java index 956d9d5d08a..0a744893e8b 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFinishPositioningListChangedEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogFinishPositioningListChangedEventImpl.java @@ -1,13 +1,13 @@ -package com.sap.sailing.domain.racelog.impl; +package com.sap.sailing.domain.abstractlog.race.impl; import java.io.Serializable; import java.util.List; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.CompetitorResults; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningListChangedEvent; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelog.CompetitorResults; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; -import com.sap.sailing.domain.racelog.RaceLogFinishPositioningListChangedEvent; import com.sap.sse.common.TimePoint; public class RaceLogFinishPositioningListChangedEventImpl extends RaceLogFinishPositioningEventImpl implements RaceLogFinishPositioningListChangedEvent { @@ -15,7 +15,7 @@ public class RaceLogFinishPositioningListChangedEventImpl extends RaceLogFinishP private static final long serialVersionUID = -8167472925561954739L; public RaceLogFinishPositioningListChangedEventImpl(TimePoint createdAt, - RaceLogEventAuthor author, TimePoint pTimePoint, Serializable pId, List competitors, int pPassId, CompetitorResults positionedCompetitors) { + AbstractLogEventAuthor author, TimePoint pTimePoint, Serializable pId, List competitors, int pPassId, CompetitorResults positionedCompetitors) { super(createdAt, author, pTimePoint, pId, competitors, pPassId, positionedCompetitors); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFlagEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogFlagEventImpl.java similarity index 68% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFlagEventImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogFlagEventImpl.java index a307fdc1a3e..2ce2aba9444 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFlagEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogFlagEventImpl.java @@ -1,13 +1,13 @@ -package com.sap.sailing.domain.racelog.impl; +package com.sap.sailing.domain.abstractlog.race.impl; import java.io.Serializable; import java.util.List; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.common.racelog.Flags; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; -import com.sap.sailing.domain.racelog.RaceLogFlagEvent; import com.sap.sse.common.TimePoint; public class RaceLogFlagEventImpl extends RaceLogEventImpl implements RaceLogFlagEvent { @@ -17,7 +17,7 @@ public class RaceLogFlagEventImpl extends RaceLogEventImpl implements RaceLogFla private final Flags lowerFlag; private final boolean isDisplayed; - public RaceLogFlagEventImpl(TimePoint createdAt, RaceLogEventAuthor author, TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId, Flags pUpperFlag, Flags pLowerFlag, boolean pIsDisplayed) { + public RaceLogFlagEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId, Flags pUpperFlag, Flags pLowerFlag, boolean pIsDisplayed) { super(createdAt, author, pTimePoint, pId, pInvolvedBoats, pPassId); this.upperFlag = pUpperFlag; this.lowerFlag = pLowerFlag; 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/abstractlog/race/impl/RaceLogGateLineOpeningTimeEventImpl.java similarity index 70% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogGateLineOpeningTimeEventImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogGateLineOpeningTimeEventImpl.java index 605d8ff65e2..77c6a3a72b3 100644 --- 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/abstractlog/race/impl/RaceLogGateLineOpeningTimeEventImpl.java @@ -1,12 +1,12 @@ -package com.sap.sailing.domain.racelog.impl; +package com.sap.sailing.domain.abstractlog.race.impl; import java.io.Serializable; import java.util.List; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.RaceLogGateLineOpeningTimeEvent; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; -import com.sap.sailing.domain.racelog.RaceLogGateLineOpeningTimeEvent; import com.sap.sse.common.TimePoint; public class RaceLogGateLineOpeningTimeEventImpl extends RaceLogEventImpl implements RaceLogGateLineOpeningTimeEvent { @@ -15,7 +15,7 @@ public class RaceLogGateLineOpeningTimeEventImpl extends RaceLogEventImpl implem private final GateLineOpeningTimes gateLineOpeningTimes; public RaceLogGateLineOpeningTimeEventImpl(TimePoint createdAt, - RaceLogEventAuthor author, TimePoint pTimePoint, Serializable pId, List pCompetitors, int pPassId, + AbstractLogEventAuthor author, TimePoint pTimePoint, Serializable pId, List pCompetitors, int pPassId, long gateLaunchStopTime, long golfDownTime) { super(createdAt, author, pTimePoint, pId, pCompetitors, pPassId); this.gateLineOpeningTimes = new GateLineOpeningTimes(gateLaunchStopTime, golfDownTime); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogImpl.java new file mode 100644 index 00000000000..6980b29b32c --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogImpl.java @@ -0,0 +1,70 @@ +package com.sap.sailing.domain.abstractlog.race.impl; + +import java.io.Serializable; +import java.util.NavigableSet; + +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.impl.AbstractLogImpl; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventFactory; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.tracking.Track; +import com.sap.sailing.domain.tracking.impl.PartialNavigableSetView; +import com.sap.sailing.domain.tracking.impl.TrackImpl; + +/** + * {@link Track} implementation for {@link RaceLogEvent}s. + * + *

+ * "Fix" validity is decided based on the {@link #getCurrentPassId() current pass}. The validity is not cached. + *

+ * + *

+ * {@link TrackImpl#getDummyFix(com.sap.sailing.domain.common.TimePoint)} is not overridden, see + * {@link RaceLogEventComparator} for sorting when interface methods like + * {@link Track#getFirstFixAfter(com.sap.sailing.domain.common.TimePoint)} are used. + *

+ * + */ +public class RaceLogImpl extends AbstractLogImpl implements RaceLog { + private static final long serialVersionUID = 98032278604708475L; + + public RaceLogImpl(Serializable identifier) { + super(identifier, new RaceLogEventComparator()); + } + + public RaceLogImpl(String nameForReadWriteLock, Serializable identifier) { + super(nameForReadWriteLock, identifier, new RaceLogEventComparator()); + } + + @Override + public int getCurrentPassId() { + //return pass id of last event, as pass is the top-level sorting criterion in RaceLogeventComparator + if (! getUnrevokedEvents().isEmpty()) { + return getUnrevokedEvents().last().getPassId(); + } else { + return DefaultPassId; + } + } + + @Override + protected void onSuccessfulAdd(RaceLogEvent event, boolean notifyListeners) { + super.onSuccessfulAdd(event, notifyListeners); + } + + @Override + protected RaceLogEvent createRevokeEvent(AbstractLogEventAuthor author, RaceLogEvent toRevoke, String reason) { + return RaceLogEventFactory.INSTANCE.createRevokeEvent(author, getCurrentPassId(), toRevoke, reason); + } + + @Override + protected NavigableSet getInternalFixes() { + return new PartialNavigableSetView(super.getInternalFixes()) { + @Override + protected boolean isValid(RaceLogEvent e) { + return e.getPassId() == getCurrentPassId(); + } + }; + } +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogPassChangeEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogPassChangeEventImpl.java similarity index 61% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogPassChangeEventImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogPassChangeEventImpl.java index 52c9a83c88f..ede283892a7 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogPassChangeEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogPassChangeEventImpl.java @@ -1,18 +1,18 @@ -package com.sap.sailing.domain.racelog.impl; +package com.sap.sailing.domain.abstractlog.race.impl; import java.io.Serializable; import java.util.List; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.RaceLogPassChangeEvent; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; -import com.sap.sailing.domain.racelog.RaceLogPassChangeEvent; import com.sap.sse.common.TimePoint; public class RaceLogPassChangeEventImpl extends RaceLogEventImpl implements RaceLogPassChangeEvent { private static final long serialVersionUID = -3737606977320640630L; - public RaceLogPassChangeEventImpl(TimePoint createdAt, RaceLogEventAuthor author, + public RaceLogPassChangeEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId) { super(createdAt, author, pTimePoint, pId, pInvolvedBoats, pPassId); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogPathfinderEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogPathfinderEventImpl.java similarity index 67% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogPathfinderEventImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogPathfinderEventImpl.java index 1619888c507..821ec6d6ec3 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogPathfinderEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogPathfinderEventImpl.java @@ -1,12 +1,12 @@ -package com.sap.sailing.domain.racelog.impl; +package com.sap.sailing.domain.abstractlog.race.impl; import java.io.Serializable; import java.util.List; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.RaceLogPathfinderEvent; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; -import com.sap.sailing.domain.racelog.RaceLogPathfinderEvent; import com.sap.sse.common.TimePoint; public class RaceLogPathfinderEventImpl extends RaceLogEventImpl implements RaceLogPathfinderEvent { @@ -15,7 +15,7 @@ public class RaceLogPathfinderEventImpl extends RaceLogEventImpl implements Race private final String pathfinderId; public RaceLogPathfinderEventImpl(TimePoint createdAt, - RaceLogEventAuthor author, TimePoint pTimePoint, Serializable pId, List pCompetitors, int pPassId, String pathfinderId) { + AbstractLogEventAuthor author, TimePoint pTimePoint, Serializable pId, List pCompetitors, int pPassId, String pathfinderId) { super(createdAt, author, pTimePoint, pId, pCompetitors, pPassId); this.pathfinderId = pathfinderId; } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogProtestStartTimeEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogProtestStartTimeEventImpl.java similarity index 73% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogProtestStartTimeEventImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogProtestStartTimeEventImpl.java index 81cf9ffeaa4..5035bbde253 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogProtestStartTimeEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogProtestStartTimeEventImpl.java @@ -1,12 +1,12 @@ -package com.sap.sailing.domain.racelog.impl; +package com.sap.sailing.domain.abstractlog.race.impl; import java.io.Serializable; import java.util.List; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.RaceLogProtestStartTimeEvent; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; -import com.sap.sailing.domain.racelog.RaceLogProtestStartTimeEvent; import com.sap.sse.common.TimePoint; public class RaceLogProtestStartTimeEventImpl extends RaceLogEventImpl implements RaceLogProtestStartTimeEvent { @@ -14,7 +14,7 @@ public class RaceLogProtestStartTimeEventImpl extends RaceLogEventImpl implement private final TimePoint protestStartTime; - public RaceLogProtestStartTimeEventImpl(TimePoint createdAt, RaceLogEventAuthor author, TimePoint pTimePoint, + public RaceLogProtestStartTimeEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId, TimePoint protestStartTime) { super(createdAt, author, pTimePoint, pId, pInvolvedBoats, pPassId); this.protestStartTime = protestStartTime; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogRaceStatusEventComparator.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogRaceStatusEventComparator.java similarity index 82% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogRaceStatusEventComparator.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogRaceStatusEventComparator.java index 2685400c6e4..684976105c5 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogRaceStatusEventComparator.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogRaceStatusEventComparator.java @@ -1,14 +1,14 @@ -package com.sap.sailing.domain.racelog.impl; +package com.sap.sailing.domain.abstractlog.race.impl; import java.io.Serializable; import java.util.Comparator; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogRaceStatusEvent; /** - * Comparator sorting by pass, then by state order number, then by {@link RaceLogEventAuthor}, then by {@link RaceLogEvent#getCreatedAt()} timestamp. + * Comparator sorting by pass, then by state order number, then by {@link AbstractLogEventAuthor}, then by {@link RaceLogEvent#getCreatedAt()} timestamp. */ public enum RaceLogRaceStatusEventComparator implements Comparator, Serializable { INSTANCE; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogRaceStatusEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogRaceStatusEventImpl.java similarity index 69% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogRaceStatusEventImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogRaceStatusEventImpl.java index 003f8016f8c..69a92a9b13a 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogRaceStatusEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogRaceStatusEventImpl.java @@ -1,13 +1,13 @@ -package com.sap.sailing.domain.racelog.impl; +package com.sap.sailing.domain.abstractlog.race.impl; import java.io.Serializable; import java.util.List; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.RaceLogRaceStatusEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; -import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; import com.sap.sse.common.TimePoint; public class RaceLogRaceStatusEventImpl extends RaceLogEventImpl implements RaceLogRaceStatusEvent { @@ -15,7 +15,7 @@ public class RaceLogRaceStatusEventImpl extends RaceLogEventImpl implements Race private final RaceLogRaceStatus nextStatus; - public RaceLogRaceStatusEventImpl(TimePoint createdAt, RaceLogEventAuthor author, TimePoint pTimePoint, + public RaceLogRaceStatusEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId, RaceLogRaceStatus nextStatus) { super(createdAt, author, pTimePoint, pId, pInvolvedBoats, pPassId); this.nextStatus = nextStatus; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogRevokeEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogRevokeEventImpl.java new file mode 100644 index 00000000000..262fad2c28f --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogRevokeEventImpl.java @@ -0,0 +1,40 @@ +package com.sap.sailing.domain.abstractlog.race.impl; + +import java.io.Serializable; +import java.util.Collections; +import java.util.List; + +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.impl.RevokeEventImpl; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.RaceLogRevokeEvent; +import com.sap.sailing.domain.base.Competitor; +import com.sap.sse.common.TimePoint; + +public class RaceLogRevokeEventImpl extends RevokeEventImpl implements RaceLogRevokeEvent { + private final int passId; + + public RaceLogRevokeEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, + Serializable pId, int passId, Serializable revokedEventId, String revokedEventType, String revokedEventShortInfo, + String reason) { + super(createdAt, author, logicalTimePoint, pId, revokedEventId, revokedEventType, revokedEventShortInfo, reason); + this.passId = passId; + } + + private static final long serialVersionUID = 1886722815573499311L; + + @Override + public int getPassId() { + return passId; + } + + @Override + public List getInvolvedBoats() { + return Collections.emptyList(); + } + + @Override + public void accept(RaceLogEventVisitor visitor) { + visitor.visit(this); + } +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogStartProcedureChangedEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogStartProcedureChangedEventImpl.java similarity index 78% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogStartProcedureChangedEventImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogStartProcedureChangedEventImpl.java index 4ad584c5ee7..896b6c723af 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogStartProcedureChangedEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogStartProcedureChangedEventImpl.java @@ -1,13 +1,13 @@ -package com.sap.sailing.domain.racelog.impl; +package com.sap.sailing.domain.abstractlog.race.impl; import java.io.Serializable; import java.util.List; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.RaceLogStartProcedureChangedEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.common.racelog.RacingProcedureType; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; -import com.sap.sailing.domain.racelog.RaceLogStartProcedureChangedEvent; import com.sap.sse.common.TimePoint; public class RaceLogStartProcedureChangedEventImpl extends RaceLogEventImpl implements @@ -17,7 +17,7 @@ public class RaceLogStartProcedureChangedEventImpl extends RaceLogEventImpl impl private final RacingProcedureType startProcedureType; - public RaceLogStartProcedureChangedEventImpl(TimePoint createdAt, RaceLogEventAuthor author, + public RaceLogStartProcedureChangedEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId, RacingProcedureType startProcedureType) { super(createdAt, author, pTimePoint, pId, pInvolvedBoats, pPassId); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogStartTimeEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogStartTimeEventImpl.java similarity index 70% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogStartTimeEventImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogStartTimeEventImpl.java index b56f661e4ca..3d926a02016 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogStartTimeEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogStartTimeEventImpl.java @@ -1,13 +1,13 @@ -package com.sap.sailing.domain.racelog.impl; +package com.sap.sailing.domain.abstractlog.race.impl; import java.io.Serializable; import java.util.List; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; -import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; import com.sap.sse.common.TimePoint; public class RaceLogStartTimeEventImpl extends RaceLogRaceStatusEventImpl implements RaceLogStartTimeEvent { @@ -15,7 +15,7 @@ public class RaceLogStartTimeEventImpl extends RaceLogRaceStatusEventImpl implem private static final long serialVersionUID = 8185811395997196162L; private final TimePoint startTime; - public RaceLogStartTimeEventImpl(TimePoint createdAt, RaceLogEventAuthor author, TimePoint pTimePoint, + public RaceLogStartTimeEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId, TimePoint pStartTime) { super(createdAt, author, pTimePoint, pId, pInvolvedBoats, pPassId, RaceLogRaceStatus.SCHEDULED); this.startTime = pStartTime; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogWindFixEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogWindFixEventImpl.java similarity index 70% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogWindFixEventImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogWindFixEventImpl.java index 94c3d103348..36b54350b32 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogWindFixEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogWindFixEventImpl.java @@ -1,12 +1,12 @@ -package com.sap.sailing.domain.racelog.impl; +package com.sap.sailing.domain.abstractlog.race.impl; import java.io.Serializable; import java.util.List; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; -import com.sap.sailing.domain.racelog.RaceLogWindFixEvent; import com.sap.sailing.domain.tracking.Wind; import com.sap.sse.common.TimePoint; @@ -15,7 +15,7 @@ public class RaceLogWindFixEventImpl extends RaceLogEventImpl implements RaceLog private final Wind windFix; - public RaceLogWindFixEventImpl(TimePoint createdAt, RaceLogEventAuthor author, TimePoint pTimePoint, + public RaceLogWindFixEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId, Wind windFix) { super(createdAt, author, pTimePoint, pId, pInvolvedBoats, pPassId); this.windFix = windFix; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/WeakRaceLogChangedVisitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/WeakRaceLogChangedVisitor.java similarity index 91% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/WeakRaceLogChangedVisitor.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/WeakRaceLogChangedVisitor.java index 6c057bf88e6..368dd02fa04 100755 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/WeakRaceLogChangedVisitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/WeakRaceLogChangedVisitor.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog.impl; +package com.sap.sailing.domain.abstractlog.race.impl; import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; @@ -8,9 +8,9 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Level; import java.util.logging.Logger; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogChangedListener; -import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogChangedListener; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; /** * A listener that unregisters itself from the race log's listeners if its notification target is no longer strongly diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/scoring/AdditionalScoringInformationEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/scoring/AdditionalScoringInformationEvent.java similarity index 70% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/scoring/AdditionalScoringInformationEvent.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/scoring/AdditionalScoringInformationEvent.java index 07e570acead..336b570e856 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/scoring/AdditionalScoringInformationEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/scoring/AdditionalScoringInformationEvent.java @@ -1,8 +1,8 @@ -package com.sap.sailing.domain.racelog.scoring; +package com.sap.sailing.domain.abstractlog.race.scoring; -import com.sap.sailing.domain.racelog.InvalidatesLeaderboardCache; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.Revokable; +import com.sap.sailing.domain.abstractlog.Revokable; +import com.sap.sailing.domain.abstractlog.race.InvalidatesLeaderboardCache; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; /** * Event that could possibly overwrite scoring for a leaderboard column. The idea diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/scoring/AdditionalScoringInformationType.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/scoring/AdditionalScoringInformationType.java similarity index 89% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/scoring/AdditionalScoringInformationType.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/scoring/AdditionalScoringInformationType.java index 004b3001ce4..375bab4df68 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/scoring/AdditionalScoringInformationType.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/scoring/AdditionalScoringInformationType.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog.scoring; +package com.sap.sailing.domain.abstractlog.race.scoring; public enum AdditionalScoringInformationType { /** diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/scoring/impl/AdditionalScoringInformationEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/scoring/impl/AdditionalScoringInformationEventImpl.java similarity index 70% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/scoring/impl/AdditionalScoringInformationEventImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/scoring/impl/AdditionalScoringInformationEventImpl.java index 70726240d6b..73756f06931 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/scoring/impl/AdditionalScoringInformationEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/scoring/impl/AdditionalScoringInformationEventImpl.java @@ -1,14 +1,14 @@ -package com.sap.sailing.domain.racelog.scoring.impl; +package com.sap.sailing.domain.abstractlog.race.scoring.impl; import java.io.Serializable; import java.util.List; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventImpl; +import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationEvent; +import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationType; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; -import com.sap.sailing.domain.racelog.impl.RaceLogEventImpl; -import com.sap.sailing.domain.racelog.scoring.AdditionalScoringInformationEvent; -import com.sap.sailing.domain.racelog.scoring.AdditionalScoringInformationType; import com.sap.sse.common.TimePoint; public class AdditionalScoringInformationEventImpl extends RaceLogEventImpl implements AdditionalScoringInformationEvent { @@ -16,7 +16,7 @@ public class AdditionalScoringInformationEventImpl extends RaceLogEventImpl impl private final AdditionalScoringInformationType informationType; - public AdditionalScoringInformationEventImpl(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + public AdditionalScoringInformationEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, List competitors, int pPassId, AdditionalScoringInformationType informationType) { super(createdAt, author, logicalTimePoint, pId, competitors, pPassId); this.informationType = informationType; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/RaceState.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/RaceState.java similarity index 84% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/RaceState.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/RaceState.java index 86b1b466143..de248e37fc1 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/RaceState.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/RaceState.java @@ -1,17 +1,17 @@ -package com.sap.sailing.domain.racelog.state; +package com.sap.sailing.domain.abstractlog.race.state; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.CompetitorResults; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationEvent; +import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationType; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedure; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedurePrerequisite; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.RacingProcedurePrerequisiteAutoResolver; import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RacingProcedureType; -import com.sap.sailing.domain.racelog.CompetitorResults; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.scoring.AdditionalScoringInformationEvent; -import com.sap.sailing.domain.racelog.scoring.AdditionalScoringInformationType; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedure; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedurePrerequisite; -import com.sap.sailing.domain.racelog.state.racingprocedure.impl.RacingProcedurePrerequisiteAutoResolver; import com.sap.sailing.domain.tracking.Wind; import com.sap.sse.common.TimePoint; @@ -29,9 +29,9 @@ import com.sap.sse.common.TimePoint; public interface RaceState extends ReadonlyRaceState { /** - * Gets the {@link RaceLogEventAuthor} that is used for all created {@link RaceLogEvent}s. + * Gets the {@link AbstractLogEventAuthor} that is used for all created {@link RaceLogEvent}s. */ - RaceLogEventAuthor getAuthor(); + AbstractLogEventAuthor getAuthor(); /** * Gets the currently attached {@link RacingProcedure}. diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/RaceStateChangedListener.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/RaceStateChangedListener.java similarity index 93% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/RaceStateChangedListener.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/RaceStateChangedListener.java index 08844e62dcd..ba12a17a34f 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/RaceStateChangedListener.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/RaceStateChangedListener.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog.state; +package com.sap.sailing.domain.abstractlog.race.state; public interface RaceStateChangedListener { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/RaceStateEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/RaceStateEvent.java similarity index 58% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/RaceStateEvent.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/RaceStateEvent.java index c7bb6428c1b..d9a5cc7b5fc 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/RaceStateEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/RaceStateEvent.java @@ -1,9 +1,9 @@ -package com.sap.sailing.domain.racelog.state; +package com.sap.sailing.domain.abstractlog.race.state; import java.io.Serializable; +import com.sap.sailing.domain.abstractlog.race.state.impl.RaceStateEvents; import com.sap.sailing.domain.base.Timed; -import com.sap.sailing.domain.racelog.state.impl.RaceStateEvents; public interface RaceStateEvent extends Timed, Serializable { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/RaceStateEventProcessor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/RaceStateEventProcessor.java similarity index 65% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/RaceStateEventProcessor.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/RaceStateEventProcessor.java index ef2b597b6f6..cfd28dbdced 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/RaceStateEventProcessor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/RaceStateEventProcessor.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog.state; +package com.sap.sailing.domain.abstractlog.race.state; public interface RaceStateEventProcessor { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/RaceStateEventScheduler.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/RaceStateEventScheduler.java similarity index 66% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/RaceStateEventScheduler.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/RaceStateEventScheduler.java index 1f6a3c0d27a..00af27c0d26 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/RaceStateEventScheduler.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/RaceStateEventScheduler.java @@ -1,8 +1,8 @@ -package com.sap.sailing.domain.racelog.state; +package com.sap.sailing.domain.abstractlog.race.state; import java.util.Collection; -import com.sap.sailing.domain.racelog.state.impl.RaceStateEvents; +import com.sap.sailing.domain.abstractlog.race.state.impl.RaceStateEvents; public interface RaceStateEventScheduler { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/ReadonlyRaceState.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/ReadonlyRaceState.java similarity index 88% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/ReadonlyRaceState.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/ReadonlyRaceState.java index 901bb3e402c..94efa7c6a6f 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/ReadonlyRaceState.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/ReadonlyRaceState.java @@ -1,16 +1,16 @@ -package com.sap.sailing.domain.racelog.state; +package com.sap.sailing.domain.abstractlog.race.state; +import com.sap.sailing.domain.abstractlog.race.CompetitorResults; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogAnalyzer; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventComparator; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogImpl; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ReadonlyRacingProcedure; import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.configuration.RegattaConfiguration; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; -import com.sap.sailing.domain.racelog.CompetitorResults; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; -import com.sap.sailing.domain.racelog.analyzing.impl.RaceLogAnalyzer; -import com.sap.sailing.domain.racelog.impl.RaceLogEventComparator; -import com.sap.sailing.domain.racelog.impl.RaceLogImpl; -import com.sap.sailing.domain.racelog.state.racingprocedure.ReadonlyRacingProcedure; import com.sap.sailing.domain.tracking.Wind; import com.sap.sse.common.TimePoint; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/impl/BaseRaceStateChangedListener.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/BaseRaceStateChangedListener.java similarity index 84% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/impl/BaseRaceStateChangedListener.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/BaseRaceStateChangedListener.java index ada19547768..cac2cac05f8 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/impl/BaseRaceStateChangedListener.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/BaseRaceStateChangedListener.java @@ -1,7 +1,7 @@ -package com.sap.sailing.domain.racelog.state.impl; +package com.sap.sailing.domain.abstractlog.race.state.impl; -import com.sap.sailing.domain.racelog.state.RaceStateChangedListener; -import com.sap.sailing.domain.racelog.state.ReadonlyRaceState; +import com.sap.sailing.domain.abstractlog.race.state.RaceStateChangedListener; +import com.sap.sailing.domain.abstractlog.race.state.ReadonlyRaceState; /** * Providing an empty implementation of {@link RaceStateChangedListener}. diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/impl/RaceStateChangedListeners.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateChangedListeners.java similarity index 91% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/impl/RaceStateChangedListeners.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateChangedListeners.java index 8318bc33a33..0e9e707f95f 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/impl/RaceStateChangedListeners.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateChangedListeners.java @@ -1,9 +1,9 @@ -package com.sap.sailing.domain.racelog.state.impl; +package com.sap.sailing.domain.abstractlog.race.state.impl; import java.util.HashSet; -import com.sap.sailing.domain.racelog.state.RaceStateChangedListener; -import com.sap.sailing.domain.racelog.state.ReadonlyRaceState; +import com.sap.sailing.domain.abstractlog.race.state.RaceStateChangedListener; +import com.sap.sailing.domain.abstractlog.race.state.ReadonlyRaceState; public class RaceStateChangedListeners extends HashSet implements RaceStateChangedListener { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/impl/RaceStateEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateEventImpl.java similarity index 85% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/impl/RaceStateEventImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateEventImpl.java index f4d02ed521f..7d5c214339e 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/impl/RaceStateEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateEventImpl.java @@ -1,6 +1,6 @@ -package com.sap.sailing.domain.racelog.state.impl; +package com.sap.sailing.domain.abstractlog.race.state.impl; -import com.sap.sailing.domain.racelog.state.RaceStateEvent; +import com.sap.sailing.domain.abstractlog.race.state.RaceStateEvent; import com.sap.sse.common.TimePoint; public class RaceStateEventImpl implements RaceStateEvent { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/impl/RaceStateEvents.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateEvents.java similarity index 85% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/impl/RaceStateEvents.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateEvents.java index 85f8d2589e5..1c5806f0faf 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/impl/RaceStateEvents.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateEvents.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog.state.impl; +package com.sap.sailing.domain.abstractlog.race.state.impl; public enum RaceStateEvents { UNKNOWN, diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/impl/RaceStateImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateImpl.java similarity index 75% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/impl/RaceStateImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateImpl.java index 35c983dee51..08e97f5b6d0 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/impl/RaceStateImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateImpl.java @@ -1,28 +1,30 @@ -package com.sap.sailing.domain.racelog.state.impl; +package com.sap.sailing.domain.abstractlog.race.state.impl; import java.util.UUID; +import java.util.logging.Level; +import java.util.logging.Logger; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.CompetitorResults; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventFactory; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.AdditionalScoringInformationFinder; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceStatusAnalyzer; +import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationEvent; +import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationType; +import com.sap.sailing.domain.abstractlog.race.state.RaceState; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedure; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedureFactory; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedurePrerequisite; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.RacingProcedureFactoryImpl; import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.configuration.ConfigurationLoader; import com.sap.sailing.domain.base.configuration.RegattaConfiguration; import com.sap.sailing.domain.base.configuration.impl.EmptyRegattaConfiguration; +import com.sap.sailing.domain.common.abstractlog.NotRevokableException; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.domain.common.racelog.RacingProcedureType; -import com.sap.sailing.domain.common.racelog.tracking.NotRevokableException; -import com.sap.sailing.domain.racelog.CompetitorResults; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventFactory; -import com.sap.sailing.domain.racelog.analyzing.impl.AdditionalScoringInformationFinder; -import com.sap.sailing.domain.racelog.analyzing.impl.RaceStatusAnalyzer; -import com.sap.sailing.domain.racelog.scoring.AdditionalScoringInformationEvent; -import com.sap.sailing.domain.racelog.scoring.AdditionalScoringInformationType; -import com.sap.sailing.domain.racelog.state.RaceState; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedure; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedureFactory; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedurePrerequisite; -import com.sap.sailing.domain.racelog.state.racingprocedure.impl.RacingProcedureFactoryImpl; import com.sap.sailing.domain.tracking.Wind; import com.sap.sse.common.TimePoint; @@ -30,32 +32,33 @@ import com.sap.sse.common.TimePoint; * Write-enabled {@link RaceState}. */ public class RaceStateImpl extends ReadonlyRaceStateImpl implements RaceState { + private static final Logger logger = Logger.getLogger(RaceStateImpl.class.getName()); - private final RaceLogEventAuthor author; + private final AbstractLogEventAuthor author; private final RaceLogEventFactory factory; /** * Creates a {@link RaceState} with the initial racing procedure type set to a fallback value and an empty configuration. */ - public static RaceState create(RaceLog raceLog, RaceLogEventAuthor author) { + public static RaceState create(RaceLog raceLog, AbstractLogEventAuthor author) { return create(raceLog, author, new EmptyRegattaConfiguration()); } /** * Creates a {@link RaceState}. */ - public static RaceState create(RaceLog raceLog, RaceLogEventAuthor author, ConfigurationLoader configuration) { + public static RaceState create(RaceLog raceLog, AbstractLogEventAuthor author, ConfigurationLoader configuration) { return new RaceStateImpl(raceLog, author, RaceLogEventFactory.INSTANCE, new RacingProcedureFactoryImpl(author, RaceLogEventFactory.INSTANCE, configuration)); } - public RaceStateImpl(RaceLog raceLog, RaceLogEventAuthor author, RaceLogEventFactory eventFactory, + public RaceStateImpl(RaceLog raceLog, AbstractLogEventAuthor author, RaceLogEventFactory eventFactory, RacingProcedureFactory procedureFactory) { this(raceLog, author, eventFactory, new RaceStatusAnalyzer.StandardClock(), procedureFactory); } - private RaceStateImpl(RaceLog raceLog, RaceLogEventAuthor author, RaceLogEventFactory eventFactory, RaceStatusAnalyzer.Clock analyzersClock, + private RaceStateImpl(RaceLog raceLog, AbstractLogEventAuthor author, RaceLogEventFactory eventFactory, RaceStatusAnalyzer.Clock analyzersClock, RacingProcedureFactory procedureFactory) { super(raceLog, analyzersClock, procedureFactory, /* update */ true); this.author = author; @@ -85,7 +88,7 @@ public class RaceStateImpl extends ReadonlyRaceStateImpl implements RaceState { } @Override - public RaceLogEventAuthor getAuthor() { + public AbstractLogEventAuthor getAuthor() { return author; } @@ -173,11 +176,11 @@ public class RaceStateImpl extends ReadonlyRaceStateImpl implements RaceState { } } else { if (event != null) { + // revoke the newest one try { - // revoke the newest one - raceLog.revokeEvent(author, event); + raceLog.revokeEvent(author, event, "disable additional scoring information"); } catch (NotRevokableException e) { - e.printStackTrace(); + logger.log(Level.WARNING, "Could not disable scoring information by adding RevokeEvent", e); } } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/impl/ReadonlyRaceStateImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/ReadonlyRaceStateImpl.java similarity index 86% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/impl/ReadonlyRaceStateImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/ReadonlyRaceStateImpl.java index ee0e206ba10..02d552065ff 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/impl/ReadonlyRaceStateImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/ReadonlyRaceStateImpl.java @@ -1,35 +1,35 @@ -package com.sap.sailing.domain.racelog.state.impl; +package com.sap.sailing.domain.abstractlog.race.state.impl; +import com.sap.sailing.domain.abstractlog.race.CompetitorResults; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogChangedListener; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.ConfirmedFinishPositioningListFinder; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.FinishPositioningListFinder; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.FinishedTimeFinder; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.FinishingTimeFinder; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.LastPublishedCourseDesignFinder; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.LastWindFixFinder; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.ProtestStartTimeFinder; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceStatusAnalyzer; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RacingProcedureTypeAnalyzer; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.StartTimeFinder; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceStatusAnalyzer.Clock; +import com.sap.sailing.domain.abstractlog.race.impl.WeakRaceLogChangedVisitor; +import com.sap.sailing.domain.abstractlog.race.state.RaceStateChangedListener; +import com.sap.sailing.domain.abstractlog.race.state.RaceStateEvent; +import com.sap.sailing.domain.abstractlog.race.state.RaceStateEventScheduler; +import com.sap.sailing.domain.abstractlog.race.state.ReadonlyRaceState; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedure; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedureFactory; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ReadonlyRacingProcedure; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.ReadonlyRacingProcedureFactory; import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.configuration.ConfigurationLoader; import com.sap.sailing.domain.base.configuration.RegattaConfiguration; import com.sap.sailing.domain.base.configuration.impl.EmptyRegattaConfiguration; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.domain.common.racelog.RacingProcedureType; -import com.sap.sailing.domain.racelog.CompetitorResults; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogChangedListener; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.analyzing.impl.ConfirmedFinishPositioningListFinder; -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.LastPublishedCourseDesignFinder; -import com.sap.sailing.domain.racelog.analyzing.impl.LastWindFixFinder; -import com.sap.sailing.domain.racelog.analyzing.impl.ProtestStartTimeFinder; -import com.sap.sailing.domain.racelog.analyzing.impl.RaceStatusAnalyzer; -import com.sap.sailing.domain.racelog.analyzing.impl.RaceStatusAnalyzer.Clock; -import com.sap.sailing.domain.racelog.analyzing.impl.RacingProcedureTypeAnalyzer; -import com.sap.sailing.domain.racelog.analyzing.impl.StartTimeFinder; -import com.sap.sailing.domain.racelog.impl.WeakRaceLogChangedVisitor; -import com.sap.sailing.domain.racelog.state.RaceStateChangedListener; -import com.sap.sailing.domain.racelog.state.RaceStateEvent; -import com.sap.sailing.domain.racelog.state.RaceStateEventScheduler; -import com.sap.sailing.domain.racelog.state.ReadonlyRaceState; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedure; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedureFactory; -import com.sap.sailing.domain.racelog.state.racingprocedure.ReadonlyRacingProcedure; -import com.sap.sailing.domain.racelog.state.racingprocedure.impl.ReadonlyRacingProcedureFactory; import com.sap.sailing.domain.tracking.Wind; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/FlagPoleState.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/FlagPoleState.java similarity index 98% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/FlagPoleState.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/FlagPoleState.java index 08aa9a15fe9..66c6bd04431 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/FlagPoleState.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/FlagPoleState.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure; +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure; import java.util.ArrayList; import java.util.Collections; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/RacingProcedure.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/RacingProcedure.java similarity index 84% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/RacingProcedure.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/RacingProcedure.java index e3bf65c8e5d..1eba9f3b8fc 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/RacingProcedure.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/RacingProcedure.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure; +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure; import com.sap.sse.common.TimePoint; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/RacingProcedureChangedListener.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/RacingProcedureChangedListener.java similarity index 80% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/RacingProcedureChangedListener.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/RacingProcedureChangedListener.java index d7d3eacca9a..04493efa56b 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/RacingProcedureChangedListener.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/RacingProcedureChangedListener.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure; +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure; public interface RacingProcedureChangedListener { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/RacingProcedureFactory.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/RacingProcedureFactory.java similarity index 72% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/RacingProcedureFactory.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/RacingProcedureFactory.java index cd07e6e2128..afa15033192 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/RacingProcedureFactory.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/RacingProcedureFactory.java @@ -1,8 +1,8 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure; +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure; +import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.base.configuration.RegattaConfiguration; import com.sap.sailing.domain.common.racelog.RacingProcedureType; -import com.sap.sailing.domain.racelog.RaceLog; public interface RacingProcedureFactory { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/RacingProcedurePrerequisite.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/RacingProcedurePrerequisite.java similarity index 77% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/RacingProcedurePrerequisite.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/RacingProcedurePrerequisite.java index 475cc4148b6..519f65698f3 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/RacingProcedurePrerequisite.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/RacingProcedurePrerequisite.java @@ -1,8 +1,8 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure; +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure; -import com.sap.sailing.domain.racelog.state.racingprocedure.gate.impl.GateLaunchTimePrerequisite; -import com.sap.sailing.domain.racelog.state.racingprocedure.gate.impl.PathfinderPrerequisite; -import com.sap.sailing.domain.racelog.state.racingprocedure.rrs26.impl.StartmodePrerequisite; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.impl.GateLaunchTimePrerequisite; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.impl.PathfinderPrerequisite; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.impl.StartmodePrerequisite; /** * Something that has to be fulfilled before the race can start (e.g. decide which start mode flag is shown). diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/ReadonlyRacingProcedure.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/ReadonlyRacingProcedure.java similarity index 87% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/ReadonlyRacingProcedure.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/ReadonlyRacingProcedure.java index 0d9bef700f3..cc743dfc056 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/ReadonlyRacingProcedure.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/ReadonlyRacingProcedure.java @@ -1,14 +1,14 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure; +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogAnalyzer; +import com.sap.sailing.domain.abstractlog.race.state.RaceState; +import com.sap.sailing.domain.abstractlog.race.state.RaceStateChangedListener; +import com.sap.sailing.domain.abstractlog.race.state.RaceStateEventProcessor; +import com.sap.sailing.domain.abstractlog.race.state.RaceStateEventScheduler; +import com.sap.sailing.domain.abstractlog.race.state.ReadonlyRaceState; import com.sap.sailing.domain.base.configuration.RacingProcedureConfiguration; import com.sap.sailing.domain.common.racelog.RacingProcedureType; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.analyzing.impl.RaceLogAnalyzer; -import com.sap.sailing.domain.racelog.state.RaceState; -import com.sap.sailing.domain.racelog.state.RaceStateChangedListener; -import com.sap.sailing.domain.racelog.state.RaceStateEventProcessor; -import com.sap.sailing.domain.racelog.state.RaceStateEventScheduler; -import com.sap.sailing.domain.racelog.state.ReadonlyRaceState; import com.sap.sse.common.TimePoint; /** diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/basic/BasicRacingProcedure.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/basic/BasicRacingProcedure.java new file mode 100644 index 00000000000..b04b477358a --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/basic/BasicRacingProcedure.java @@ -0,0 +1,7 @@ +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.basic; + +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedure; + +public interface BasicRacingProcedure extends RacingProcedure { + +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/basic/impl/BasicRacingProcedureImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/basic/impl/BasicRacingProcedureImpl.java similarity index 56% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/basic/impl/BasicRacingProcedureImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/basic/impl/BasicRacingProcedureImpl.java index c3c7c4ecfd2..12c064844a6 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/basic/impl/BasicRacingProcedureImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/basic/impl/BasicRacingProcedureImpl.java @@ -1,30 +1,30 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure.basic.impl; +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.basic.impl; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventFactory; +import com.sap.sailing.domain.abstractlog.race.state.RaceStateEvent; +import com.sap.sailing.domain.abstractlog.race.state.impl.RaceStateEventImpl; +import com.sap.sailing.domain.abstractlog.race.state.impl.RaceStateEvents; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.FlagPoleState; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedureChangedListener; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedurePrerequisite; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedurePrerequisite.FulfillmentFunction; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.BaseRacingProcedure; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.NoMorePrerequisite; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.RacingProcedureChangedListeners; import com.sap.sailing.domain.base.configuration.RacingProcedureConfiguration; import com.sap.sailing.domain.common.racelog.FlagPole; import com.sap.sailing.domain.common.racelog.RacingProcedureType; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventFactory; -import com.sap.sailing.domain.racelog.state.RaceStateEvent; -import com.sap.sailing.domain.racelog.state.impl.RaceStateEventImpl; -import com.sap.sailing.domain.racelog.state.impl.RaceStateEvents; -import com.sap.sailing.domain.racelog.state.racingprocedure.FlagPoleState; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedureChangedListener; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedurePrerequisite; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedurePrerequisite.FulfillmentFunction; -import com.sap.sailing.domain.racelog.state.racingprocedure.impl.BaseRacingProcedure; -import com.sap.sailing.domain.racelog.state.racingprocedure.impl.NoMorePrerequisite; -import com.sap.sailing.domain.racelog.state.racingprocedure.impl.RacingProcedureChangedListeners; import com.sap.sse.common.TimePoint; public class BasicRacingProcedureImpl extends BaseRacingProcedure { - public BasicRacingProcedureImpl(RaceLog raceLog, RaceLogEventAuthor author, RaceLogEventFactory factory, + public BasicRacingProcedureImpl(RaceLog raceLog, AbstractLogEventAuthor author, RaceLogEventFactory factory, RacingProcedureConfiguration configuration) { super(raceLog, author, factory, configuration); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/ess/ESSChangedListener.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/ess/ESSChangedListener.java new file mode 100644 index 00000000000..9b5fd3cd0c5 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/ess/ESSChangedListener.java @@ -0,0 +1,7 @@ +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ess; + +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedureChangedListener; + +public interface ESSChangedListener extends RacingProcedureChangedListener { + +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/ess/ESSRacingProcedure.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/ess/ESSRacingProcedure.java new file mode 100644 index 00000000000..9141cf179a7 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/ess/ESSRacingProcedure.java @@ -0,0 +1,7 @@ +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ess; + +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedure; + +public interface ESSRacingProcedure extends ReadonlyESSRacingProcedure, RacingProcedure { + +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/ess/ReadonlyESSRacingProcedure.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/ess/ReadonlyESSRacingProcedure.java similarity index 58% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/ess/ReadonlyESSRacingProcedure.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/ess/ReadonlyESSRacingProcedure.java index cd6279cecbd..9a423a8d420 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/ess/ReadonlyESSRacingProcedure.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/ess/ReadonlyESSRacingProcedure.java @@ -1,6 +1,6 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure.ess; +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ess; -import com.sap.sailing.domain.racelog.state.racingprocedure.ReadonlyRacingProcedure; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ReadonlyRacingProcedure; import com.sap.sse.common.TimePoint; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/ess/impl/ESSChangedListeners.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/ess/impl/ESSChangedListeners.java new file mode 100644 index 00000000000..1990d79af9d --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/ess/impl/ESSChangedListeners.java @@ -0,0 +1,10 @@ +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ess.impl; + +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ess.ESSChangedListener; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.RacingProcedureChangedListeners; + +public class ESSChangedListeners extends RacingProcedureChangedListeners implements + ESSChangedListener { + + +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/ess/impl/ESSRacingProcedureImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/ess/impl/ESSRacingProcedureImpl.java similarity index 82% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/ess/impl/ESSRacingProcedureImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/ess/impl/ESSRacingProcedureImpl.java index b9c6223e4f8..6ffb0b7d881 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/ess/impl/ESSRacingProcedureImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/ess/impl/ESSRacingProcedureImpl.java @@ -1,29 +1,29 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure.ess.impl; +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ess.impl; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventFactory; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.FinishingTimeFinder; +import com.sap.sailing.domain.abstractlog.race.state.RaceStateEvent; +import com.sap.sailing.domain.abstractlog.race.state.impl.RaceStateEventImpl; +import com.sap.sailing.domain.abstractlog.race.state.impl.RaceStateEvents; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.FlagPoleState; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedureChangedListener; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedurePrerequisite; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedurePrerequisite.FulfillmentFunction; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ess.ESSChangedListener; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ess.ESSRacingProcedure; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.BaseRacingProcedure; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.NoMorePrerequisite; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.RacingProcedureChangedListeners; import com.sap.sailing.domain.base.configuration.procedures.ESSConfiguration; import com.sap.sailing.domain.common.racelog.FlagPole; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RacingProcedureType; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventFactory; -import com.sap.sailing.domain.racelog.analyzing.impl.FinishingTimeFinder; -import com.sap.sailing.domain.racelog.state.RaceStateEvent; -import com.sap.sailing.domain.racelog.state.impl.RaceStateEventImpl; -import com.sap.sailing.domain.racelog.state.impl.RaceStateEvents; -import com.sap.sailing.domain.racelog.state.racingprocedure.FlagPoleState; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedureChangedListener; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedurePrerequisite; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedurePrerequisite.FulfillmentFunction; -import com.sap.sailing.domain.racelog.state.racingprocedure.ess.ESSChangedListener; -import com.sap.sailing.domain.racelog.state.racingprocedure.ess.ESSRacingProcedure; -import com.sap.sailing.domain.racelog.state.racingprocedure.impl.BaseRacingProcedure; -import com.sap.sailing.domain.racelog.state.racingprocedure.impl.NoMorePrerequisite; -import com.sap.sailing.domain.racelog.state.racingprocedure.impl.RacingProcedureChangedListeners; import com.sap.sse.common.TimePoint; public class ESSRacingProcedureImpl extends BaseRacingProcedure implements ESSRacingProcedure { @@ -36,7 +36,7 @@ public class ESSRacingProcedureImpl extends BaseRacingProcedure implements ESSRa @SuppressWarnings("unused") private final ESSConfiguration configuration; - public ESSRacingProcedureImpl(RaceLog raceLog, RaceLogEventAuthor author, + public ESSRacingProcedureImpl(RaceLog raceLog, AbstractLogEventAuthor author, RaceLogEventFactory factory, ESSConfiguration configuration) { super(raceLog, author, factory, configuration); this.configuration = configuration; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/gate/GateStartChangedListener.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/gate/GateStartChangedListener.java similarity index 58% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/gate/GateStartChangedListener.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/gate/GateStartChangedListener.java index 93d6e48e67a..87d397308d6 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/gate/GateStartChangedListener.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/gate/GateStartChangedListener.java @@ -1,6 +1,6 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure.gate; +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedureChangedListener; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedureChangedListener; public interface GateStartChangedListener extends RacingProcedureChangedListener { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/gate/GateStartRacingProcedure.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/gate/GateStartRacingProcedure.java similarity index 65% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/gate/GateStartRacingProcedure.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/gate/GateStartRacingProcedure.java index 315384c059a..09bb90ff037 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/gate/GateStartRacingProcedure.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/gate/GateStartRacingProcedure.java @@ -1,6 +1,6 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure.gate; +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedure; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedure; import com.sap.sse.common.TimePoint; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/gate/ReadonlyGateStartRacingProcedure.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/gate/ReadonlyGateStartRacingProcedure.java similarity index 81% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/gate/ReadonlyGateStartRacingProcedure.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/gate/ReadonlyGateStartRacingProcedure.java index 44b84762ae3..ba112e6bfbd 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/gate/ReadonlyGateStartRacingProcedure.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/gate/ReadonlyGateStartRacingProcedure.java @@ -1,7 +1,7 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure.gate; +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ReadonlyRacingProcedure; import com.sap.sailing.domain.base.configuration.procedures.GateStartConfiguration; -import com.sap.sailing.domain.racelog.state.racingprocedure.ReadonlyRacingProcedure; import com.sap.sse.common.TimePoint; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/gate/impl/BaseGateStartPrerequisite.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/gate/impl/BaseGateStartPrerequisite.java similarity index 60% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/gate/impl/BaseGateStartPrerequisite.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/gate/impl/BaseGateStartPrerequisite.java index 93a7b5496f7..48ad0823aed 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/gate/impl/BaseGateStartPrerequisite.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/gate/impl/BaseGateStartPrerequisite.java @@ -1,8 +1,8 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure.gate.impl; +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.impl; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedurePrerequisite; -import com.sap.sailing.domain.racelog.state.racingprocedure.gate.GateStartRacingProcedure; -import com.sap.sailing.domain.racelog.state.racingprocedure.impl.BaseRacingProcedurePrerequisite; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedurePrerequisite; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.GateStartRacingProcedure; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.BaseRacingProcedurePrerequisite; import com.sap.sse.common.TimePoint; /** diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/gate/impl/GateLaunchTimePrerequisite.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/gate/impl/GateLaunchTimePrerequisite.java similarity index 77% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/gate/impl/GateLaunchTimePrerequisite.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/gate/impl/GateLaunchTimePrerequisite.java index 1133bed9d16..6b85a622af3 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/gate/impl/GateLaunchTimePrerequisite.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/gate/impl/GateLaunchTimePrerequisite.java @@ -1,7 +1,7 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure.gate.impl; +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.impl; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedurePrerequisite; -import com.sap.sailing.domain.racelog.state.racingprocedure.gate.GateStartRacingProcedure; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedurePrerequisite; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.GateStartRacingProcedure; import com.sap.sse.common.TimePoint; public class GateLaunchTimePrerequisite extends BaseGateStartPrerequisite implements RacingProcedurePrerequisite { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/gate/impl/GateStartChangedListeners.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/gate/impl/GateStartChangedListeners.java similarity index 62% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/gate/impl/GateStartChangedListeners.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/gate/impl/GateStartChangedListeners.java index d7ebdd1c882..46ee88edc9b 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/gate/impl/GateStartChangedListeners.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/gate/impl/GateStartChangedListeners.java @@ -1,8 +1,8 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure.gate.impl; +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.impl; -import com.sap.sailing.domain.racelog.state.racingprocedure.gate.GateStartChangedListener; -import com.sap.sailing.domain.racelog.state.racingprocedure.gate.ReadonlyGateStartRacingProcedure; -import com.sap.sailing.domain.racelog.state.racingprocedure.impl.RacingProcedureChangedListeners; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.GateStartChangedListener; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.ReadonlyGateStartRacingProcedure; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.RacingProcedureChangedListeners; public class GateStartChangedListeners extends RacingProcedureChangedListeners implements GateStartChangedListener { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/gate/impl/GateStartRacingProcedureImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/gate/impl/GateStartRacingProcedureImpl.java similarity index 85% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/gate/impl/GateStartRacingProcedureImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/gate/impl/GateStartRacingProcedureImpl.java index 8b7badc9bd2..0165aa169cd 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/gate/impl/GateStartRacingProcedureImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/gate/impl/GateStartRacingProcedureImpl.java @@ -1,31 +1,31 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure.gate.impl; +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.impl; import java.util.Arrays; import java.util.Collection; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventFactory; +import com.sap.sailing.domain.abstractlog.race.RaceLogGateLineOpeningTimeEvent.GateLineOpeningTimes; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.GateLineOpeningTimeFinder; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.PathfinderFinder; +import com.sap.sailing.domain.abstractlog.race.state.RaceStateEvent; +import com.sap.sailing.domain.abstractlog.race.state.ReadonlyRaceState; +import com.sap.sailing.domain.abstractlog.race.state.impl.RaceStateEventImpl; +import com.sap.sailing.domain.abstractlog.race.state.impl.RaceStateEvents; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.FlagPoleState; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedureChangedListener; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedurePrerequisite; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedurePrerequisite.FulfillmentFunction; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.GateStartChangedListener; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.GateStartRacingProcedure; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.BaseRacingProcedure; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.NoMorePrerequisite; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.RacingProcedureChangedListeners; import com.sap.sailing.domain.base.configuration.procedures.GateStartConfiguration; import com.sap.sailing.domain.common.racelog.FlagPole; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RacingProcedureType; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventFactory; -import com.sap.sailing.domain.racelog.RaceLogGateLineOpeningTimeEvent.GateLineOpeningTimes; -import com.sap.sailing.domain.racelog.analyzing.impl.GateLineOpeningTimeFinder; -import com.sap.sailing.domain.racelog.analyzing.impl.PathfinderFinder; -import com.sap.sailing.domain.racelog.state.RaceStateEvent; -import com.sap.sailing.domain.racelog.state.ReadonlyRaceState; -import com.sap.sailing.domain.racelog.state.impl.RaceStateEventImpl; -import com.sap.sailing.domain.racelog.state.impl.RaceStateEvents; -import com.sap.sailing.domain.racelog.state.racingprocedure.FlagPoleState; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedureChangedListener; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedurePrerequisite; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedurePrerequisite.FulfillmentFunction; -import com.sap.sailing.domain.racelog.state.racingprocedure.gate.GateStartChangedListener; -import com.sap.sailing.domain.racelog.state.racingprocedure.gate.GateStartRacingProcedure; -import com.sap.sailing.domain.racelog.state.racingprocedure.impl.BaseRacingProcedure; -import com.sap.sailing.domain.racelog.state.racingprocedure.impl.NoMorePrerequisite; -import com.sap.sailing.domain.racelog.state.racingprocedure.impl.RacingProcedureChangedListeners; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; @@ -42,7 +42,7 @@ public class GateStartRacingProcedureImpl extends BaseRacingProcedure implements private boolean gateLineOpeningTimesHasBeenSet; private String cachedPathfinder; - public GateStartRacingProcedureImpl(RaceLog raceLog, RaceLogEventAuthor author, RaceLogEventFactory factory, + public GateStartRacingProcedureImpl(RaceLog raceLog, AbstractLogEventAuthor author, RaceLogEventFactory factory, GateStartConfiguration configuration) { super(raceLog, author, factory, configuration); this.gateLineOpeningTimeAnalyzer = new GateLineOpeningTimeFinder(raceLog); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/gate/impl/PathfinderPrerequisite.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/gate/impl/PathfinderPrerequisite.java similarity index 73% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/gate/impl/PathfinderPrerequisite.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/gate/impl/PathfinderPrerequisite.java index 1dc083f432f..45956155fe7 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/gate/impl/PathfinderPrerequisite.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/gate/impl/PathfinderPrerequisite.java @@ -1,7 +1,7 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure.gate.impl; +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.impl; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedurePrerequisite; -import com.sap.sailing.domain.racelog.state.racingprocedure.gate.GateStartRacingProcedure; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedurePrerequisite; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.GateStartRacingProcedure; import com.sap.sse.common.TimePoint; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/impl/BaseRacingProcedure.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/impl/BaseRacingProcedure.java similarity index 82% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/impl/BaseRacingProcedure.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/impl/BaseRacingProcedure.java index dd1dcba5ac0..ea11b0f6666 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/impl/BaseRacingProcedure.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/impl/BaseRacingProcedure.java @@ -1,32 +1,32 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure.impl; +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl; import java.util.Arrays; import java.util.Collection; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogChangedListener; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventFactory; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.FinishedTimeFinder; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.FinishingTimeFinder; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.IndividualRecallDisplayedFinder; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.IndividualRecallRemovedFinder; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.IsFinishedAnalyzer; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.IsInFinishingPhaseAnalyzer; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.IsIndividualRecallDisplayedAnalyzer; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogChangedVisitor; +import com.sap.sailing.domain.abstractlog.race.state.RaceStateEvent; +import com.sap.sailing.domain.abstractlog.race.state.RaceStateEventScheduler; +import com.sap.sailing.domain.abstractlog.race.state.ReadonlyRaceState; +import com.sap.sailing.domain.abstractlog.race.state.impl.BaseRaceStateChangedListener; +import com.sap.sailing.domain.abstractlog.race.state.impl.RaceStateEventImpl; +import com.sap.sailing.domain.abstractlog.race.state.impl.RaceStateEvents; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedure; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedureChangedListener; import com.sap.sailing.domain.base.configuration.RacingProcedureConfiguration; import com.sap.sailing.domain.common.racelog.Flags; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogChangedListener; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventFactory; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; -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.IndividualRecallDisplayedFinder; -import com.sap.sailing.domain.racelog.analyzing.impl.IndividualRecallRemovedFinder; -import com.sap.sailing.domain.racelog.analyzing.impl.IsFinishedAnalyzer; -import com.sap.sailing.domain.racelog.analyzing.impl.IsInFinishingPhaseAnalyzer; -import com.sap.sailing.domain.racelog.analyzing.impl.IsIndividualRecallDisplayedAnalyzer; -import com.sap.sailing.domain.racelog.impl.RaceLogChangedVisitor; -import com.sap.sailing.domain.racelog.state.RaceStateEvent; -import com.sap.sailing.domain.racelog.state.RaceStateEventScheduler; -import com.sap.sailing.domain.racelog.state.ReadonlyRaceState; -import com.sap.sailing.domain.racelog.state.impl.BaseRaceStateChangedListener; -import com.sap.sailing.domain.racelog.state.impl.RaceStateEventImpl; -import com.sap.sailing.domain.racelog.state.impl.RaceStateEvents; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedure; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedureChangedListener; import com.sap.sse.common.TimePoint; /** @@ -44,7 +44,7 @@ public abstract class BaseRacingProcedure extends BaseRaceStateChangedListener i private RaceStateEventScheduler scheduler; protected final RaceLog raceLog; - protected final RaceLogEventAuthor author; + protected final AbstractLogEventAuthor author; protected final RaceLogEventFactory factory; private final RacingProcedureConfiguration configuration; @@ -61,7 +61,7 @@ public abstract class BaseRacingProcedure extends BaseRaceStateChangedListener i /** * When calling me, call {@link BaseRacingProcedure#update()} afterwards! */ - public BaseRacingProcedure(RaceLog raceLog, RaceLogEventAuthor author, RaceLogEventFactory factory, + public BaseRacingProcedure(RaceLog raceLog, AbstractLogEventAuthor author, RaceLogEventFactory factory, RacingProcedureConfiguration configuration) { if (configuration == null) { throw new IllegalArgumentException("configuration must not be null"); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/impl/BaseRacingProcedureChangedListener.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/impl/BaseRacingProcedureChangedListener.java similarity index 61% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/impl/BaseRacingProcedureChangedListener.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/impl/BaseRacingProcedureChangedListener.java index fa4e7e612ac..c472b4eea8a 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/impl/BaseRacingProcedureChangedListener.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/impl/BaseRacingProcedureChangedListener.java @@ -1,7 +1,7 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure.impl; +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedureChangedListener; -import com.sap.sailing.domain.racelog.state.racingprocedure.ReadonlyRacingProcedure; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedureChangedListener; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ReadonlyRacingProcedure; public abstract class BaseRacingProcedureChangedListener implements RacingProcedureChangedListener { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/impl/BaseRacingProcedurePrerequisite.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/impl/BaseRacingProcedurePrerequisite.java similarity index 89% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/impl/BaseRacingProcedurePrerequisite.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/impl/BaseRacingProcedurePrerequisite.java index a66d5637cd0..b5113d147d4 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/impl/BaseRacingProcedurePrerequisite.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/impl/BaseRacingProcedurePrerequisite.java @@ -1,7 +1,7 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure.impl; +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedure; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedurePrerequisite; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedure; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedurePrerequisite; import com.sap.sse.common.TimePoint; /** diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/impl/NoMorePrerequisite.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/impl/NoMorePrerequisite.java similarity index 84% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/impl/NoMorePrerequisite.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/impl/NoMorePrerequisite.java index 89da490d1ce..0396d8eaa2f 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/impl/NoMorePrerequisite.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/impl/NoMorePrerequisite.java @@ -1,6 +1,6 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure.impl; +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedurePrerequisite; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedurePrerequisite; /** * This special {@link RacingProcedurePrerequisite} won't check for next prerequisites. It just executes the diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/impl/RacingProcedureChangedListeners.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/impl/RacingProcedureChangedListeners.java similarity index 87% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/impl/RacingProcedureChangedListeners.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/impl/RacingProcedureChangedListeners.java index c59646bb530..1833f78f700 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/impl/RacingProcedureChangedListeners.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/impl/RacingProcedureChangedListeners.java @@ -1,10 +1,10 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure.impl; +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl; import java.util.HashSet; import java.util.Set; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedureChangedListener; -import com.sap.sailing.domain.racelog.state.racingprocedure.ReadonlyRacingProcedure; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedureChangedListener; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ReadonlyRacingProcedure; public class RacingProcedureChangedListeners implements RacingProcedureChangedListener { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/impl/RacingProcedureFactoryImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/impl/RacingProcedureFactoryImpl.java similarity index 55% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/impl/RacingProcedureFactoryImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/impl/RacingProcedureFactoryImpl.java index f5e34bb8571..7f34843b014 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/impl/RacingProcedureFactoryImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/impl/RacingProcedureFactoryImpl.java @@ -1,20 +1,20 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure.impl; +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventFactory; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedureFactory; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ReadonlyRacingProcedure; import com.sap.sailing.domain.base.configuration.ConfigurationLoader; import com.sap.sailing.domain.base.configuration.RegattaConfiguration; import com.sap.sailing.domain.common.racelog.RacingProcedureType; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventFactory; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedureFactory; -import com.sap.sailing.domain.racelog.state.racingprocedure.ReadonlyRacingProcedure; public class RacingProcedureFactoryImpl extends ReadonlyRacingProcedureFactory implements RacingProcedureFactory { - private final RaceLogEventAuthor author; + private final AbstractLogEventAuthor author; private final RaceLogEventFactory factory; - public RacingProcedureFactoryImpl(RaceLogEventAuthor author, RaceLogEventFactory factory, + public RacingProcedureFactoryImpl(AbstractLogEventAuthor author, RaceLogEventFactory factory, ConfigurationLoader configuration) { super(configuration); this.author = author; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/impl/RacingProcedurePrerequisiteAutoResolver.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/impl/RacingProcedurePrerequisiteAutoResolver.java similarity index 50% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/impl/RacingProcedurePrerequisiteAutoResolver.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/impl/RacingProcedurePrerequisiteAutoResolver.java index db915fdfb04..297ce7790b9 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/impl/RacingProcedurePrerequisiteAutoResolver.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/impl/RacingProcedurePrerequisiteAutoResolver.java @@ -1,10 +1,10 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure.impl; +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedurePrerequisite; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedurePrerequisite.Resolver; -import com.sap.sailing.domain.racelog.state.racingprocedure.gate.impl.GateLaunchTimePrerequisite; -import com.sap.sailing.domain.racelog.state.racingprocedure.gate.impl.PathfinderPrerequisite; -import com.sap.sailing.domain.racelog.state.racingprocedure.rrs26.impl.StartmodePrerequisite; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedurePrerequisite; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedurePrerequisite.Resolver; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.impl.GateLaunchTimePrerequisite; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.impl.PathfinderPrerequisite; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.impl.StartmodePrerequisite; /** * Always calls {@link RacingProcedurePrerequisite#fulfillWithDefault()}. diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/impl/ReadonlyRacingProcedureFactory.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/impl/ReadonlyRacingProcedureFactory.java similarity index 64% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/impl/ReadonlyRacingProcedureFactory.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/impl/ReadonlyRacingProcedureFactory.java index 9e160da8b62..69f7e652ffe 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/impl/ReadonlyRacingProcedureFactory.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/impl/ReadonlyRacingProcedureFactory.java @@ -1,20 +1,20 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure.impl; +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventFactory; +import com.sap.sailing.domain.abstractlog.race.impl.NoAddingRaceLogWrapper; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedure; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedureFactory; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ReadonlyRacingProcedure; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.basic.impl.BasicRacingProcedureImpl; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ess.impl.ESSRacingProcedureImpl; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.impl.GateStartRacingProcedureImpl; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.impl.RRS26RacingProcedureImpl; import com.sap.sailing.domain.base.configuration.ConfigurationLoader; import com.sap.sailing.domain.base.configuration.RegattaConfiguration; import com.sap.sailing.domain.common.racelog.RacingProcedureType; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventFactory; -import com.sap.sailing.domain.racelog.impl.NoAddingRaceLogWrapper; -import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedure; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedureFactory; -import com.sap.sailing.domain.racelog.state.racingprocedure.ReadonlyRacingProcedure; -import com.sap.sailing.domain.racelog.state.racingprocedure.basic.impl.BasicRacingProcedureImpl; -import com.sap.sailing.domain.racelog.state.racingprocedure.ess.impl.ESSRacingProcedureImpl; -import com.sap.sailing.domain.racelog.state.racingprocedure.gate.impl.GateStartRacingProcedureImpl; -import com.sap.sailing.domain.racelog.state.racingprocedure.rrs26.impl.RRS26RacingProcedureImpl; /** * Factory for creating {@link ReadOnlyRacingProcedure}s. @@ -36,7 +36,7 @@ public class ReadonlyRacingProcedureFactory implements RacingProcedureFactory { } protected ReadonlyRacingProcedure createProcedure(RacingProcedureType type, RaceLog raceLog, - RaceLogEventAuthor author, RaceLogEventFactory factory) { + AbstractLogEventAuthor author, RaceLogEventFactory factory) { RegattaConfiguration loadedConfiguration = configuration.load(); switch (type) { case ESS: @@ -56,7 +56,7 @@ public class ReadonlyRacingProcedureFactory implements RacingProcedureFactory { @Override public ReadonlyRacingProcedure createRacingProcedure(RacingProcedureType type, RaceLog raceLog) { // Just a mock author since we will never add anything to the racelog - RaceLogEventAuthor author = new RaceLogEventAuthorImpl("Illegal Author", 128); + AbstractLogEventAuthor author = new LogEventAuthorImpl("Illegal Author", 128); // Wrap the racelog to disable adding... RaceLog wrappedRaceLog = new NoAddingRaceLogWrapper(raceLog); return createProcedure(type, wrappedRaceLog, author, RaceLogEventFactory.INSTANCE); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/rrs26/RRS26ChangedListener.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/rrs26/RRS26ChangedListener.java new file mode 100644 index 00000000000..6d6ec045713 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/rrs26/RRS26ChangedListener.java @@ -0,0 +1,9 @@ +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26; + +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedureChangedListener; + +public interface RRS26ChangedListener extends RacingProcedureChangedListener { + + void onStartmodeChanged(ReadonlyRRS26RacingProcedure racingProcedure); + +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/rrs26/RRS26RacingProcedure.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/rrs26/RRS26RacingProcedure.java similarity index 60% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/rrs26/RRS26RacingProcedure.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/rrs26/RRS26RacingProcedure.java index 0494d4e2613..2072446d447 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/rrs26/RRS26RacingProcedure.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/rrs26/RRS26RacingProcedure.java @@ -1,7 +1,7 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure.rrs26; +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedure; import com.sap.sailing.domain.common.racelog.Flags; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedure; import com.sap.sse.common.TimePoint; public interface RRS26RacingProcedure extends ReadonlyRRS26RacingProcedure, RacingProcedure { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/rrs26/ReadonlyRRS26RacingProcedure.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/rrs26/ReadonlyRRS26RacingProcedure.java similarity index 71% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/rrs26/ReadonlyRRS26RacingProcedure.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/rrs26/ReadonlyRRS26RacingProcedure.java index 7057c79aaeb..27eba4b1ff9 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/rrs26/ReadonlyRRS26RacingProcedure.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/rrs26/ReadonlyRRS26RacingProcedure.java @@ -1,8 +1,8 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure.rrs26; +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ReadonlyRacingProcedure; import com.sap.sailing.domain.base.configuration.procedures.RRS26Configuration; import com.sap.sailing.domain.common.racelog.Flags; -import com.sap.sailing.domain.racelog.state.racingprocedure.ReadonlyRacingProcedure; public interface ReadonlyRRS26RacingProcedure extends ReadonlyRacingProcedure { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/rrs26/impl/BaseRRS26Prerequisite.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/rrs26/impl/BaseRRS26Prerequisite.java similarity index 59% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/rrs26/impl/BaseRRS26Prerequisite.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/rrs26/impl/BaseRRS26Prerequisite.java index f9d5ef8859f..f39a20e8728 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/rrs26/impl/BaseRRS26Prerequisite.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/rrs26/impl/BaseRRS26Prerequisite.java @@ -1,8 +1,8 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure.rrs26.impl; +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.impl; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedurePrerequisite; -import com.sap.sailing.domain.racelog.state.racingprocedure.impl.BaseRacingProcedurePrerequisite; -import com.sap.sailing.domain.racelog.state.racingprocedure.rrs26.RRS26RacingProcedure; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedurePrerequisite; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.BaseRacingProcedurePrerequisite; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.RRS26RacingProcedure; import com.sap.sse.common.TimePoint; /** diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/rrs26/impl/RRS26ChangedListeners.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/rrs26/impl/RRS26ChangedListeners.java new file mode 100644 index 00000000000..f200c474876 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/rrs26/impl/RRS26ChangedListeners.java @@ -0,0 +1,17 @@ +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.impl; + +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.RacingProcedureChangedListeners; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.RRS26ChangedListener; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.ReadonlyRRS26RacingProcedure; + +public class RRS26ChangedListeners extends RacingProcedureChangedListeners implements + RRS26ChangedListener { + + @Override + public void onStartmodeChanged(ReadonlyRRS26RacingProcedure racingProcedure) { + for (RRS26ChangedListener listener : getListeners()) { + listener.onStartmodeChanged(racingProcedure); + } + } + +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/rrs26/impl/RRS26RacingProcedureImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/rrs26/impl/RRS26RacingProcedureImpl.java similarity index 83% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/rrs26/impl/RRS26RacingProcedureImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/rrs26/impl/RRS26RacingProcedureImpl.java index 6966ea6a719..0ffd4522e5a 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/rrs26/impl/RRS26RacingProcedureImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/rrs26/impl/RRS26RacingProcedureImpl.java @@ -1,30 +1,30 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure.rrs26.impl; +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.impl; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventFactory; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RRS26StartModeFlagFinder; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RacingProcedureTypeAnalyzer; +import com.sap.sailing.domain.abstractlog.race.state.RaceStateEvent; +import com.sap.sailing.domain.abstractlog.race.state.impl.RaceStateEventImpl; +import com.sap.sailing.domain.abstractlog.race.state.impl.RaceStateEvents; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.FlagPoleState; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedureChangedListener; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedurePrerequisite; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedurePrerequisite.FulfillmentFunction; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.BaseRacingProcedure; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.NoMorePrerequisite; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.RacingProcedureChangedListeners; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.RRS26ChangedListener; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.RRS26RacingProcedure; import com.sap.sailing.domain.base.configuration.procedures.RRS26Configuration; import com.sap.sailing.domain.common.racelog.FlagPole; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RacingProcedureType; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventFactory; -import com.sap.sailing.domain.racelog.analyzing.impl.RRS26StartModeFlagFinder; -import com.sap.sailing.domain.racelog.analyzing.impl.RacingProcedureTypeAnalyzer; -import com.sap.sailing.domain.racelog.state.RaceStateEvent; -import com.sap.sailing.domain.racelog.state.impl.RaceStateEventImpl; -import com.sap.sailing.domain.racelog.state.impl.RaceStateEvents; -import com.sap.sailing.domain.racelog.state.racingprocedure.FlagPoleState; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedureChangedListener; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedurePrerequisite; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedurePrerequisite.FulfillmentFunction; -import com.sap.sailing.domain.racelog.state.racingprocedure.impl.BaseRacingProcedure; -import com.sap.sailing.domain.racelog.state.racingprocedure.impl.NoMorePrerequisite; -import com.sap.sailing.domain.racelog.state.racingprocedure.impl.RacingProcedureChangedListeners; -import com.sap.sailing.domain.racelog.state.racingprocedure.rrs26.RRS26ChangedListener; -import com.sap.sailing.domain.racelog.state.racingprocedure.rrs26.RRS26RacingProcedure; import com.sap.sse.common.TimePoint; public class RRS26RacingProcedureImpl extends BaseRacingProcedure implements RRS26RacingProcedure { @@ -38,7 +38,7 @@ public class RRS26RacingProcedureImpl extends BaseRacingProcedure implements RRS private Flags cachedStartmodeFlag; private boolean startmodeFlagHasBeenSet; - public RRS26RacingProcedureImpl(RaceLog raceLog, RaceLogEventAuthor author, + public RRS26RacingProcedureImpl(RaceLog raceLog, AbstractLogEventAuthor author, RaceLogEventFactory factory, RRS26Configuration configuration) { super(raceLog, author, factory, configuration); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/rrs26/impl/StartmodePrerequisite.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/rrs26/impl/StartmodePrerequisite.java similarity index 74% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/rrs26/impl/StartmodePrerequisite.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/rrs26/impl/StartmodePrerequisite.java index d696342d335..09376d7cc91 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/rrs26/impl/StartmodePrerequisite.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/rrs26/impl/StartmodePrerequisite.java @@ -1,8 +1,8 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure.rrs26.impl; +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.impl; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedurePrerequisite; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.RRS26RacingProcedure; import com.sap.sailing.domain.common.racelog.Flags; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedurePrerequisite; -import com.sap.sailing.domain.racelog.state.racingprocedure.rrs26.RRS26RacingProcedure; import com.sap.sse.common.TimePoint; public class StartmodePrerequisite extends BaseRRS26Prerequisite implements RacingProcedurePrerequisite { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/CloseOpenEndedDeviceMappingEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/CloseOpenEndedDeviceMappingEvent.java similarity index 81% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/CloseOpenEndedDeviceMappingEvent.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/CloseOpenEndedDeviceMappingEvent.java index d9a41392c6d..79967ff54df 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/CloseOpenEndedDeviceMappingEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/CloseOpenEndedDeviceMappingEvent.java @@ -1,9 +1,9 @@ -package com.sap.sailing.domain.racelog.tracking; +package com.sap.sailing.domain.abstractlog.race.tracking; import java.io.Serializable; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.Revokable; +import com.sap.sailing.domain.abstractlog.Revokable; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sse.common.TimePoint; /** diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/DefineMarkEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/DefineMarkEvent.java similarity index 57% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/DefineMarkEvent.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/DefineMarkEvent.java index 8434c919775..99409ee5e1c 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/DefineMarkEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/DefineMarkEvent.java @@ -1,8 +1,8 @@ -package com.sap.sailing.domain.racelog.tracking; +package com.sap.sailing.domain.abstractlog.race.tracking; +import com.sap.sailing.domain.abstractlog.Revokable; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.base.Mark; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.Revokable; /** * Defines a mark, that can then be used to build a course. diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/DenoteForTrackingEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/DenoteForTrackingEvent.java similarity index 73% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/DenoteForTrackingEvent.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/DenoteForTrackingEvent.java index afdf81449c7..6bda197053a 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/DenoteForTrackingEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/DenoteForTrackingEvent.java @@ -1,11 +1,11 @@ -package com.sap.sailing.domain.racelog.tracking; +package com.sap.sailing.domain.abstractlog.race.tracking; import java.io.Serializable; +import com.sap.sailing.domain.abstractlog.Revokable; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.base.BoatClass; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.Revokable; /** * The existence of this event in a {@link RaceLog} indicates that the necessary data diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/DeviceCompetitorMappingEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/DeviceCompetitorMappingEvent.java similarity index 68% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/DeviceCompetitorMappingEvent.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/DeviceCompetitorMappingEvent.java index a6b87fe3126..893d8ee5b7e 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/DeviceCompetitorMappingEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/DeviceCompetitorMappingEvent.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog.tracking; +package com.sap.sailing.domain.abstractlog.race.tracking; import com.sap.sailing.domain.base.Competitor; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/DeviceIdentifier.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/DeviceIdentifier.java similarity index 95% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/DeviceIdentifier.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/DeviceIdentifier.java index fe2290bdfda..88ba1ce69b7 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/DeviceIdentifier.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/DeviceIdentifier.java @@ -1,8 +1,8 @@ -package com.sap.sailing.domain.racelog.tracking; +package com.sap.sailing.domain.abstractlog.race.tracking; import java.io.Serializable; -import com.sap.sailing.domain.racelog.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLog; /** * Identifies any kind of tracking device. Should be implemented accordingly for different tracking diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/DeviceIdentifierSerializationHandler.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/DeviceIdentifierSerializationHandler.java similarity index 97% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/DeviceIdentifierSerializationHandler.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/DeviceIdentifierSerializationHandler.java index fcad12efeaf..3c898f3746f 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/DeviceIdentifierSerializationHandler.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/DeviceIdentifierSerializationHandler.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog.tracking; +package com.sap.sailing.domain.abstractlog.race.tracking; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; import com.sap.sse.common.Util; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/DeviceIdentifierStringSerializationHandler.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/DeviceIdentifierStringSerializationHandler.java similarity index 90% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/DeviceIdentifierStringSerializationHandler.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/DeviceIdentifierStringSerializationHandler.java index ab9b33eeebf..c92ed9308f8 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/DeviceIdentifierStringSerializationHandler.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/DeviceIdentifierStringSerializationHandler.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog.tracking; +package com.sap.sailing.domain.abstractlog.race.tracking; /** diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/DeviceMapping.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/DeviceMapping.java similarity index 81% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/DeviceMapping.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/DeviceMapping.java index f3030b571b5..76fe4547104 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/DeviceMapping.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/DeviceMapping.java @@ -1,11 +1,11 @@ -package com.sap.sailing.domain.racelog.tracking; +package com.sap.sailing.domain.abstractlog.race.tracking; import java.io.Serializable; import java.util.List; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.DeviceMappingFinder; import com.sap.sailing.domain.base.Timed; import com.sap.sailing.domain.common.TimeRange; -import com.sap.sailing.domain.racelog.tracking.analyzing.impl.DeviceMappingFinder; import com.sap.sse.common.WithID; /** diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/DeviceMappingEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/DeviceMappingEvent.java similarity index 83% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/DeviceMappingEvent.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/DeviceMappingEvent.java index ba7f14a21af..1b206ae2490 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/DeviceMappingEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/DeviceMappingEvent.java @@ -1,10 +1,10 @@ -package com.sap.sailing.domain.racelog.tracking; +package com.sap.sailing.domain.abstractlog.race.tracking; +import com.sap.sailing.domain.abstractlog.Revokable; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.DefinedMarkFinder; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Mark; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.Revokable; -import com.sap.sailing.domain.racelog.tracking.analyzing.impl.DefinedMarkFinder; import com.sap.sse.common.TimePoint; import com.sap.sse.common.WithID; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/DeviceMarkMappingEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/DeviceMarkMappingEvent.java similarity index 65% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/DeviceMarkMappingEvent.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/DeviceMarkMappingEvent.java index 6160fe62756..14b47983fb5 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/DeviceMarkMappingEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/DeviceMarkMappingEvent.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog.tracking; +package com.sap.sailing.domain.abstractlog.race.tracking; import com.sap.sailing.domain.base.Mark; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/DeviceWithTimeRange.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/DeviceWithTimeRange.java similarity index 78% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/DeviceWithTimeRange.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/DeviceWithTimeRange.java index 56a6e5c0bef..612501b8b4e 100755 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/DeviceWithTimeRange.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/DeviceWithTimeRange.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog.tracking; +package com.sap.sailing.domain.abstractlog.race.tracking; import com.sap.sailing.domain.base.Timed; import com.sap.sailing.domain.common.TimeRange; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/PlaceHolderDeviceIdentifier.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/PlaceHolderDeviceIdentifier.java similarity index 94% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/PlaceHolderDeviceIdentifier.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/PlaceHolderDeviceIdentifier.java index e3c6a87e05a..8f7b2fb7640 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/PlaceHolderDeviceIdentifier.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/PlaceHolderDeviceIdentifier.java @@ -1,6 +1,6 @@ -package com.sap.sailing.domain.racelog.tracking; +package com.sap.sailing.domain.abstractlog.race.tracking; -import com.sap.sailing.domain.racelog.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLog; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/RegisterCompetitorEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RegisterCompetitorEvent.java similarity index 72% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/RegisterCompetitorEvent.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RegisterCompetitorEvent.java index 04c97190435..af42482ae87 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/RegisterCompetitorEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RegisterCompetitorEvent.java @@ -1,9 +1,9 @@ -package com.sap.sailing.domain.racelog.tracking; +package com.sap.sailing.domain.abstractlog.race.tracking; +import com.sap.sailing.domain.abstractlog.Revokable; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.Revokable; import com.sap.sse.common.IsManagedByCache; /** diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/SmartphoneUUIDIdentifier.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/SmartphoneUUIDIdentifier.java similarity index 73% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/SmartphoneUUIDIdentifier.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/SmartphoneUUIDIdentifier.java index 7b2d16103d6..5ebd8514ba9 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/SmartphoneUUIDIdentifier.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/SmartphoneUUIDIdentifier.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog.tracking; +package com.sap.sailing.domain.abstractlog.race.tracking; import java.util.UUID; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/SmartphoneUUIDSerializationHandler.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/SmartphoneUUIDSerializationHandler.java similarity index 88% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/SmartphoneUUIDSerializationHandler.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/SmartphoneUUIDSerializationHandler.java index 536baad73bb..80cdd5e9d35 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/SmartphoneUUIDSerializationHandler.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/SmartphoneUUIDSerializationHandler.java @@ -1,9 +1,9 @@ -package com.sap.sailing.domain.racelog.tracking; +package com.sap.sailing.domain.abstractlog.race.tracking; import java.util.UUID; +import com.sap.sailing.domain.abstractlog.race.tracking.impl.SmartphoneUUIDIdentifierImpl; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; -import com.sap.sailing.domain.racelog.tracking.impl.SmartphoneUUIDIdentifierImpl; import com.sap.sse.common.Util; public class SmartphoneUUIDSerializationHandler { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/StartTrackingEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/StartTrackingEvent.java similarity index 50% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/StartTrackingEvent.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/StartTrackingEvent.java index de7c0c166ac..dfcf855a21b 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/StartTrackingEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/StartTrackingEvent.java @@ -1,9 +1,9 @@ -package com.sap.sailing.domain.racelog.tracking; +package com.sap.sailing.domain.abstractlog.race.tracking; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.Revokable; -import com.sap.sailing.domain.racelog.tracking.events.DeviceCompetitorMappingEventImpl; +import com.sap.sailing.domain.abstractlog.Revokable; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.events.DeviceCompetitorMappingEventImpl; /** * Closes the phase during which {@link DeviceCompetitorMappingEventImpl}s actually result diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/analyzing/impl/AllEventsOfTypeFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/AllEventsOfTypeFinder.java similarity index 68% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/analyzing/impl/AllEventsOfTypeFinder.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/AllEventsOfTypeFinder.java index 1edf0fca849..71d9a12fd88 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/analyzing/impl/AllEventsOfTypeFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/AllEventsOfTypeFinder.java @@ -1,11 +1,11 @@ -package com.sap.sailing.domain.racelog.tracking.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl; import java.util.ArrayList; import java.util.List; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.analyzing.impl.RaceLogAnalyzer; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogAnalyzer; /** * Finds all events in the racelog which is an {@code instanceof} {@link #ofType}. @@ -25,7 +25,7 @@ public class AllEventsOfTypeFinder extends RaceLogAnalyzer> { @Override protected List performAnalysis() { List result = new ArrayList(); - Iterable set = onlyUnrevoked ? raceLog.getUnrevokedEventsDescending() : getAllEventsDescending(); + Iterable set = onlyUnrevoked ? getLog().getUnrevokedEventsDescending() : getAllEventsDescending(); for (RaceLogEvent event : set) { if (ofType.isAssignableFrom(event.getClass())) { result.add(event); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/analyzing/impl/DefinedMarkFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/DefinedMarkFinder.java similarity index 59% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/analyzing/impl/DefinedMarkFinder.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/DefinedMarkFinder.java index 5bd0b68e005..4668fcda955 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/analyzing/impl/DefinedMarkFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/DefinedMarkFinder.java @@ -1,14 +1,14 @@ -package com.sap.sailing.domain.racelog.tracking.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogAnalyzer; +import com.sap.sailing.domain.abstractlog.race.tracking.DefineMarkEvent; import com.sap.sailing.domain.base.Mark; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.analyzing.impl.RaceLogAnalyzer; -import com.sap.sailing.domain.racelog.tracking.DefineMarkEvent; public class DefinedMarkFinder extends RaceLogAnalyzer> { public DefinedMarkFinder(RaceLog raceLog) { @@ -18,7 +18,7 @@ public class DefinedMarkFinder extends RaceLogAnalyzer> { @Override protected Collection performAnalysis() { List< Mark> result = new ArrayList(); - for (RaceLogEvent event : raceLog.getUnrevokedEvents()) { + for (RaceLogEvent event : getLog().getUnrevokedEvents()) { if (event instanceof DefineMarkEvent) { DefineMarkEvent dME = (DefineMarkEvent) event; result.add(dME.getMark()); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/analyzing/impl/DeviceCompetitorMappingFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/DeviceCompetitorMappingFinder.java similarity index 55% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/analyzing/impl/DeviceCompetitorMappingFinder.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/DeviceCompetitorMappingFinder.java index 6e177a3e5fc..2e9f75358cb 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/analyzing/impl/DeviceCompetitorMappingFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/DeviceCompetitorMappingFinder.java @@ -1,9 +1,9 @@ -package com.sap.sailing.domain.racelog.tracking.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceCompetitorMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMappingEvent; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.tracking.DeviceCompetitorMappingEvent; -import com.sap.sailing.domain.racelog.tracking.DeviceMappingEvent; public class DeviceCompetitorMappingFinder extends DeviceMappingFinder { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/analyzing/impl/DeviceMappingFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/DeviceMappingFinder.java similarity index 79% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/analyzing/impl/DeviceMappingFinder.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/DeviceMappingFinder.java index ca10563db56..1296105e346 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/analyzing/impl/DeviceMappingFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/DeviceMappingFinder.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog.tracking.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl; import java.io.Serializable; import java.util.ArrayList; @@ -6,17 +6,18 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.logging.Logger; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogAnalyzer; +import com.sap.sailing.domain.abstractlog.race.tracking.CloseOpenEndedDeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMapping; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.impl.DeviceMappingImpl; import com.sap.sailing.domain.common.TimeRange; import com.sap.sailing.domain.common.impl.TimeRangeImpl; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.analyzing.impl.RaceLogAnalyzer; -import com.sap.sailing.domain.racelog.tracking.CloseOpenEndedDeviceMappingEvent; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; -import com.sap.sailing.domain.racelog.tracking.DeviceMapping; -import com.sap.sailing.domain.racelog.tracking.DeviceMappingEvent; -import com.sap.sailing.domain.racelog.tracking.impl.DeviceMappingImpl; import com.sap.sse.common.TimePoint; import com.sap.sse.common.WithID; @@ -34,6 +35,8 @@ import com.sap.sse.common.WithID; * according {@code CloseOpenEndedDeviceMappingEvent} exists. */ public class DeviceMappingFinder extends RaceLogAnalyzer>>> { + private static Logger logger = Logger.getLogger(DeviceMappingFinder.class.getName()); + public DeviceMappingFinder(RaceLog raceLog) { super(raceLog); } @@ -62,7 +65,7 @@ public class DeviceMappingFinder extends RaceLogAnalyzer>> mappings = new HashMap>>(); Map closingEvents = new HashMap(); - for (RaceLogEvent e : raceLog.getUnrevokedEvents()) { + for (RaceLogEvent e : getLog().getUnrevokedEvents()) { if (e instanceof DeviceMappingEvent && isValidMapping(((DeviceMappingEvent) e))) { @SuppressWarnings("unchecked") DeviceMappingEvent mappingEvent = (DeviceMappingEvent) e; @@ -90,7 +93,7 @@ public class DeviceMappingFinder extends RaceLogAnalyzer { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/analyzing/impl/LastEventOfTypeFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/LastEventOfTypeFinder.java similarity index 65% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/analyzing/impl/LastEventOfTypeFinder.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/LastEventOfTypeFinder.java index 16546f027c8..b65f260aa44 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/analyzing/impl/LastEventOfTypeFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/LastEventOfTypeFinder.java @@ -1,8 +1,8 @@ -package com.sap.sailing.domain.racelog.tracking.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.analyzing.impl.RaceLogAnalyzer; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogAnalyzer; /** * Finds the most recent event in the racelog which is an {@code instanceof} {@link #ofType}. @@ -21,7 +21,7 @@ public class LastEventOfTypeFinder extends RaceLogAnalyzer { @Override protected RaceLogEvent performAnalysis() { - Iterable set = onlyUnrevoked ? raceLog.getUnrevokedEventsDescending() : getAllEventsDescending(); + Iterable set = onlyUnrevoked ? getLog().getUnrevokedEventsDescending() : getAllEventsDescending(); for (RaceLogEvent event : set) { if (ofType.isAssignableFrom(event.getClass())) { return event; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/analyzing/impl/LastPingMappingEventFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/LastPingMappingEventFinder.java similarity index 69% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/analyzing/impl/LastPingMappingEventFinder.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/LastPingMappingEventFinder.java index b2e446a55c0..1e1fe3db773 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/analyzing/impl/LastPingMappingEventFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/LastPingMappingEventFinder.java @@ -1,9 +1,9 @@ -package com.sap.sailing.domain.racelog.tracking.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.analyzing.impl.RaceLogAnalyzer; -import com.sap.sailing.domain.racelog.tracking.DeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogAnalyzer; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMappingEvent; import com.sap.sse.common.WithID; public class LastPingMappingEventFinder extends RaceLogAnalyzer> { @@ -16,7 +16,7 @@ public class LastPingMappingEventFinder extends RaceLogAnalyze @Override protected DeviceMappingEvent performAnalysis() { - for (RaceLogEvent e : raceLog.getUnrevokedEventsDescending()) { + for (RaceLogEvent e : getLog().getUnrevokedEventsDescending()) { if (e instanceof DeviceMappingEvent) { DeviceMappingEvent mappingEvent = (DeviceMappingEvent) e; if (item.equals(mappingEvent.getMappedTo()) && mappingEvent.getFrom() != null && diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/analyzing/impl/OpenEndedDeviceMappingCloser.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/OpenEndedDeviceMappingCloser.java similarity index 61% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/analyzing/impl/OpenEndedDeviceMappingCloser.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/OpenEndedDeviceMappingCloser.java index 321454b43e3..af8b1983fa4 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/analyzing/impl/OpenEndedDeviceMappingCloser.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/OpenEndedDeviceMappingCloser.java @@ -1,16 +1,16 @@ -package com.sap.sailing.domain.racelog.tracking.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl; import java.io.Serializable; import java.util.ArrayList; import java.util.List; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventFactory; -import com.sap.sailing.domain.racelog.analyzing.impl.RaceLogAnalyzer; -import com.sap.sailing.domain.racelog.tracking.CloseOpenEndedDeviceMappingEvent; -import com.sap.sailing.domain.racelog.tracking.DeviceMapping; -import com.sap.sailing.domain.racelog.tracking.DeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventFactory; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogAnalyzer; +import com.sap.sailing.domain.abstractlog.race.tracking.CloseOpenEndedDeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMapping; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMappingEvent; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; @@ -22,10 +22,10 @@ import com.sap.sse.common.impl.MillisecondsTimePoint; */ public class OpenEndedDeviceMappingCloser extends RaceLogAnalyzer> { private final DeviceMapping mapping; - private final RaceLogEventAuthor author; + private final AbstractLogEventAuthor author; private final TimePoint closingTimePoint; - public OpenEndedDeviceMappingCloser(RaceLog raceLog, DeviceMapping mapping, RaceLogEventAuthor author, + public OpenEndedDeviceMappingCloser(RaceLog raceLog, DeviceMapping mapping, AbstractLogEventAuthor author, TimePoint closingTimePoint) { super(raceLog); this.mapping = mapping; @@ -38,10 +38,10 @@ public class OpenEndedDeviceMappingCloser extends RaceLogAnalyzer result = new ArrayList(); for (Serializable eventId : mapping.getOriginalRaceLogEventIds()) { - DeviceMappingEvent event = (DeviceMappingEvent) raceLog.getEventById(eventId); + DeviceMappingEvent event = (DeviceMappingEvent) getLog().getEventById(eventId); if (event.getFrom() == null || event.getTo() == null) { result.add(RaceLogEventFactory.INSTANCE.createCloseOpenEndedDeviceMappingEvent( - MillisecondsTimePoint.now(), author, raceLog.getCurrentPassId(), event.getId(), closingTimePoint)); + MillisecondsTimePoint.now(), author, getLog().getCurrentPassId(), event.getId(), closingTimePoint)); } } return result; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/analyzing/impl/RaceInformationFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceInformationFinder.java similarity index 55% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/analyzing/impl/RaceInformationFinder.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceInformationFinder.java index a21e518d268..a1cb846d4e7 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/analyzing/impl/RaceInformationFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceInformationFinder.java @@ -1,9 +1,9 @@ -package com.sap.sailing.domain.racelog.tracking.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.analyzing.impl.RaceLogAnalyzer; -import com.sap.sailing.domain.racelog.tracking.DenoteForTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogAnalyzer; +import com.sap.sailing.domain.abstractlog.race.tracking.DenoteForTrackingEvent; public class RaceInformationFinder extends RaceLogAnalyzer { public RaceInformationFinder(RaceLog raceLog) { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/analyzing/impl/RaceLogTrackingStateAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceLogTrackingStateAnalyzer.java similarity index 57% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/analyzing/impl/RaceLogTrackingStateAnalyzer.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceLogTrackingStateAnalyzer.java index 5a4f72d4ffb..fd6026c4f8a 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/analyzing/impl/RaceLogTrackingStateAnalyzer.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceLogTrackingStateAnalyzer.java @@ -1,11 +1,11 @@ -package com.sap.sailing.domain.racelog.tracking.analyzing.impl; +package com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogAnalyzer; +import com.sap.sailing.domain.abstractlog.race.tracking.DenoteForTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.StartTrackingEvent; import com.sap.sailing.domain.common.racelog.tracking.RaceLogTrackingState; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.analyzing.impl.RaceLogAnalyzer; -import com.sap.sailing.domain.racelog.tracking.DenoteForTrackingEvent; -import com.sap.sailing.domain.racelog.tracking.StartTrackingEvent; public class RaceLogTrackingStateAnalyzer extends RaceLogAnalyzer { @@ -15,7 +15,7 @@ public class RaceLogTrackingStateAnalyzer extends RaceLogAnalyzer performAnalysis() { Set result = new HashSet(); - for (RaceLogEvent event : getRaceLog().getUnrevokedEvents()) { + for (RaceLogEvent event : getLog().getUnrevokedEvents()) { if (event instanceof RegisterCompetitorEvent) { result.add(((RegisterCompetitorEvent) event).getCompetitor()); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/events/AbstractDeviceMappingEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/events/AbstractDeviceMappingEventImpl.java similarity index 73% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/events/AbstractDeviceMappingEventImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/events/AbstractDeviceMappingEventImpl.java index b0a2970f454..84318b98880 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/events/AbstractDeviceMappingEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/events/AbstractDeviceMappingEventImpl.java @@ -1,13 +1,13 @@ -package com.sap.sailing.domain.racelog.tracking.events; +package com.sap.sailing.domain.abstractlog.race.tracking.events; import java.io.Serializable; import java.util.Collections; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventImpl; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMappingEvent; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.impl.RaceLogEventImpl; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; -import com.sap.sailing.domain.racelog.tracking.DeviceMappingEvent; import com.sap.sse.common.TimePoint; import com.sap.sse.common.WithID; @@ -20,7 +20,7 @@ DeviceMappingEvent { private final TimePoint from; private final TimePoint to; - public AbstractDeviceMappingEventImpl(TimePoint createdAt, RaceLogEventAuthor author, + public AbstractDeviceMappingEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, int pPassId, ItemType mappedTo, DeviceIdentifier device, TimePoint from, TimePoint to) { super(createdAt, author, logicalTimePoint, pId, Collections.emptyList(), pPassId); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/events/CloseOpenEndedDeviceMappingEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/events/CloseOpenEndedDeviceMappingEventImpl.java similarity index 75% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/events/CloseOpenEndedDeviceMappingEventImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/events/CloseOpenEndedDeviceMappingEventImpl.java index a7c080b2d1d..a0172105878 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/events/CloseOpenEndedDeviceMappingEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/events/CloseOpenEndedDeviceMappingEventImpl.java @@ -1,13 +1,13 @@ -package com.sap.sailing.domain.racelog.tracking.events; +package com.sap.sailing.domain.abstractlog.race.tracking.events; import java.io.Serializable; import java.util.Collections; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventImpl; +import com.sap.sailing.domain.abstractlog.race.tracking.CloseOpenEndedDeviceMappingEvent; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; -import com.sap.sailing.domain.racelog.impl.RaceLogEventImpl; -import com.sap.sailing.domain.racelog.tracking.CloseOpenEndedDeviceMappingEvent; import com.sap.sse.common.TimePoint; public class CloseOpenEndedDeviceMappingEventImpl extends RaceLogEventImpl implements CloseOpenEndedDeviceMappingEvent { @@ -16,7 +16,7 @@ public class CloseOpenEndedDeviceMappingEventImpl extends RaceLogEventImpl imple private final Serializable deviceMappingEventId; private final TimePoint closingTimePoint; - public CloseOpenEndedDeviceMappingEventImpl(TimePoint createdAt, RaceLogEventAuthor author, + public CloseOpenEndedDeviceMappingEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, int pPassId, Serializable deviceMappingEventId, TimePoint closingTimePoint) { super(createdAt, author, logicalTimePoint, pId, Collections.emptyList(), pPassId); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/events/DefineMarkEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/events/DefineMarkEventImpl.java similarity index 62% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/events/DefineMarkEventImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/events/DefineMarkEventImpl.java index bb4c37f852c..7bd86161414 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/events/DefineMarkEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/events/DefineMarkEventImpl.java @@ -1,14 +1,14 @@ -package com.sap.sailing.domain.racelog.tracking.events; +package com.sap.sailing.domain.abstractlog.race.tracking.events; import java.io.Serializable; import java.util.Collections; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventImpl; +import com.sap.sailing.domain.abstractlog.race.tracking.DefineMarkEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Mark; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; -import com.sap.sailing.domain.racelog.impl.RaceLogEventImpl; -import com.sap.sailing.domain.racelog.tracking.DefineMarkEvent; import com.sap.sse.common.TimePoint; public class DefineMarkEventImpl extends RaceLogEventImpl implements DefineMarkEvent { @@ -16,7 +16,7 @@ public class DefineMarkEventImpl extends RaceLogEventImpl implements DefineMarkE private final Mark mark; - public DefineMarkEventImpl(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + public DefineMarkEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, int pPassId, Mark mark) { super(createdAt, author, logicalTimePoint, pId, Collections.emptyList(), pPassId); this.mark = mark; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/events/DenoteForTrackingEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/events/DenoteForTrackingEventImpl.java similarity index 72% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/events/DenoteForTrackingEventImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/events/DenoteForTrackingEventImpl.java index 18b1ced0df3..465a6625825 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/events/DenoteForTrackingEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/events/DenoteForTrackingEventImpl.java @@ -1,14 +1,14 @@ -package com.sap.sailing.domain.racelog.tracking.events; +package com.sap.sailing.domain.abstractlog.race.tracking.events; import java.io.Serializable; import java.util.Collections; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventImpl; +import com.sap.sailing.domain.abstractlog.race.tracking.DenoteForTrackingEvent; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; -import com.sap.sailing.domain.racelog.impl.RaceLogEventImpl; -import com.sap.sailing.domain.racelog.tracking.DenoteForTrackingEvent; import com.sap.sse.common.TimePoint; public class DenoteForTrackingEventImpl extends RaceLogEventImpl implements @@ -20,7 +20,7 @@ DenoteForTrackingEvent { private final Serializable raceId; public DenoteForTrackingEventImpl(TimePoint createdAt, - RaceLogEventAuthor author, TimePoint logicalTimePoint, + AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, int pPassId, String raceName, BoatClass boatClass, Serializable raceId) { super(createdAt, author, logicalTimePoint, pId, Collections.emptyList(), pPassId); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/events/DeviceCompetitorMappingEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/events/DeviceCompetitorMappingEventImpl.java similarity index 61% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/events/DeviceCompetitorMappingEventImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/events/DeviceCompetitorMappingEventImpl.java index 4de94c3dde5..a4100857b52 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/events/DeviceCompetitorMappingEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/events/DeviceCompetitorMappingEventImpl.java @@ -1,17 +1,17 @@ -package com.sap.sailing.domain.racelog.tracking.events; +package com.sap.sailing.domain.abstractlog.race.tracking.events; import java.io.Serializable; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceCompetitorMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; -import com.sap.sailing.domain.racelog.tracking.DeviceCompetitorMappingEvent; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; import com.sap.sse.common.TimePoint; public class DeviceCompetitorMappingEventImpl extends AbstractDeviceMappingEventImpl implements DeviceCompetitorMappingEvent { - public DeviceCompetitorMappingEventImpl(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + public DeviceCompetitorMappingEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, int pPassId, Competitor mappedTo, DeviceIdentifier device, TimePoint from, TimePoint to) { super(createdAt, author, logicalTimePoint, pId, pPassId, mappedTo, device, from, to); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/events/DeviceMarkMappingEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/events/DeviceMarkMappingEventImpl.java similarity index 55% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/events/DeviceMarkMappingEventImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/events/DeviceMarkMappingEventImpl.java index 42990a183ad..c22ec2d4086 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/events/DeviceMarkMappingEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/events/DeviceMarkMappingEventImpl.java @@ -1,17 +1,17 @@ -package com.sap.sailing.domain.racelog.tracking.events; +package com.sap.sailing.domain.abstractlog.race.tracking.events; import java.io.Serializable; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMarkMappingEvent; import com.sap.sailing.domain.base.Mark; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; -import com.sap.sailing.domain.racelog.tracking.DeviceMarkMappingEvent; import com.sap.sse.common.TimePoint; public class DeviceMarkMappingEventImpl extends AbstractDeviceMappingEventImpl implements DeviceMarkMappingEvent { - public DeviceMarkMappingEventImpl(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + public DeviceMarkMappingEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, int pPassId, Mark mappedTo, DeviceIdentifier device, TimePoint from, TimePoint to) { super(createdAt, author, logicalTimePoint, pId, pPassId, mappedTo, device, from, to); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/events/RegisterCompetitorEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/events/RegisterCompetitorEventImpl.java similarity index 63% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/events/RegisterCompetitorEventImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/events/RegisterCompetitorEventImpl.java index 6d91da77781..667e99da2d6 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/events/RegisterCompetitorEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/events/RegisterCompetitorEventImpl.java @@ -1,19 +1,19 @@ -package com.sap.sailing.domain.racelog.tracking.events; +package com.sap.sailing.domain.abstractlog.race.tracking.events; import java.io.Serializable; import java.util.Collections; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventImpl; +import com.sap.sailing.domain.abstractlog.race.tracking.RegisterCompetitorEvent; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; -import com.sap.sailing.domain.racelog.impl.RaceLogEventImpl; -import com.sap.sailing.domain.racelog.tracking.RegisterCompetitorEvent; import com.sap.sse.common.TimePoint; public class RegisterCompetitorEventImpl extends RaceLogEventImpl implements RegisterCompetitorEvent { private static final long serialVersionUID = -30864810737555657L; - public RegisterCompetitorEventImpl(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + public RegisterCompetitorEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, int pPassId, Competitor competitor) { super(createdAt, author, logicalTimePoint, pId, Collections.singletonList(competitor), pPassId); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/events/StartTrackingEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/events/StartTrackingEventImpl.java similarity index 56% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/events/StartTrackingEventImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/events/StartTrackingEventImpl.java index f4567c8e66d..aece2279488 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/events/StartTrackingEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/events/StartTrackingEventImpl.java @@ -1,20 +1,20 @@ -package com.sap.sailing.domain.racelog.tracking.events; +package com.sap.sailing.domain.abstractlog.race.tracking.events; import java.io.Serializable; import java.util.Collections; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventImpl; +import com.sap.sailing.domain.abstractlog.race.tracking.StartTrackingEvent; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.racelog.RaceLogEventVisitor; -import com.sap.sailing.domain.racelog.impl.RaceLogEventImpl; -import com.sap.sailing.domain.racelog.tracking.StartTrackingEvent; import com.sap.sse.common.TimePoint; public class StartTrackingEventImpl extends RaceLogEventImpl implements StartTrackingEvent { private static final long serialVersionUID = 6017954368580125221L; - public StartTrackingEventImpl(TimePoint createdAt, RaceLogEventAuthor author, + public StartTrackingEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, int pPassId) { super(createdAt, author, logicalTimePoint, pId, Collections.emptyList(), pPassId); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/impl/DeviceMappingImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/DeviceMappingImpl.java similarity index 86% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/impl/DeviceMappingImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/DeviceMappingImpl.java index d6905335ae9..838450a7753 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/impl/DeviceMappingImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/DeviceMappingImpl.java @@ -1,14 +1,14 @@ -package com.sap.sailing.domain.racelog.tracking.impl; +package com.sap.sailing.domain.abstractlog.race.tracking.impl; import java.io.Serializable; import java.util.ArrayList; import java.util.List; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMapping; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMappingEvent; import com.sap.sailing.domain.common.TimeRange; import com.sap.sailing.domain.common.impl.TimeRangeImpl; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; -import com.sap.sailing.domain.racelog.tracking.DeviceMapping; -import com.sap.sailing.domain.racelog.tracking.DeviceMappingEvent; import com.sap.sse.common.TimePoint; import com.sap.sse.common.WithID; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/impl/PlaceHolderDeviceIdentifierSerializationHandler.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/PlaceHolderDeviceIdentifierSerializationHandler.java similarity index 83% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/impl/PlaceHolderDeviceIdentifierSerializationHandler.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/PlaceHolderDeviceIdentifierSerializationHandler.java index 469c94f8ac0..0ac2494b630 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/impl/PlaceHolderDeviceIdentifierSerializationHandler.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/PlaceHolderDeviceIdentifierSerializationHandler.java @@ -1,8 +1,8 @@ -package com.sap.sailing.domain.racelog.tracking.impl; +package com.sap.sailing.domain.abstractlog.race.tracking.impl; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; +import com.sap.sailing.domain.abstractlog.race.tracking.PlaceHolderDeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; -import com.sap.sailing.domain.racelog.tracking.PlaceHolderDeviceIdentifier; import com.sap.sse.common.Util; /** diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/impl/SmartphoneUUIDIdentifierImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/SmartphoneUUIDIdentifierImpl.java similarity index 86% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/impl/SmartphoneUUIDIdentifierImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/SmartphoneUUIDIdentifierImpl.java index 27bedb74bf7..5e184f116a8 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/tracking/impl/SmartphoneUUIDIdentifierImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/SmartphoneUUIDIdentifierImpl.java @@ -1,8 +1,8 @@ -package com.sap.sailing.domain.racelog.tracking.impl; +package com.sap.sailing.domain.abstractlog.race.tracking.impl; import java.util.UUID; -import com.sap.sailing.domain.racelog.tracking.SmartphoneUUIDIdentifier; +import com.sap.sailing.domain.abstractlog.race.tracking.SmartphoneUUIDIdentifier; public class SmartphoneUUIDIdentifierImpl implements SmartphoneUUIDIdentifier { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/RegattaLog.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/RegattaLog.java new file mode 100644 index 00000000000..9630398be8e --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/RegattaLog.java @@ -0,0 +1,21 @@ +package com.sap.sailing.domain.abstractlog.regatta; + +import com.sap.sailing.domain.abstractlog.AbstractLog; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.tracking.Track; +import com.sap.sse.common.WithID; + +/** + * Special kind of {@link Track} for recording {@link RegattaLogEvent}s. + * + *

+ * Use {@link RaceLog#getRawFixes()} to receive all events in a {@link RaceLog}. + *

+ * + *

+ * Implementations should use the {@link RegattaLogEventComparator} for sorting its content. + *

+ */ +public interface RegattaLog extends AbstractLog, WithID { + +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/RegattaLogEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/RegattaLogEvent.java new file mode 100644 index 00000000000..cfa42dc8584 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/RegattaLogEvent.java @@ -0,0 +1,7 @@ +package com.sap.sailing.domain.abstractlog.regatta; + +import com.sap.sailing.domain.abstractlog.AbstractLogEvent; + +public interface RegattaLogEvent extends AbstractLogEvent { + +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/RegattaLogEventFactory.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/RegattaLogEventFactory.java new file mode 100644 index 00000000000..33095eb446f --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/RegattaLogEventFactory.java @@ -0,0 +1,10 @@ +package com.sap.sailing.domain.abstractlog.regatta; + +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.regatta.impl.RegattaLogEventFactoryImpl; + +public interface RegattaLogEventFactory { + RegattaLogEventFactory INSTANCE = new RegattaLogEventFactoryImpl(); + + RegattaLogRevokeEvent createRevokeEvent(AbstractLogEventAuthor author, RegattaLogEvent toRevoke, String reason); +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/RegattaLogEventRestoreFactory.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/RegattaLogEventRestoreFactory.java new file mode 100644 index 00000000000..ad465b8097c --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/RegattaLogEventRestoreFactory.java @@ -0,0 +1,15 @@ +package com.sap.sailing.domain.abstractlog.regatta; + +import java.io.Serializable; + +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.regatta.impl.RegattaLogEventRestoreFactoryImpl; +import com.sap.sse.common.TimePoint; + +public interface RegattaLogEventRestoreFactory extends RegattaLogEventFactory { + RegattaLogEventRestoreFactory INSTANCE = new RegattaLogEventRestoreFactoryImpl(); + + RegattaLogRevokeEvent createRevokeEvent(TimePoint createdAt, AbstractLogEventAuthor author, + TimePoint logicalTimePoint, Serializable pId, Serializable revokedEventId, + String revokedEventType, String revokedEventShortInfo, String reason); +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/RegattaLogEventVisitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/RegattaLogEventVisitor.java new file mode 100644 index 00000000000..b0efda50fbd --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/RegattaLogEventVisitor.java @@ -0,0 +1,7 @@ +package com.sap.sailing.domain.abstractlog.regatta; + + + +public interface RegattaLogEventVisitor { + void visit(RegattaLogRevokeEvent event); +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/RegattaLogRevokeEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/RegattaLogRevokeEvent.java new file mode 100644 index 00000000000..d8aea7f4c44 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/RegattaLogRevokeEvent.java @@ -0,0 +1,7 @@ +package com.sap.sailing.domain.abstractlog.regatta; + +import com.sap.sailing.domain.abstractlog.RevokeEvent; + +public interface RegattaLogRevokeEvent extends RevokeEvent, RegattaLogEvent { + +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/impl/RegattaLogEventFactoryImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/impl/RegattaLogEventFactoryImpl.java new file mode 100644 index 00000000000..6f62457cde8 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/impl/RegattaLogEventFactoryImpl.java @@ -0,0 +1,18 @@ +package com.sap.sailing.domain.abstractlog.regatta.impl; + +import java.util.UUID; + +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventFactory; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLogRevokeEvent; +import com.sap.sse.common.impl.MillisecondsTimePoint; + +public class RegattaLogEventFactoryImpl implements RegattaLogEventFactory { + + @Override + public RegattaLogRevokeEvent createRevokeEvent(AbstractLogEventAuthor author, RegattaLogEvent toRevoke, String reason) { + return new RegattaLogRevokeEventImpl(MillisecondsTimePoint.now(), author, MillisecondsTimePoint.now(), + UUID.randomUUID(), toRevoke.getId(), toRevoke.getClass().getName(), toRevoke.getShortInfo(), reason); + } +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/impl/RegattaLogEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/impl/RegattaLogEventImpl.java new file mode 100644 index 00000000000..603fd909f59 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/impl/RegattaLogEventImpl.java @@ -0,0 +1,19 @@ +package com.sap.sailing.domain.abstractlog.regatta.impl; + +import java.io.Serializable; + +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.impl.AbstractLogEventImpl; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; +import com.sap.sse.common.TimePoint; + +public abstract class RegattaLogEventImpl extends AbstractLogEventImpl implements RegattaLogEvent { + + private static final long serialVersionUID = -2557594972618769182L; + + public RegattaLogEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, + Serializable pId) { + super(createdAt, author, logicalTimePoint, pId); + } +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/impl/RegattaLogEventRestoreFactoryImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/impl/RegattaLogEventRestoreFactoryImpl.java new file mode 100644 index 00000000000..e5cfbd0a454 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/impl/RegattaLogEventRestoreFactoryImpl.java @@ -0,0 +1,16 @@ +package com.sap.sailing.domain.abstractlog.regatta.impl; + +import java.io.Serializable; + +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventRestoreFactory; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLogRevokeEvent; +import com.sap.sse.common.TimePoint; + +public class RegattaLogEventRestoreFactoryImpl extends RegattaLogEventFactoryImpl implements RegattaLogEventRestoreFactory { + @Override + public RegattaLogRevokeEvent createRevokeEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, + Serializable pId, Serializable revokedEventId, String revokedEventType, String revokedEventShortInfo, String reason) { + return new RegattaLogRevokeEventImpl(createdAt, author, logicalTimePoint, pId, revokedEventId, revokedEventType, revokedEventShortInfo, reason); + } +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/impl/RegattaLogImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/impl/RegattaLogImpl.java new file mode 100644 index 00000000000..19763031bb5 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/impl/RegattaLogImpl.java @@ -0,0 +1,47 @@ +package com.sap.sailing.domain.abstractlog.regatta.impl; + +import java.io.Serializable; + +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.impl.AbstractLogEventComparator; +import com.sap.sailing.domain.abstractlog.impl.AbstractLogImpl; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventComparator; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventFactory; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; +import com.sap.sailing.domain.tracking.Track; +import com.sap.sailing.domain.tracking.impl.TrackImpl; + +/** + * {@link Track} implementation for {@link RaceLogEvent}s. + * + *

+ * "Fix" validity is decided based on the {@link #getCurrentPassId() current pass}. The validity is not cached. + *

+ * + *

+ * {@link TrackImpl#getDummyFix(com.sap.sailing.domain.common.TimePoint)} is not overridden, see + * {@link RaceLogEventComparator} for sorting when interface methods like + * {@link Track#getFirstFixAfter(com.sap.sailing.domain.common.TimePoint)} are used. + *

+ * + */ +public class RegattaLogImpl extends AbstractLogImpl implements RegattaLog { + + private static final long serialVersionUID = 98032278604708475L; + + public RegattaLogImpl(Serializable identifier) { + super(identifier, new AbstractLogEventComparator()); + } + + public RegattaLogImpl(String nameForReadWriteLock, Serializable identifier) { + super(nameForReadWriteLock, identifier, new AbstractLogEventComparator()); + } + + @Override + protected RegattaLogEvent createRevokeEvent(AbstractLogEventAuthor author, RegattaLogEvent toRevoke, String reason) { + return RegattaLogEventFactory.INSTANCE.createRevokeEvent(author, toRevoke, reason); + } +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/impl/RegattaLogRevokeEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/impl/RegattaLogRevokeEventImpl.java new file mode 100644 index 00000000000..1ecd755d0cc --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/impl/RegattaLogRevokeEventImpl.java @@ -0,0 +1,24 @@ +package com.sap.sailing.domain.abstractlog.regatta.impl; + +import java.io.Serializable; + +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.impl.RevokeEventImpl; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLogRevokeEvent; +import com.sap.sse.common.TimePoint; + +public class RegattaLogRevokeEventImpl extends RevokeEventImpl implements RegattaLogRevokeEvent { + private static final long serialVersionUID = -3470191515219206588L; + + public RegattaLogRevokeEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, + Serializable pId, Serializable revokedEventId, String revokedEventType, String revokedEventShortInfo, + String reason) { + super(createdAt, author, logicalTimePoint, pId, revokedEventId, revokedEventType, revokedEventShortInfo, reason); + } + + @Override + public void accept(RegattaLogEventVisitor visitor) { + visitor.visit(this); + } +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/RacingProcedureConfiguration.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/RacingProcedureConfiguration.java index 75108585928..9508bc968a8 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/RacingProcedureConfiguration.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/RacingProcedureConfiguration.java @@ -2,8 +2,8 @@ package com.sap.sailing.domain.base.configuration; import java.io.Serializable; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedure; import com.sap.sailing.domain.common.racelog.Flags; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedure; /** * Interface holding configuration options common to all {@link RacingProcedure}s. diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/RegattaConfiguration.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/RegattaConfiguration.java index 46deb21d3dd..c2aebdeb662 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/RegattaConfiguration.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/RegattaConfiguration.java @@ -2,12 +2,12 @@ package com.sap.sailing.domain.base.configuration; import java.io.Serializable; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedure; import com.sap.sailing.domain.base.configuration.procedures.ESSConfiguration; import com.sap.sailing.domain.base.configuration.procedures.GateStartConfiguration; import com.sap.sailing.domain.base.configuration.procedures.RRS26Configuration; import com.sap.sailing.domain.common.CourseDesignerMode; import com.sap.sailing.domain.common.racelog.RacingProcedureType; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedure; /** * Interface holding configuration options for a Regatta, including configurations for diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/RaceCell.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/RaceCell.java index 0aca85fadd6..613bf2f4853 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/RaceCell.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/RaceCell.java @@ -1,6 +1,6 @@ package com.sap.sailing.domain.base.racegroup; -import com.sap.sailing.domain.racelog.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sse.common.Named; /** diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/RaceGroup.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/RaceGroup.java index 7ab4d858219..9a920e05f7b 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/RaceGroup.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/RaceGroup.java @@ -1,10 +1,10 @@ package com.sap.sailing.domain.base.racegroup; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedure; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.configuration.RegattaConfiguration; -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedure; import com.sap.sse.common.Named; /** diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/impl/RaceCellImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/impl/RaceCellImpl.java index 2f13b47f0ee..5e30b534414 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/impl/RaceCellImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/impl/RaceCellImpl.java @@ -1,7 +1,7 @@ package com.sap.sailing.domain.base.racegroup.impl; +import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.base.racegroup.RaceCell; -import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sse.common.impl.NamedImpl; public class RaceCellImpl extends NamedImpl implements RaceCell { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLog.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLog.java deleted file mode 100644 index 57007699fa1..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLog.java +++ /dev/null @@ -1,138 +0,0 @@ -package com.sap.sailing.domain.racelog; - -import java.io.Serializable; -import java.util.HashSet; -import java.util.NavigableSet; -import java.util.UUID; - -import com.sap.sailing.domain.common.racelog.tracking.NotRevokableException; -import com.sap.sailing.domain.racelog.impl.RaceLogEventComparator; -import com.sap.sailing.domain.tracking.Track; -import com.sap.sse.common.TimePoint; -import com.sap.sse.common.WithID; - -/** - * Special kind of {@link Track} for recording {@link RaceLogEvent}s. - * - *

- * Keeps track of the {@link RaceLogEvent}'s pass and returns only the events of the current pass on - * {@link RaceLog#getFixes()}. Use {@link RaceLog#getRawFixes()} to receive all events in a {@link RaceLog}. - *

- * - *

- * Implementations should use the {@link RaceLogEventComparator} for sorting its content. - *

- */ -public interface RaceLog extends Track, WithID { - - public static final int DefaultPassId = 0; - - /** - * Gets the current pass id. - * - * @return the pass id. - */ - int getCurrentPassId(); - - /** - * Adds a {@link RaceLogEvent} to the {@link RaceLog}. - * - * @param event - * {@link RaceLogEvent} to be added. - * @return true if the element was added, false otherwise. - */ - boolean add(RaceLogEvent event); - - /** - * Add a {@link RaceLogEventVisitor} as a listener for additions. - */ - void addListener(RaceLogEventVisitor listener); - - /** - * Remove a listener. - */ - void removeListener(RaceLogEventVisitor listener); - - /** - * Removes all listeners - * @return - */ - HashSet removeAllListeners(); - - /** - * Checks if the race log is empty. - */ - boolean isEmpty(); - - Iterable getRawFixesDescending(); - - Iterable getFixesDescending(); - - void addAllListeners(HashSet listeners); - - Iterable getAllListeners(); - - /** - * Adds an event to this race log and returns {@link RaceLog#getEventsToDeliver(UUID)} - * (excluding the new event) - */ - Iterable add(RaceLogEvent event, UUID clientId); - - /** - * Returns a superset of all race log events that were added to this race log but not yet returned to - * the client with ID clientId by this method. In general, the list returned is not a true - * superset but equals exactly those events not yet delivered to the client. However, if the server - * was re-started since the client last called this method, and since the underlying data structures - * are not durably stored, the entire set of all race log events would be delivered to the client once. - */ - Iterable getEventsToDeliver(UUID clientId); - - /** - * Returns all {@link #getRawFixes() raw fixes} and marks them as delivered to the client identified by clientId - * so that when that ID appears in a subsequent call to {@link #add(RaceLogEvent, UUID)}, the fixes returned by this call - * are already considered delivered to the client identified by clientId. - */ - Iterable getRawFixes(UUID clientId); - - /** - * Like {@link #add(RaceLogEvent)}, only that no events are triggered. Use this method only when loading a race log, - * e.g., from a replication or master data import or when loading from the database. - * - * @return true if the event was actually added which is the case if there was no equal event contained - * in this race log yet - */ - boolean load(RaceLogEvent event); - - /** - * Search for the event by its {@link RaceLogEvent#getId() id}. - * Caller needs to hold the read lock. - */ - RaceLogEvent getEventById(Serializable id); - - /** - * Get a {@link NavigableSet} of unrevoked events regardless of the {@code pass}. Events are sorted by - * their {@link TimePoint} and the oldest is returned first. - * @return - */ - NavigableSet getUnrevokedEvents(); - - /** - * Get a {@link NavigableSet} of unrevoked events regardless of the {@code pass}. - * @return - */ - NavigableSet getUnrevokedEventsDescending(); - - /** - * Inserts a {@link RevokeEvent} for {@code toRevoke}, if latter is revokable, exists in the racelog - * and has not yet been revoked. - * - * @param author The author for the {@code RevokeEvent}. - */ - RevokeEvent revokeEvent(RaceLogEventAuthor author, RaceLogEvent toRevoke, String reason) throws NotRevokableException; - RevokeEvent revokeEvent(RaceLogEventAuthor author, RaceLogEvent toRevoke) throws NotRevokableException; - - /** - * Merges all events from the other race log into this. - */ - void merge(RaceLog other); -} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEvent.java deleted file mode 100644 index 7dee85e9ced..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEvent.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.sap.sailing.domain.racelog; - -import java.io.Serializable; -import java.util.List; - -import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.base.Timed; -import com.sap.sse.common.TimePoint; -import com.sap.sse.common.WithID; - -/** - *

- * A {@link RaceLogEvent} is an entry in a race's log (typically a {@link RaceLog}. - *

- * - *

- * Such an entry may influence the state of a race (scheduled, started, finished, ...), contain information about the - * current displayed flags (AP, N, X, P, etc.) of a race or indicate some other change regarding the race. See - * subclasses of {@link RaceLogEvent} for a full list of possibilities. - *

- * - *

- * A {@link RaceLogEvent} may be associated to a certain pass. For a race a new pass is initiated whenever a new start - * time is proposed (e.g. after the race was aborted). - *

- * - *

- * Each {@link RaceLogEvent} carries two timestamps. - * - * The timestamp received with {@link RaceLogEvent#getCreatedAt()} denotes the point in time the event was created. - * - * The timestamp received with {@link RaceLogEvent#getLogicalTimePoint()} denotes the logical point in time the event - * has occurred (sometimes called 'event time'). This timestamp might be different from - * {@link RaceLogEvent#getCreatedAt()}. For example setting the start time of race to a point in time in the past, - * results in a {@link RaceLogEvent} returning "now" on {@link RaceLogEvent#getCreatedAt()} and such a point in time - * that a complete startphase could have occured on {@link RaceLogEvent#getTimePoint()}. - * - * To ensure an ordering there should be no two {@link RaceLogEvent}s returning the same point in time on - * {@link RaceLogEvent#getCreatedAt()} per pass. - * - * The {@link RaceLogEvent}'s {@link Timed} interface redirects to {@link RaceLogEvent#getCreatedAt()} (was - * {@link RaceLogEvent#getLogicalTimePoint()}!). - *

- * - *

- * Race log events have an author that has a name and a priority assigned. This can be used to represent multiple - * concurrent race log authors such as a device used on a starting vessel, another device used at the finish line and - * yet another device used on shore. In case more than one device make a statement about something, such as the start - * time or the start procedure, the statement from the device with the highest priority needs to take precedence. - *

- */ -public interface RaceLogEvent extends Timed, WithID, Serializable { - - /** - * Gets the {@link TimePoint} this event was created at. - */ - TimePoint getCreatedAt(); - - /** - * Gets the event's logical timestamp. - * - * @return - */ - TimePoint getLogicalTimePoint(); - - /** - * Gets the event's pass identifier. - * - * Each {@link RaceLogEvent} is associated to a certain pass. A pass is every attempt to start and run a race. A new - * pass is initiated when a new start time is proposed (e.g. after the race was aborted). There might be certain - * event type that are not strictly bound to its pass. - * - */ - int getPassId(); - - /** - * Gets the list of associated {@link Competitor}s. - * - * A {@link RaceLogEvent} might be associated with a list of competitors, which are somehow relevant for this kind - * of event. An example is a list of competitors who are marked for an individual recall. - */ - List getInvolvedBoats(); - - /** - * Visitor pattern to implement certain {@link RaceLogEvent} subclass specific behavior. - */ - void accept(RaceLogEventVisitor visitor); - - /** - * Gets the {@link RaceLogEventAuthor} author of this event. - */ - RaceLogEventAuthor getAuthor(); - - /** - * Gets a short info about the most relevant data of the event. - * @return - */ - String getShortInfo(); -} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/RaceLogAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/RaceLogAnalyzer.java deleted file mode 100644 index 11ec94bebc8..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/RaceLogAnalyzer.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.sap.sailing.domain.racelog.analyzing.impl; - -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; - -/** - * Analyzer to perform a query over a given {@link RaceLog}. Each subclass defines its ResultType. - * - * @param - * type of analyzation's result. - */ -public abstract class RaceLogAnalyzer { - - protected RaceLog raceLog; - - public RaceLogAnalyzer(RaceLog raceLog) { - this.raceLog = raceLog; - } - - public RaceLog getRaceLog() { - return raceLog; - } - - public ResultType analyze() { - raceLog.lockForRead(); - try { - return performAnalysis(); - } finally { - raceLog.unlockAfterRead(); - } - } - - protected abstract ResultType performAnalysis(); - - protected Iterable getPassEvents() { - return raceLog.getFixes(); - } - - protected Iterable getAllEvents() { - return raceLog.getRawFixes(); - } - - protected Iterable getPassEventsDescending() { - return raceLog.getFixesDescending(); - } - - protected Iterable getAllEventsDescending() { - return raceLog.getRawFixesDescending(); - } -} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventComparator.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventComparator.java deleted file mode 100644 index 36d184f8b4a..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventComparator.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.sap.sailing.domain.racelog.impl; - -import java.io.Serializable; -import java.util.Comparator; - -import com.sap.sailing.domain.base.Timed; -import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sailing.domain.tracking.impl.TimedComparator; - -/** - * Comparator sorting by pass, then by {@link RaceLogEventAuthor}, then by {@link RaceLogEvent#getCreatedAt()} - * timestamp. - * - * If one of the passed objects is not a {@link RaceLogEvent}, sorting is done by {@link Timed#getTimePoint()}. - */ -public enum RaceLogEventComparator implements Comparator, Serializable { - INSTANCE; - - private Comparator timedComparator; - - private RaceLogEventComparator() { - this.timedComparator = TimedComparator.INSTANCE; - } - - @Override - public int compare(Timed o1, Timed o2) { - if (o1 instanceof RaceLogEvent && o2 instanceof RaceLogEvent) { - return compareEvents((RaceLogEvent) o1, (RaceLogEvent) o2); - } - - // fallback to timed comparison - return timedComparator.compare(o1, o2); - } - - private int compareEvents(RaceLogEvent e1, RaceLogEvent e2) { - int result = comparePasses(e1, e2); - return result == 0 ? compareAuthorPriorities(e1, e2) : result; - } - - private int comparePasses(RaceLogEvent e1, RaceLogEvent e2) { - return e1.getPassId() - e2.getPassId(); - } - - private int compareAuthorPriorities(RaceLogEvent e1, RaceLogEvent e2) { - int result = e1.getAuthor().compareTo(e2.getAuthor()); - return result == 0 ? compareCreatedAtTimes(e1, e2) : result; - } - - private int compareCreatedAtTimes(RaceLogEvent e1, RaceLogEvent e2) { - int result = e1.getCreatedAt().compareTo(e2.getCreatedAt()); - return result == 0 ? compareIds(e1, e2) : result; - } - - private int compareIds(RaceLogEvent e1, RaceLogEvent e2) { - return e1.getId().toString().compareTo(e2.getId().toString()); - } - -} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventImpl.java deleted file mode 100644 index 59ddc09745b..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventImpl.java +++ /dev/null @@ -1,81 +0,0 @@ -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.racelog.RaceLogEvent; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; -import com.sap.sse.common.TimePoint; - -public abstract class RaceLogEventImpl implements RaceLogEvent { - - private static final long serialVersionUID = -5810258278984777732L; - - private final TimePoint createdAt; - private final TimePoint logicalTimePoint; - private final Serializable id; - private final List involvedBoats; - private final int passId; - private final RaceLogEventAuthor author; - - public RaceLogEventImpl(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, - Serializable pId, List pInvolvedBoats, int pPassId) { - this.createdAt = createdAt; - this.author = author; - this.logicalTimePoint = logicalTimePoint; - this.id = pId; - this.involvedBoats = pInvolvedBoats; - this.passId = pPassId; - } - - @Override - public TimePoint getCreatedAt() { - return createdAt; - } - - /* - * Redirects to getCreatedAt() - */ - @Override - public TimePoint getTimePoint() { - return getCreatedAt(); - } - - @Override - public TimePoint getLogicalTimePoint() { - return logicalTimePoint; - } - - @Override - public Serializable getId() { - return id; - } - - @Override - public List getInvolvedBoats() { - return involvedBoats; - } - - @Override - public int getPassId() { - return passId; - } - - @Override - public RaceLogEventAuthor getAuthor() { - return author; - } - - @Override - public String toString() { - return getClass().getName() + ": createdAt: " + getCreatedAt() + ", logicalTimePoint: " + getLogicalTimePoint() - + ", id: " + getId() + ", involvedBoats: " + getInvolvedBoats() + ", passId: " + getPassId() + - ", author: "+ getAuthor(); - } - - @Override - public String getShortInfo() { - return ""; - } -} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/basic/BasicRacingProcedure.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/basic/BasicRacingProcedure.java deleted file mode 100644 index 8ead06a1e04..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/basic/BasicRacingProcedure.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure.basic; - -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedure; - -public interface BasicRacingProcedure extends RacingProcedure { - -} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/ess/ESSChangedListener.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/ess/ESSChangedListener.java deleted file mode 100644 index 5f6eb820b81..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/ess/ESSChangedListener.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure.ess; - -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedureChangedListener; - -public interface ESSChangedListener extends RacingProcedureChangedListener { - -} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/ess/ESSRacingProcedure.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/ess/ESSRacingProcedure.java deleted file mode 100644 index 230405a5f00..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/ess/ESSRacingProcedure.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure.ess; - -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedure; - -public interface ESSRacingProcedure extends ReadonlyESSRacingProcedure, RacingProcedure { - -} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/ess/impl/ESSChangedListeners.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/ess/impl/ESSChangedListeners.java deleted file mode 100644 index 0a940a9fc81..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/ess/impl/ESSChangedListeners.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure.ess.impl; - -import com.sap.sailing.domain.racelog.state.racingprocedure.ess.ESSChangedListener; -import com.sap.sailing.domain.racelog.state.racingprocedure.impl.RacingProcedureChangedListeners; - -public class ESSChangedListeners extends RacingProcedureChangedListeners implements - ESSChangedListener { - - -} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/rrs26/RRS26ChangedListener.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/rrs26/RRS26ChangedListener.java deleted file mode 100644 index 89840631bd0..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/rrs26/RRS26ChangedListener.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure.rrs26; - -import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedureChangedListener; - -public interface RRS26ChangedListener extends RacingProcedureChangedListener { - - void onStartmodeChanged(ReadonlyRRS26RacingProcedure racingProcedure); - -} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/rrs26/impl/RRS26ChangedListeners.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/rrs26/impl/RRS26ChangedListeners.java deleted file mode 100644 index 05dcb1687e6..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/state/racingprocedure/rrs26/impl/RRS26ChangedListeners.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.sap.sailing.domain.racelog.state.racingprocedure.rrs26.impl; - -import com.sap.sailing.domain.racelog.state.racingprocedure.impl.RacingProcedureChangedListeners; -import com.sap.sailing.domain.racelog.state.racingprocedure.rrs26.RRS26ChangedListener; -import com.sap.sailing.domain.racelog.state.racingprocedure.rrs26.ReadonlyRRS26RacingProcedure; - -public class RRS26ChangedListeners extends RacingProcedureChangedListeners implements - RRS26ChangedListener { - - @Override - public void onStartmodeChanged(ReadonlyRRS26RacingProcedure racingProcedure) { - for (RRS26ChangedListener listener : getListeners()) { - listener.onStartmodeChanged(racingProcedure); - } - } - -} diff --git a/java/com.sap.sailing.domain.swisstimingadapter.test/src/com/sap/sailing/domain/swisstimingadapter/test/SimpleDomainFactoryTest.java b/java/com.sap.sailing.domain.swisstimingadapter.test/src/com/sap/sailing/domain/swisstimingadapter/test/SimpleDomainFactoryTest.java index 95548182ac2..2a28e91b1ac 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter.test/src/com/sap/sailing/domain/swisstimingadapter/test/SimpleDomainFactoryTest.java +++ b/java/com.sap.sailing.domain.swisstimingadapter.test/src/com/sap/sailing/domain/swisstimingadapter/test/SimpleDomainFactoryTest.java @@ -106,7 +106,8 @@ public class SimpleDomainFactoryTest { @Test public void testCourseConfigForMark() throws PatchFailedException { DomainFactory domainFactory = DomainFactory.INSTANCE; - Regatta regatta = new RegattaImpl(EmptyRaceLogStore.INSTANCE, "TestEvent", /* boatClass */ null, new RacingEventServiceImpl(), + Regatta regatta = new RegattaImpl(EmptyRaceLogStore.INSTANCE, "TestEvent", /* boatClass */ null, + /*startDate*/ null, /*endDate*/ null, new RacingEventServiceImpl(), com.sap.sailing.domain.base.DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), "123", null); Race race = new RaceImpl("1234", "R1", "Race 1234"); Iterable competitors = Collections.emptyList(); @@ -131,7 +132,8 @@ public class SimpleDomainFactoryTest { @Test public void testCourseConfigForGate() throws PatchFailedException { DomainFactory domainFactory = DomainFactory.INSTANCE; - Regatta regatta = new RegattaImpl(EmptyRaceLogStore.INSTANCE, "TestEvent", /* boatClass */ null, new RacingEventServiceImpl(), + Regatta regatta = new RegattaImpl(EmptyRaceLogStore.INSTANCE, "TestEvent", /* boatClass */ null, + /*startDate*/ null, /*endDate*/ null, new RacingEventServiceImpl(), com.sap.sailing.domain.base.DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), "123", null); Race race = new RaceImpl("1234", "R1", "Race 1234"); Iterable competitors = Collections.emptyList(); diff --git a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java index 91948fc0f7e..25364e39e9a 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java +++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java @@ -101,7 +101,7 @@ public class DomainFactoryImpl implements DomainFactory { Calendar calendar = Calendar.getInstance(); result = new RegattaImpl(raceLogStore, RegattaImpl.getDefaultName( "ST Regatta " + calendar.get(Calendar.YEAR) + " for race " + raceID, regattaBoatClass.getName()), - regattaBoatClass, trackedRegattaRegistry, getBaseDomainFactory().createScoringScheme( + regattaBoatClass, /*startDate*/ null, /*endDate*/ null, trackedRegattaRegistry, getBaseDomainFactory().createScoringScheme( ScoringSchemeType.LOW_POINT), raceID, null); logger.info("Created regatta "+result.getName()+" ("+result.hashCode()+")"); raceIDToRegattaCache.put(raceID, result); diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/test/DurationTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/test/DurationTest.java index 3a8200e0987..38fd69cddcf 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/test/DurationTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/test/DurationTest.java @@ -52,7 +52,7 @@ public class DurationTest { assertEquals(0, oneSecond.asMinutes(), 0.2); assertEquals(1, oneSecond.asSeconds(), 0); assertEquals(1000, oneSecond.asMillis()); - assertEquals("1.0seconds 1000millis", oneSecond.toString()); + assertEquals("1.0s==1000ms", oneSecond.toString()); Duration oneHour = Duration.ONE_HOUR; assertEquals(0, oneHour.asDays(), 0); assertEquals(1, oneHour.asHours(), 0); diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CourseTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CourseTest.java index 9bd0c9387bc..f40799cb99d 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CourseTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CourseTest.java @@ -299,7 +299,7 @@ public class CourseTest { assertWaypointIndexes(course); final Set hasso = Collections.singleton(AbstractLeaderboardTest.createCompetitor("Hasso")); DynamicTrackedRace trackedRace = new DynamicTrackedRaceImpl(/* trackedRegatta */new DynamicTrackedRegattaImpl( - new RegattaImpl("test", null, new HashSet(), false, null, "test", null)), + new RegattaImpl("test", null, null, null, new HashSet(), false, null, "test", null)), new RaceDefinitionImpl("Test Race", course, new BoatClassImpl("49er", /* upwind start */true), hasso), Collections. emptyList(), EmptyWindStore.INSTANCE, EmptyGPSFixStore.INSTANCE,/* delayToLiveInMillis */3000, /* millisecondsOverWhichToAverageWind */30000, @@ -329,7 +329,7 @@ public class CourseTest { Course course = new CourseImpl("Test Course", waypoints); final Set hasso = Collections.singleton(AbstractLeaderboardTest.createCompetitor("Hasso")); DynamicTrackedRace trackedRace = new DynamicTrackedRaceImpl(/* trackedRegatta */ new DynamicTrackedRegattaImpl( - new RegattaImpl("test", null, new HashSet(), false, null, "test", null)), + new RegattaImpl("test", null, null, null, new HashSet(), false, null, "test", null)), new RaceDefinitionImpl("Test Race", course, new BoatClassImpl("49er", /* upwind start */ true), hasso), Collections. emptyList(), EmptyWindStore.INSTANCE, EmptyGPSFixStore.INSTANCE, /* delayToLiveInMillis */ 3000, diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CourseUpdateDuringNonAtomicSerializationTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CourseUpdateDuringNonAtomicSerializationTest.java index de18712b2a1..e57eeb0e579 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CourseUpdateDuringNonAtomicSerializationTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CourseUpdateDuringNonAtomicSerializationTest.java @@ -72,7 +72,7 @@ public class CourseUpdateDuringNonAtomicSerializationTest implements Serializabl removeCalls = new HashMap<>(); course = new CourseImpl("Test Course", waypoints); Regatta regatta = new RegattaImpl(EmptyRaceLogStore.INSTANCE, "Test Regatta", - new BoatClassImpl("505", BoatClassMasterdata._5O5), /* trackedRegattaRegistry */ null, + new BoatClassImpl("505", BoatClassMasterdata._5O5), /*startDate*/ null, /*endDate*/ null, /* trackedRegattaRegistry */ null, new LowPoint(), UUID.randomUUID(), new CourseAreaImpl("Alpha", UUID.randomUUID())); TrackedRegatta trackedRegatta = new TrackedRegattaImpl(regatta); RaceDefinition race = new RaceDefinitionImpl("Test Race", course, regatta.getBoatClass(), Collections.emptySet()); diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardCourseChangeTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardCourseChangeTest.java index 22db5ade69d..cc4c2099aca 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardCourseChangeTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardCourseChangeTest.java @@ -84,7 +84,8 @@ public class LeaderboardCourseChangeTest { String raceColumnName = "TestRace"; RaceColumn raceColumn = series.addRaceColumn(raceColumnName, trackedRegattaRegistry); ScoringScheme scoringScheme = new LowPoint(); - Regatta mockedRegatta = new RegattaImpl(RegattaImpl.getDefaultName("TestRegatta", boatClass.getName()), boatClass, seriesSet, false, scoringScheme, + Regatta mockedRegatta = new RegattaImpl(RegattaImpl.getDefaultName("TestRegatta", boatClass.getName()), boatClass, + /*startDate*/ null, /*endDate*/ null, seriesSet, false, scoringScheme, UUID.randomUUID(), mock(CourseArea.class)); ControlPoint start = new MarkImpl("Start"); ControlPoint m1 = new MarkImpl("M1"); diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardScoringAndRankingTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardScoringAndRankingTest.java index a80130cab88..8b1efffa600 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardScoringAndRankingTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardScoringAndRankingTest.java @@ -21,6 +21,14 @@ import java.util.concurrent.ExecutionException; import org.junit.Test; +import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.AdditionalScoringInformationFinder; +import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationEvent; +import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationType; +import com.sap.sailing.domain.abstractlog.race.scoring.impl.AdditionalScoringInformationEventImpl; +import com.sap.sailing.domain.abstractlog.race.state.RaceState; +import com.sap.sailing.domain.abstractlog.race.state.impl.RaceStateImpl; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.DomainFactory; @@ -40,8 +48,8 @@ import com.sap.sailing.domain.base.impl.WaypointImpl; import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.NoWindException; import com.sap.sailing.domain.common.ScoringSchemeType; +import com.sap.sailing.domain.common.abstractlog.NotRevokableException; import com.sap.sailing.domain.common.dto.LeaderboardDTO; -import com.sap.sailing.domain.common.racelog.tracking.NotRevokableException; import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.LeaderboardGroup; @@ -56,15 +64,7 @@ import com.sap.sailing.domain.leaderboard.impl.LowPoint; import com.sap.sailing.domain.leaderboard.impl.RegattaLeaderboardImpl; import com.sap.sailing.domain.leaderboard.impl.ThresholdBasedResultDiscardingRuleImpl; import com.sap.sailing.domain.leaderboard.meta.LeaderboardGroupMetaLeaderboard; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.analyzing.impl.AdditionalScoringInformationFinder; import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore; -import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl; -import com.sap.sailing.domain.racelog.scoring.AdditionalScoringInformationEvent; -import com.sap.sailing.domain.racelog.scoring.AdditionalScoringInformationType; -import com.sap.sailing.domain.racelog.scoring.impl.AdditionalScoringInformationEventImpl; -import com.sap.sailing.domain.racelog.state.RaceState; -import com.sap.sailing.domain.racelog.state.impl.RaceStateImpl; import com.sap.sailing.domain.test.mock.MockedTrackedRaceWithStartTimeAndRanks; import com.sap.sailing.domain.tracking.MarkPassing; import com.sap.sailing.domain.tracking.TrackedRace; @@ -812,7 +812,8 @@ public class LeaderboardScoringAndRankingTest extends AbstractLeaderboardTest { @Test public void testAdditionalScoreInformationLeadsToChangedScoreForOneColumn() throws NoWindException { TrackedRegattaRegistry trackedRegattaRegistry = mock(TrackedRegattaRegistry.class); - Regatta dummyRegatta = new RegattaImpl(EmptyRaceLogStore.INSTANCE , "Dummy", new BoatClassImpl("Extreme40", false), trackedRegattaRegistry, new HighPointFirstGets10Or8AndLastBreaksTie(), "578876345345", new CourseAreaImpl("Humba", UUID.randomUUID())); + Regatta dummyRegatta = new RegattaImpl(EmptyRaceLogStore.INSTANCE , "Dummy", new BoatClassImpl("Extreme40", false), + /*startDate*/ null, /*endDate*/ null, trackedRegattaRegistry, new HighPointFirstGets10Or8AndLastBreaksTie(), "578876345345", new CourseAreaImpl("Humba", UUID.randomUUID())); trackedRegattaRegistry.getOrCreateTrackedRegatta(dummyRegatta); Competitor[] competitors = createCompetitors(10).toArray(new Competitor[0]); TimePoint now = MillisecondsTimePoint.now(); @@ -831,11 +832,11 @@ public class LeaderboardScoringAndRankingTest extends AbstractLeaderboardTest { assertEquals(new Double(18), leaderboardHighPoint10Or8AndLastBreaksTie.getTotalPoints(competitors[1], later)); assertEquals(new Double(2), leaderboardHighPoint10Or8AndLastBreaksTie.getTotalPoints(competitors[9], later)); RaceLog raceLogForRace2 = leaderboardHighPoint10Or8AndLastBreaksTie.getRaceColumnByName("R2").getRaceLog(leaderboardHighPoint10Or8AndLastBreaksTie.getFleet(null)); - raceLogForRace2.add(new AdditionalScoringInformationEventImpl(now, new RaceLogEventAuthorImpl("Plopp", 1), later, "12345678", Collections.emptyList(), 0, AdditionalScoringInformationType.UNKNOWN)); + raceLogForRace2.add(new AdditionalScoringInformationEventImpl(now, new LogEventAuthorImpl("Plopp", 1), later, "12345678", Collections.emptyList(), 0, AdditionalScoringInformationType.UNKNOWN)); assertEquals(new Double(20), leaderboardHighPoint10Or8AndLastBreaksTie.getTotalPoints(competitors[0], later)); assertEquals(new Double(18), leaderboardHighPoint10Or8AndLastBreaksTie.getTotalPoints(competitors[1], later)); assertEquals(new Double(2), leaderboardHighPoint10Or8AndLastBreaksTie.getTotalPoints(competitors[9], later)); - raceLogForRace2.add(new AdditionalScoringInformationEventImpl(now, new RaceLogEventAuthorImpl("Plopp", 1), later.plus(Duration.ONE_MINUTE), "123456789873773762", Collections.emptyList(), 0, AdditionalScoringInformationType.MAX_POINTS_DECREASE_MAX_SCORE)); + raceLogForRace2.add(new AdditionalScoringInformationEventImpl(now, new LogEventAuthorImpl("Plopp", 1), later.plus(Duration.ONE_MINUTE), "123456789873773762", Collections.emptyList(), 0, AdditionalScoringInformationType.MAX_POINTS_DECREASE_MAX_SCORE)); assertEquals(new Double(18), leaderboardHighPoint10Or8AndLastBreaksTie.getTotalPoints(competitors[0], later)); assertEquals(new Double(16), leaderboardHighPoint10Or8AndLastBreaksTie.getTotalPoints(competitors[1], later)); assertEquals(new Double(2), leaderboardHighPoint10Or8AndLastBreaksTie.getTotalPoints(competitors[9], later)); @@ -847,15 +848,15 @@ public class LeaderboardScoringAndRankingTest extends AbstractLeaderboardTest { AdditionalScoringInformationEvent event = finder.analyze(/*filterBy*/AdditionalScoringInformationType.MAX_POINTS_DECREASE_MAX_SCORE); assert event != null; try { - raceLogForRace2.revokeEvent(new RaceLogEventAuthorImpl("Plopp", 1), event); - } catch (NotRevokableException e) { - e.printStackTrace(); + raceLogForRace2.revokeEvent(new LogEventAuthorImpl("Plopp", 1), event); + } catch (NotRevokableException e1) { + e1.printStackTrace(); } event = finder.analyze(/*filterBy*/AdditionalScoringInformationType.MAX_POINTS_DECREASE_MAX_SCORE); assert event == null; assertEquals(new Double(30), leaderboardHighPoint10Or8AndLastBreaksTie.getTotalPoints(competitors[0], later)); assertEquals(new Double(3), leaderboardHighPoint10Or8AndLastBreaksTie.getTotalPoints(competitors[9], later)); - RaceState raceStateForRace2 = RaceStateImpl.create(raceLogForRace2, new RaceLogEventAuthorImpl("Simon", 1)); + RaceState raceStateForRace2 = RaceStateImpl.create(raceLogForRace2, new LogEventAuthorImpl("Simon", 1)); assertFalse(raceStateForRace2.isAdditionalScoringInformationEnabled(AdditionalScoringInformationType.MAX_POINTS_DECREASE_MAX_SCORE)); raceStateForRace2.setAdditionalScoringInformationEnabled(later.plus(Duration.ONE_MINUTE).plus(Duration.ONE_SECOND), /*enable*/true, AdditionalScoringInformationType.MAX_POINTS_DECREASE_MAX_SCORE); assertTrue(raceStateForRace2.isAdditionalScoringInformationEnabled(AdditionalScoringInformationType.MAX_POINTS_DECREASE_MAX_SCORE)); @@ -1320,7 +1321,8 @@ public class LeaderboardScoringAndRankingTest extends AbstractLeaderboardTest { series.add(medalSeries); } - Regatta regatta = new RegattaImpl(RegattaImpl.getDefaultName(regattaBaseName, boatClass.getName()), boatClass, series, /* persistent */ false, scoringScheme, "123", null); + Regatta regatta = new RegattaImpl(RegattaImpl.getDefaultName(regattaBaseName, boatClass.getName()), boatClass, + /*startDate*/ null, /*endDate*/ null, series, /* persistent */ false, scoringScheme, "123", null); return regatta; } @@ -1385,7 +1387,7 @@ public class LeaderboardScoringAndRankingTest extends AbstractLeaderboardTest { series.add(finalSeries); } final BoatClass boatClass = DomainFactory.INSTANCE.getOrCreateBoatClass("Extreme40", /* typicallyStartsUpwind */ false); - Regatta regatta = new RegattaImpl(RegattaImpl.getDefaultName("Test Regatta", boatClass.getName()), boatClass, + Regatta regatta = new RegattaImpl(RegattaImpl.getDefaultName("Test Regatta", boatClass.getName()), boatClass, /*startDate*/ null, /*endDate*/ null, series, /* persistent */false, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.HIGH_POINT_FIRST_GETS_TEN), "123", /* course area */null); List competitors = createCompetitors(12); final int firstYellowCompetitorIndex = 3; diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/OfflineSerializationTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/OfflineSerializationTest.java index cda23e75618..9acb982d192 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/OfflineSerializationTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/OfflineSerializationTest.java @@ -4,13 +4,21 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.NotSerializableException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.Set; import java.util.UUID; +import java.util.logging.Logger; import org.junit.Test; @@ -41,6 +49,8 @@ import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; public class OfflineSerializationTest extends AbstractSerializationTest { + private static final Logger logger = Logger.getLogger(OfflineSerializationTest.class.getName()); + /** * Bug 769 was based on an inconsistency of a cached hash code in Pair. The same problem existed for Triple. * Serialization changes the Object IDs of the objects contained and therefore the hash code based on this @@ -198,4 +208,47 @@ public class OfflineSerializationTest extends AbstractSerializationTest { assertNotSame(n, copies[0]); assertEquals(n.getName(), ((Nationality) copies[0]).getName()); } + + private static interface Op extends Serializable { + String internalApplyTo(String s); + } + + /** + * To make absolutely sure that even if for strange reasons the test class was serializable, it would throw an + * exception during serialization + */ + private void writeObject(ObjectOutputStream oos) { + fail("This class should not be serializable."); + } + + @Test + public void testLambdaDoesNotSerializeEnclosingInstance() throws IOException { + Op op = s -> s+s; + new ObjectOutputStream(new ByteArrayOutputStream()).writeObject(op); // the test case is not serializable; if it were, its writeObject() would thrown an exception + Op opWithRefToEnclosingInstance = s -> s+this.toString(); + try { + new ObjectOutputStream(new ByteArrayOutputStream()).writeObject(opWithRefToEnclosingInstance); + fail("Expected the lambda not to be serializable because it references the non-serializable enclosing instance"); + } catch (NotSerializableException nse) { + // this is expected + logger.info("Caught expected exception "+nse); + } + } + + private static class NonSerializableFieldDeclaration implements Serializable { + private static final long serialVersionUID = 1806419236999145531L; + public Object nonSerializable; + } + @Test + public void testSerializingSerializableFieldValueOfNonSerializableDeclaredType() throws IOException, ClassNotFoundException { + final NonSerializableFieldDeclaration o = new NonSerializableFieldDeclaration(); + o.nonSerializable = "A serializable String object"; + final ByteArrayOutputStream bos = new ByteArrayOutputStream(); + final ObjectOutputStream oos = new ObjectOutputStream(bos); + oos.writeObject(o); + oos.close(); + final ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray())); + NonSerializableFieldDeclaration o2 = (NonSerializableFieldDeclaration) ois.readObject(); + assertEquals(o.nonSerializable, o2.nonSerializable); + } } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceLogAttachOnTrackedRaceTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceLogAttachOnTrackedRaceTest.java index 0a1b637c61d..65d192b0ec3 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceLogAttachOnTrackedRaceTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceLogAttachOnTrackedRaceTest.java @@ -8,12 +8,12 @@ import java.io.Serializable; import org.junit.Before; import org.junit.Test; +import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.impl.FlexibleLeaderboardImpl; import com.sap.sailing.domain.leaderboard.impl.LowPoint; -import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.test.mock.MockedTrackedRace; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sse.common.Util; diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ReachingLegTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ReachingLegTest.java index 6ad70dfcec2..dc300cf8ef1 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ReachingLegTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ReachingLegTest.java @@ -86,7 +86,8 @@ public class ReachingLegTest extends TrackBasedTest { protected DynamicTrackedRaceImpl createTrackedRace(String regattaName, String raceName, String boatClassName, Iterable competitors, TimePoint timePointForFixes) { BoatClassImpl boatClass = new BoatClassImpl(boatClassName, /* typicallyStartsUpwind */ true); - Regatta regatta = new RegattaImpl(EmptyRaceLogStore.INSTANCE, RegattaImpl.getDefaultName(regattaName, boatClass.getName()), boatClass, /* trackedRegattaRegistry */ null, + Regatta regatta = new RegattaImpl(EmptyRaceLogStore.INSTANCE, RegattaImpl.getDefaultName(regattaName, boatClass.getName()), + boatClass, /*startDate*/ null, /*endDate*/ null, /* trackedRegattaRegistry */ null, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), "123", null); TrackedRegatta trackedRegatta = new DynamicTrackedRegattaImpl(regatta); List waypoints = new ArrayList(); diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackBasedTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackBasedTest.java index 658702e200e..28d8001e74e 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackBasedTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackBasedTest.java @@ -96,7 +96,8 @@ public abstract class TrackBasedTest { public static DynamicTrackedRaceImpl createTestTrackedRace(String regattaName, String raceName, String boatClassName, Iterable competitors, TimePoint timePointForFixes) { BoatClassImpl boatClass = new BoatClassImpl(boatClassName, /* typicallyStartsUpwind */ true); - Regatta regatta = new RegattaImpl(EmptyRaceLogStore.INSTANCE, RegattaImpl.getDefaultName(regattaName, boatClass.getName()), boatClass, /* trackedRegattaRegistry */ null, + Regatta regatta = new RegattaImpl(EmptyRaceLogStore.INSTANCE, RegattaImpl.getDefaultName(regattaName, boatClass.getName()), boatClass, + /*startDate*/ null, /*endDate*/ null, /* trackedRegattaRegistry */ null, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), "123", null); TrackedRegatta trackedRegatta = new DynamicTrackedRegattaImpl(regatta); List waypoints = new ArrayList(); diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/UpdateMarkPassingTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/UpdateMarkPassingTest.java index a0f028a250d..60aacd5527f 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/UpdateMarkPassingTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/UpdateMarkPassingTest.java @@ -43,7 +43,7 @@ public class UpdateMarkPassingTest { when(race.getBoatClass()).thenReturn(new BoatClassImpl("49er", /* typicallyStartsUpwind */ true)); when(race.getCompetitors()).thenReturn(Collections.singleton(competitor)); DynamicTrackedRaceImpl trackedRace = new DynamicTrackedRaceImpl( - /* trackedRegatta */new DynamicTrackedRegattaImpl(new RegattaImpl("test", null, new HashSet(), false, null, + /* trackedRegatta */new DynamicTrackedRegattaImpl(new RegattaImpl("test", null, null, null, new HashSet(), false, null, "test", null)), race, Collections. emptyList(), EmptyWindStore.INSTANCE, EmptyGPSFixStore.INSTANCE, /* delayToLiveInMillis */1000, /* millisecondsOverWhichToAverageWind */30000, /* millisecondsOverWhichToAverageSpeed */30000); diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/WindTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/WindTest.java index 9a2b2eee66c..35efcd1af2f 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/WindTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/WindTest.java @@ -278,7 +278,7 @@ public class WindTest { final BoatClass boatClass = domainFactory.getOrCreateBoatClass("ESS40"); DynamicTrackedRace trackedRace = new DynamicTrackedRaceImpl(new DynamicTrackedRegattaImpl( new RegattaImpl(EmptyRaceLogStore.INSTANCE, RegattaImpl.getDefaultName("Test Regatta", boatClass.getName()), boatClass, - /* trackedRegattaRegistry */ null, domainFactory.createScoringScheme(ScoringSchemeType.LOW_POINT), "123", null)), + /*startDate*/ null, /*endDate*/ null, /* trackedRegattaRegistry */ null, domainFactory.createScoringScheme(ScoringSchemeType.LOW_POINT), "123", null)), new RaceDefinitionImpl("Test Race", new CourseImpl("Test Course", Arrays.asList(new Waypoint[] { w1, w2, w3 })), boatClass, Collections.singleton(competitor)), Collections. emptyList(), diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/markpassing/AbstractMockedRaceMarkPassingTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/markpassing/AbstractMockedRaceMarkPassingTest.java index 7211814d188..4e636675bbd 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/markpassing/AbstractMockedRaceMarkPassingTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/markpassing/AbstractMockedRaceMarkPassingTest.java @@ -64,7 +64,8 @@ public class AbstractMockedRaceMarkPassingTest { Waypoint w2 = new WaypointImpl(m, PassingInstruction.Port); Waypoint w3 = new WaypointImpl(cp, PassingInstruction.Line); final BoatClassImpl boatClass = new BoatClassImpl("boat", true); - Regatta r = new RegattaImpl(RegattaImpl.getDefaultName("regatta", boatClass.getName()), boatClass, Arrays.asList(new SeriesImpl("Series", true, Arrays.asList(new FleetImpl("fleet")), + Regatta r = new RegattaImpl(RegattaImpl.getDefaultName("regatta", boatClass.getName()), boatClass, + /*startDate*/ null, /*endDate*/ null, Arrays.asList(new SeriesImpl("Series", true, Arrays.asList(new FleetImpl("fleet")), new ArrayList(), null)), true, new HighPoint(), "ID", new CourseAreaImpl("area", new UUID(5, 5))); Course course = new CourseImpl("course", Arrays.asList(w1, w2, w3)); RaceDefinition race = new RaceDefinitionImpl("Performance Race", course, boatClass, Arrays.asList(bob)); diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java index 0e5c8bca2bd..7c99cfafbbd 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java @@ -7,6 +7,7 @@ import java.util.NavigableSet; import java.util.Set; import java.util.TreeSet; +import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseArea; @@ -35,7 +36,6 @@ import com.sap.sailing.domain.common.WindSource; import com.sap.sailing.domain.common.WindSourceType; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.leaderboard.ScoringScheme; -import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.tracking.GPSFixStore; import com.sap.sailing.domain.tracking.CourseDesignChangedListener; import com.sap.sailing.domain.tracking.DynamicGPSFixTrack; @@ -466,6 +466,30 @@ public class MockedTrackedRace implements DynamicTrackedRace { // TODO Auto-generated method stub } + + @Override + public TimePoint getStartDate() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void setStartDate(TimePoint startDate) { + // TODO Auto-generated method stub + + } + + @Override + public TimePoint getEndDate() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void setEndDate(TimePoint startDate) { + // TODO Auto-generated method stub + + } }; } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java index f247a8860dd..7a2195e3f03 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java @@ -7,6 +7,7 @@ import java.util.List; import java.util.NavigableSet; import java.util.Set; +import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Leg; import com.sap.sailing.domain.base.Mark; @@ -26,7 +27,6 @@ import com.sap.sailing.domain.common.SpeedWithBearing; import com.sap.sailing.domain.common.Tack; import com.sap.sailing.domain.common.WindSource; import com.sap.sailing.domain.common.WindSourceType; -import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.tracking.GPSFixStore; import com.sap.sailing.domain.tracking.CourseDesignChangedListener; import com.sap.sailing.domain.tracking.GPSFix; diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java index 5f306db3c5d..62ac48d15a1 100755 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java @@ -371,7 +371,8 @@ public class DomainFactoryImpl implements DomainFactory { // This is particularly bad if a persistent regatta was loaded but a default regatta was accidentally created. // Then, there is no way but restart the server to get rid of this stale cache entry here. if (result == null) { - result = new RegattaImpl(raceLogStore, RegattaImpl.getDefaultName(defaultRegattaNameAndBoatClass.getA(), boatClass.getName()), boatClass, trackedRegattaRegistry, + result = new RegattaImpl(raceLogStore, RegattaImpl.getDefaultName(defaultRegattaNameAndBoatClass.getA(), boatClass.getName()), boatClass, + /*startDate*/ null, /*endDate*/ null, trackedRegattaRegistry, // use the low-point system as the default scoring scheme getBaseDomainFactory().createScoringScheme(ScoringSchemeType.LOW_POINT), race.getId(), null); regattaCache.put(key, result); diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/Simulator.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/Simulator.java index 9e61efb7308..b085a47b4e2 100755 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/Simulator.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/Simulator.java @@ -104,7 +104,7 @@ public class Simulator { * {@link #setAdvanceInMillis(long)}. */ private synchronized long getAdvanceInMillis() { - while (!isAdvanceInMilliseSet()) { + while (!isAdvanceInMillisSet()) { if (trackedRace.getStartOfRace() != null) { setAdvanceInMillis(System.currentTimeMillis() - trackedRace.getStartOfRace().asMillis()); } else { @@ -173,7 +173,7 @@ public class Simulator { } private TimePoint advanceTimePointAndUseAsStartTimeIfNeeded(TimePoint time){ - if (isAdvanceInMilliseSet()) { + if (isAdvanceInMillisSet()) { return advance(time); } else { setAdvanceInMillis(System.currentTimeMillis() - time.asMillis()); @@ -181,7 +181,7 @@ public class Simulator { } } - private boolean isAdvanceInMilliseSet() { + private boolean isAdvanceInMillisSet() { return advanceInMillis != -1; } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java index 8a862523a08..ce7a6ecee40 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java @@ -1,9 +1,9 @@ package com.sap.sailing.domain.base; +import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.MetaLeaderboard; -import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.racelog.RaceLogInformation; import com.sap.sailing.domain.tracking.TrackedRace; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumnListener.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumnListener.java index e25bd4444d2..873954d9379 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumnListener.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumnListener.java @@ -2,8 +2,8 @@ package com.sap.sailing.domain.base; import java.io.Serializable; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.leaderboard.ResultDiscardingRule; -import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.tracking.TrackedRace; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/Regatta.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/Regatta.java index fd16747d261..4c3495ebeff 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/Regatta.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/Regatta.java @@ -7,6 +7,7 @@ import com.sap.sailing.domain.leaderboard.ScoringScheme; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRegatta; import com.sap.sse.common.Named; +import com.sap.sse.common.TimePoint; import com.sap.sse.common.WithID; /** @@ -19,7 +20,21 @@ import com.sap.sse.common.WithID; */ public interface Regatta extends Named, WithID { ScoringScheme getScoringScheme(); - + + /** + * @return the (optional) start date of this regatta + */ + TimePoint getStartDate(); + + void setStartDate(TimePoint startDate); + + /** + * @return the (optional) end date of this regatta + */ + TimePoint getEndDate(); + + void setEndDate(TimePoint startDate); + /** * Gets the course area for all races of this {@link Regatta}. * @return the {@link CourseArea} object. diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java index c4cc1e61c93..9f7db3b5165 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java @@ -6,11 +6,11 @@ import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; +import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.common.RaceIdentifier; -import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.racelog.RaceLogIdentifierTemplate; import com.sap.sailing.domain.racelog.RaceLogInformation; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/ObjectInputStreamResolvingAgainstDomainFactoryImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/ObjectInputStreamResolvingAgainstDomainFactoryImpl.java index dc24656d2c4..7f5fe5bf3f8 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/ObjectInputStreamResolvingAgainstDomainFactoryImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/ObjectInputStreamResolvingAgainstDomainFactoryImpl.java @@ -7,8 +7,7 @@ import com.sap.sailing.domain.base.DomainFactory; import com.sap.sse.replication.impl.ObjectInputStreamResolvingAgainstCache; public class ObjectInputStreamResolvingAgainstDomainFactoryImpl extends ObjectInputStreamResolvingAgainstCache { - ObjectInputStreamResolvingAgainstDomainFactoryImpl(InputStream in, DomainFactory domainFactory) - throws IOException { + ObjectInputStreamResolvingAgainstDomainFactoryImpl(InputStream in, DomainFactory domainFactory) throws IOException { super(in, domainFactory); } } 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 f9477ea027f..434fcafae7d 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 @@ -2,32 +2,32 @@ package com.sap.sailing.domain.base.impl; import java.io.Serializable; +import com.sap.sailing.domain.abstractlog.race.RaceLogCourseAreaChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningListChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogGateLineOpeningTimeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogPassChangeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogPathfinderEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogProtestStartTimeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogRaceStatusEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogRevokeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogStartProcedureChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; +import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.CloseOpenEndedDeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DefineMarkEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DenoteForTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceCompetitorMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMarkMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.RegisterCompetitorEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.StartTrackingEvent; 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.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; -import com.sap.sailing.domain.racelog.RaceLogProtestStartTimeEvent; -import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; -import com.sap.sailing.domain.racelog.RaceLogStartProcedureChangedEvent; -import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; -import com.sap.sailing.domain.racelog.RaceLogWindFixEvent; -import com.sap.sailing.domain.racelog.RevokeEvent; -import com.sap.sailing.domain.racelog.scoring.AdditionalScoringInformationEvent; -import com.sap.sailing.domain.racelog.tracking.CloseOpenEndedDeviceMappingEvent; -import com.sap.sailing.domain.racelog.tracking.DefineMarkEvent; -import com.sap.sailing.domain.racelog.tracking.DenoteForTrackingEvent; -import com.sap.sailing.domain.racelog.tracking.DeviceCompetitorMappingEvent; -import com.sap.sailing.domain.racelog.tracking.DeviceMarkMappingEvent; -import com.sap.sailing.domain.racelog.tracking.RegisterCompetitorEvent; -import com.sap.sailing.domain.racelog.tracking.StartTrackingEvent; public class RaceColumnRaceLogReplicator implements RaceLogEventVisitor, Serializable { private static final long serialVersionUID = 4752330236765192592L; @@ -133,7 +133,7 @@ public class RaceColumnRaceLogReplicator implements RaceLogEventVisitor, Seriali } @Override - public void visit(RevokeEvent event) { + public void visit(RaceLogRevokeEvent event) { notifyOnAdd(event); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java index aea5a989e91..039fe4e3fa0 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java @@ -10,6 +10,7 @@ import java.util.List; import java.util.Set; import java.util.logging.Logger; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseArea; @@ -29,7 +30,6 @@ import com.sap.sailing.domain.common.RegattaName; import com.sap.sailing.domain.common.RegattaNameAndRaceName; import com.sap.sailing.domain.leaderboard.ResultDiscardingRule; import com.sap.sailing.domain.leaderboard.ScoringScheme; -import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.racelog.RaceLogInformation; import com.sap.sailing.domain.racelog.RaceLogStore; @@ -40,6 +40,7 @@ import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRegatta; import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; import com.sap.sailing.util.impl.RaceColumnListeners; +import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.impl.NamedImpl; @@ -67,6 +68,8 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene private List series; private final RaceColumnListeners raceColumnListeners; private final ScoringScheme scoringScheme; + private TimePoint startDate; + private TimePoint endDate; private final Serializable id; private transient RaceLogStore raceLogStore; @@ -91,8 +94,8 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene /** * Constructs a regatta with an empty {@link RaceLogStore}. */ - public RegattaImpl(String name, BoatClass boatClass, Iterable series, boolean persistent, ScoringScheme scoringScheme, Serializable id, CourseArea courseArea) { - this(EmptyRaceLogStore.INSTANCE, name, boatClass, series, persistent, scoringScheme, id, courseArea, /* useStartTimeInference */ true); + public RegattaImpl(String name, BoatClass boatClass, TimePoint startDate, TimePoint endDate, Iterable series, boolean persistent, ScoringScheme scoringScheme, Serializable id, CourseArea courseArea) { + this(EmptyRaceLogStore.INSTANCE, name, boatClass, startDate, endDate, series, persistent, scoringScheme, id, courseArea, /* useStartTimeInference */ true); } /** @@ -105,8 +108,8 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene * this column's series {@link Regatta}, respectively. If null, the re-association won't be * carried out. */ - public RegattaImpl(RaceLogStore raceLogStore, String name, BoatClass boatClass, TrackedRegattaRegistry trackedRegattaRegistry, ScoringScheme scoringScheme, Serializable id, CourseArea courseArea) { - this(raceLogStore, name, boatClass, Collections.singletonList(new SeriesImpl(LeaderboardNameConstants.DEFAULT_SERIES_NAME, + public RegattaImpl(RaceLogStore raceLogStore, String name, BoatClass boatClass, TimePoint startDate, TimePoint endDate, TrackedRegattaRegistry trackedRegattaRegistry, ScoringScheme scoringScheme, Serializable id, CourseArea courseArea) { + this(raceLogStore, name, boatClass, startDate, endDate, Collections.singletonList(new SeriesImpl(LeaderboardNameConstants.DEFAULT_SERIES_NAME, /* isMedal */false, Collections .singletonList(new FleetImpl(LeaderboardNameConstants.DEFAULT_FLEET_NAME)), /* race column names */new ArrayList(), trackedRegattaRegistry)), /* persistent */false, scoringScheme, id, courseArea, /* useStartTimeInference */ true); @@ -117,7 +120,7 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene * all {@link Series} in this iterable will have their {@link Series#setRegatta(Regatta) regatta set} to * this new regatta. */ - public RegattaImpl(RaceLogStore raceLogStore, String name, BoatClass boatClass, Iterable series, boolean persistent, ScoringScheme scoringScheme, Serializable id, CourseArea courseArea, boolean useStartTimeInference) { + public RegattaImpl(RaceLogStore raceLogStore, String name, BoatClass boatClass, TimePoint startDate, TimePoint endDate, Iterable series, boolean persistent, ScoringScheme scoringScheme, Serializable id, CourseArea courseArea, boolean useStartTimeInference) { super(name); this.useStartTimeInference = useStartTimeInference; this.id = id; @@ -126,6 +129,8 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene regattaListeners = new HashSet(); raceColumnListeners = new RaceColumnListeners(); this.boatClass = boatClass; + this.startDate = startDate; + this.endDate = endDate; List seriesList = new ArrayList(); for (S s : series) { seriesList.add(s); @@ -401,6 +406,26 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene return scoringScheme; } + @Override + public TimePoint getStartDate() { + return startDate; + } + + @Override + public void setStartDate(TimePoint startDate) { + this.startDate = startDate; + } + + @Override + public TimePoint getEndDate() { + return endDate; + } + + @Override + public void setEndDate(TimePoint endDate) { + this.endDate = endDate; + } + @Override public CourseArea getDefaultCourseArea() { return defaultCourseArea; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java index 10ac77b612b..e61d34d46a9 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java @@ -6,6 +6,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; @@ -17,7 +18,6 @@ import com.sap.sailing.domain.base.Series; import com.sap.sailing.domain.common.impl.RenamableImpl; import com.sap.sailing.domain.leaderboard.ResultDiscardingRule; import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule; -import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRegatta; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/LeaderboardCacheManager.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/LeaderboardCacheManager.java index ab38a4698bc..93fa4dacce7 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/LeaderboardCacheManager.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/LeaderboardCacheManager.java @@ -7,6 +7,7 @@ import java.util.Set; import java.util.WeakHashMap; import java.util.concurrent.ConcurrentHashMap; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CompetitorChangeListener; import com.sap.sailing.domain.base.Fleet; @@ -17,7 +18,6 @@ import com.sap.sailing.domain.base.WithNationality; import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.leaderboard.caching.LeaderboardCache; -import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.tracking.RaceChangeListener; import com.sap.sailing.domain.tracking.TrackedRace; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractSimpleLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractSimpleLeaderboardImpl.java index 740f8540816..833cad901f5 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractSimpleLeaderboardImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractSimpleLeaderboardImpl.java @@ -29,6 +29,8 @@ import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; +import com.sap.sailing.domain.abstractlog.race.InvalidatesLeaderboardCache; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Course; import com.sap.sailing.domain.base.DomainFactory; @@ -64,8 +66,6 @@ import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule; import com.sap.sailing.domain.leaderboard.caching.LeaderboardDTOCache; import com.sap.sailing.domain.leaderboard.caching.LeaderboardDTOCalculationReuseCache; import com.sap.sailing.domain.leaderboard.caching.LiveLeaderboardUpdater; -import com.sap.sailing.domain.racelog.InvalidatesLeaderboardCache; -import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.tracking.GPSFixMoving; import com.sap.sailing.domain.tracking.GPSFixTrack; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/DelayedLeaderboardCorrectionsImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/DelayedLeaderboardCorrectionsImpl.java index db43fde2b16..95979bb56e6 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/DelayedLeaderboardCorrectionsImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/DelayedLeaderboardCorrectionsImpl.java @@ -9,6 +9,7 @@ import java.util.Iterator; import java.util.Map; import java.util.Set; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CompetitorFactory; import com.sap.sailing.domain.base.Fleet; @@ -19,7 +20,6 @@ import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.leaderboard.DelayedLeaderboardCorrections; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.ResultDiscardingRule; -import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sse.common.IsManagedByCache; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/HighPointFirstGets10Or8AndLastBreaksTie.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/HighPointFirstGets10Or8AndLastBreaksTie.java index ea6a65ba6a3..839bd89689d 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/HighPointFirstGets10Or8AndLastBreaksTie.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/HighPointFirstGets10Or8AndLastBreaksTie.java @@ -3,15 +3,15 @@ package com.sap.sailing.domain.leaderboard.impl; import java.util.List; import java.util.concurrent.Callable; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.AdditionalScoringInformationFinder; +import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationEvent; +import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationType; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.common.ScoringSchemeType; import com.sap.sailing.domain.leaderboard.NumberOfCompetitorsInLeaderboardFetcher; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.analyzing.impl.AdditionalScoringInformationFinder; -import com.sap.sailing.domain.racelog.scoring.AdditionalScoringInformationEvent; -import com.sap.sailing.domain.racelog.scoring.AdditionalScoringInformationType; import com.sap.sse.common.Util; /** diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java index 71d5f4de383..2e7256cb934 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java @@ -2,6 +2,8 @@ package com.sap.sailing.domain.leaderboard.meta; import java.util.Collections; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; @@ -10,8 +12,6 @@ import com.sap.sailing.domain.base.impl.SimpleAbstractRaceColumn; import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.ResultDiscardingRule; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.racelog.RaceLogInformation; import com.sap.sailing.domain.tracking.TrackedRace; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/RaceLogIdentifierTemplate.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/RaceLogIdentifierTemplate.java index 0cd245195ab..c3174298439 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/RaceLogIdentifierTemplate.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/RaceLogIdentifierTemplate.java @@ -2,6 +2,7 @@ package com.sap.sailing.domain.racelog; import java.io.Serializable; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.Regatta; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/RaceLogInformation.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/RaceLogInformation.java index a1445b29d9e..00f63e6051a 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/RaceLogInformation.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/RaceLogInformation.java @@ -1,5 +1,6 @@ package com.sap.sailing.domain.racelog; +import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.Regatta; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/RaceLogStore.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/RaceLogStore.java index f4cbcd1bf59..c2a269e7a4c 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/RaceLogStore.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/RaceLogStore.java @@ -1,5 +1,7 @@ package com.sap.sailing.domain.racelog; +import com.sap.sailing.domain.abstractlog.race.RaceLog; + public interface RaceLogStore { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/impl/EmptyRaceLogStore.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/impl/EmptyRaceLogStore.java index ab7ae7ff220..c67746c4e35 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/impl/EmptyRaceLogStore.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/impl/EmptyRaceLogStore.java @@ -3,7 +3,8 @@ package com.sap.sailing.domain.racelog.impl; import java.util.UUID; -import com.sap.sailing.domain.racelog.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogImpl; import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.racelog.RaceLogStore; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/impl/RaceLogInformationImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/impl/RaceLogInformationImpl.java index 741657ae111..b34b41dac3f 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/impl/RaceLogInformationImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/impl/RaceLogInformationImpl.java @@ -1,8 +1,8 @@ package com.sap.sailing.domain.racelog.impl; +import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; -import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.RaceLogIdentifierTemplate; import com.sap.sailing.domain.racelog.RaceLogInformation; import com.sap.sailing.domain.racelog.RaceLogStore; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/EmptyGPSFixStore.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/EmptyGPSFixStore.java index 17cb25c8fe2..fb4fb3ebc6f 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/EmptyGPSFixStore.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/EmptyGPSFixStore.java @@ -1,9 +1,11 @@ package com.sap.sailing.domain.racelog.tracking; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMapping; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.common.TimeRange; -import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.tracking.DynamicGPSFixTrack; import com.sap.sailing.domain.tracking.GPSFix; import com.sap.sailing.domain.tracking.GPSFixMoving; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/GPSFixReceivedListener.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/GPSFixReceivedListener.java index f29eeefee6c..b408e124a11 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/GPSFixReceivedListener.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/GPSFixReceivedListener.java @@ -1,5 +1,6 @@ package com.sap.sailing.domain.racelog.tracking; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; import com.sap.sailing.domain.tracking.GPSFix; public interface GPSFixReceivedListener { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/GPSFixStore.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/GPSFixStore.java index 4ca34d160a6..cae62dd832d 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/GPSFixStore.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/GPSFixStore.java @@ -1,11 +1,15 @@ package com.sap.sailing.domain.racelog.tracking; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceCompetitorMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMapping; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMarkMappingEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.common.TimeRange; import com.sap.sailing.domain.common.racelog.tracking.NoCorrespondingServiceRegisteredException; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; -import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.tracking.DynamicGPSFixTrack; import com.sap.sailing.domain.tracking.GPSFix; import com.sap.sailing.domain.tracking.GPSFixMoving; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackfiles/TrackFileImportDeviceIdentifier.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackfiles/TrackFileImportDeviceIdentifier.java index 5733f136311..01e488a0564 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackfiles/TrackFileImportDeviceIdentifier.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackfiles/TrackFileImportDeviceIdentifier.java @@ -2,7 +2,7 @@ package com.sap.sailing.domain.trackfiles; import java.util.UUID; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; import com.sap.sse.common.TimePoint; /** diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackfiles/TrackFileImportDeviceIdentifierImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackfiles/TrackFileImportDeviceIdentifierImpl.java index 0fee9f1d938..e6d3ce02b18 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackfiles/TrackFileImportDeviceIdentifierImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackfiles/TrackFileImportDeviceIdentifierImpl.java @@ -4,8 +4,8 @@ import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackimport/GPSFixImporter.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackimport/GPSFixImporter.java index a82a85535b2..fa5a585741f 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackimport/GPSFixImporter.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackimport/GPSFixImporter.java @@ -4,7 +4,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.Map; -import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier; import com.sap.sailing.domain.trackfiles.TrackFileImportDeviceIdentifier; import com.sap.sailing.domain.tracking.GPSFix; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java index f43031a9f58..06b1dc85562 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java @@ -6,6 +6,8 @@ import java.util.NavigableSet; import java.util.Set; import java.util.SortedSet; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMappingEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Course; import com.sap.sailing.domain.base.Leg; @@ -28,8 +30,6 @@ import com.sap.sailing.domain.common.TrackedRaceStatusEnum; import com.sap.sailing.domain.common.WindSource; import com.sap.sailing.domain.common.WindSourceType; import com.sap.sailing.domain.common.dto.TrackedRaceDTO; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.tracking.DeviceMappingEvent; import com.sap.sailing.domain.racelog.tracking.GPSFixStore; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java index 049ab9a1678..36d6fb8a160 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java @@ -17,6 +17,7 @@ import java.util.function.Consumer; import java.util.logging.Level; import java.util.logging.Logger; +import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseBase; @@ -34,7 +35,6 @@ import com.sap.sailing.domain.common.WindSource; import com.sap.sailing.domain.common.WindSourceType; import com.sap.sailing.domain.common.impl.WindSourceImpl; import com.sap.sailing.domain.common.racelog.Flags; -import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.tracking.GPSFixStore; import com.sap.sailing.domain.tracking.CourseDesignChangedListener; import com.sap.sailing.domain.tracking.DynamicGPSFixTrack; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceLogListener.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceLogListener.java index 7d766c7b750..cfd7b02e66f 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceLogListener.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceLogListener.java @@ -2,22 +2,22 @@ package com.sap.sailing.domain.tracking.impl; import java.util.logging.Logger; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogPassChangeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.AbortingFlagFinder; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.LastPublishedCourseDesignFinder; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.StartTimeFinder; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.WindFixesFinder; +import com.sap.sailing.domain.abstractlog.race.impl.BaseRaceLogEventVisitor; import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.common.WindSource; import com.sap.sailing.domain.common.WindSourceType; import com.sap.sailing.domain.common.impl.WindSourceImpl; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogCourseDesignChangedEvent; -import com.sap.sailing.domain.racelog.RaceLogFlagEvent; -import com.sap.sailing.domain.racelog.RaceLogPassChangeEvent; -import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; -import com.sap.sailing.domain.racelog.RaceLogWindFixEvent; -import com.sap.sailing.domain.racelog.analyzing.impl.AbortingFlagFinder; -import com.sap.sailing.domain.racelog.analyzing.impl.LastPublishedCourseDesignFinder; -import com.sap.sailing.domain.racelog.analyzing.impl.StartTimeFinder; -import com.sap.sailing.domain.racelog.analyzing.impl.WindFixesFinder; -import com.sap.sailing.domain.racelog.impl.BaseRaceLogEventVisitor; import com.sap.sailing.domain.tracking.DynamicTrackedRace; import com.sap.sailing.domain.tracking.Wind; import com.sap.sse.common.TimePoint; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index 5bfe0f03693..37e5bcad38b 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -31,6 +31,9 @@ import java.util.concurrent.FutureTask; import java.util.logging.Level; import java.util.logging.Logger; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.StartTimeFinder; +import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMapping; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Course; @@ -81,9 +84,6 @@ import com.sap.sailing.domain.common.racelog.tracking.TransformationException; import com.sap.sailing.domain.common.scalablevalue.impl.ScalablePosition; import com.sap.sailing.domain.confidence.ConfidenceBasedWindAverager; import com.sap.sailing.domain.confidence.ConfidenceFactory; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.analyzing.impl.StartTimeFinder; -import com.sap.sailing.domain.racelog.tracking.DeviceMapping; import com.sap.sailing.domain.racelog.tracking.GPSFixStore; import com.sap.sailing.domain.tracking.DynamicGPSFixTrack; import com.sap.sailing.domain.tracking.GPSFix; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/util/impl/RaceColumnListeners.java b/java/com.sap.sailing.domain/src/com/sap/sailing/util/impl/RaceColumnListeners.java index 32d21ec2be0..423c503712c 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/util/impl/RaceColumnListeners.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/util/impl/RaceColumnListeners.java @@ -7,12 +7,12 @@ import java.io.Serializable; import java.util.HashSet; import java.util.Set; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.RaceColumnListener; import com.sap.sailing.domain.leaderboard.ResultDiscardingRule; -import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.tracking.TrackedRace; diff --git a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java index fe239e0b331..96aaa7902cc 100755 --- a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java +++ b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.NavigableSet; import java.util.Set; +import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseArea; @@ -33,7 +34,6 @@ import com.sap.sailing.domain.common.WindSource; import com.sap.sailing.domain.common.WindSourceType; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.leaderboard.ScoringScheme; -import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.tracking.GPSFixStore; import com.sap.sailing.domain.tracking.CourseDesignChangedListener; import com.sap.sailing.domain.tracking.DynamicGPSFixTrack; @@ -466,6 +466,30 @@ public class MockedTrackedRace implements DynamicTrackedRace { // TODO Auto-generated method stub } + + @Override + public TimePoint getStartDate() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void setStartDate(TimePoint startDate) { + // TODO Auto-generated method stub + + } + + @Override + public TimePoint getEndDate() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void setEndDate(TimePoint startDate) { + // TODO Auto-generated method stub + + } }; } diff --git a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/PingMarkViaRaceLogTest.java b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/PingMarkViaRaceLogTest.java index cd119a60aac..673c2dcdd2e 100644 --- a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/PingMarkViaRaceLogTest.java +++ b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/PingMarkViaRaceLogTest.java @@ -35,7 +35,8 @@ public class PingMarkViaRaceLogTest { service.getMongoObjectFactory().getDatabase().dropDatabase(); Series series = new SeriesImpl("series", false, Collections.singletonList(fleet), Collections.singletonList(columnName), service); - Regatta regatta = service.createRegatta(RegattaImpl.getDefaultName("regatta", "Laser"), "Laser", UUID.randomUUID(), Collections.singletonList(series), + Regatta regatta = service.createRegatta(RegattaImpl.getDefaultName("regatta", "Laser"), "Laser", /*startDate*/ null, /*endDate*/ null, + UUID.randomUUID(), Collections.singletonList(series), false, new HighPoint(), UUID.randomUUID(), /* useStartTimeInference */ true); RegattaLeaderboard leaderboard = service.addRegattaLeaderboard(regatta.getRegattaIdentifier(), "RegattaLeaderboard", new int[] {}); diff --git a/java/com.sap.sailing.gwt.ui/.settings/com.google.gwt.eclipse.core.prefs b/java/com.sap.sailing.gwt.ui/.settings/com.google.gwt.eclipse.core.prefs index 6a92d8b134a..2924ef1a466 100755 --- a/java/com.sap.sailing.gwt.ui/.settings/com.google.gwt.eclipse.core.prefs +++ b/java/com.sap.sailing.gwt.ui/.settings/com.google.gwt.eclipse.core.prefs @@ -1,4 +1,4 @@ eclipse.preferences.version=1 entryPointModules= filesCopiedToWebInfLib=gwt-servlet.jar -gwtCompileSettings=PGd3dC1jb21waWxlLXNldHRpbmdzPjxsb2ctbGV2ZWw+SU5GTzwvbG9nLWxldmVsPjxvdXRwdXQtc3R5bGU+T0JGVVNDQVRFRDwvb3V0cHV0LXN0eWxlPjxleHRyYS1hcmdzPjwhW0NEQVRBWy13YXIgLiAtbG9jYWxXb3JrZXJzIDMgLXN0cmljdCAtbG9nTGV2ZWwgVFJBQ0VdXT48L2V4dHJhLWFyZ3M+PHZtLWFyZ3M+PCFbQ0RBVEFbLVhteDIwMjRtIC1EZ3d0LnVzZWFyY2hpdmVzPWZhbHNlXV0+PC92bS1hcmdzPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLnNhcC5zYWlsaW5nLmd3dC51aS5BZG1pbkNvbnNvbGU8L2VudHJ5LXBvaW50LW1vZHVsZT48ZW50cnktcG9pbnQtbW9kdWxlPmNvbS5zYXAuc2FpbGluZy5nd3QuQXV0b1BsYXk8L2VudHJ5LXBvaW50LW1vZHVsZT48ZW50cnktcG9pbnQtbW9kdWxlPmNvbS5zYXAuc2FpbGluZy5nd3QudWkuRGF0YU1pbmluZzwvZW50cnktcG9pbnQtbW9kdWxlPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLnNhcC5zYWlsaW5nLmd3dC5Ib21lPC9lbnRyeS1wb2ludC1tb2R1bGU+PGVudHJ5LXBvaW50LW1vZHVsZT5jb20uc2FwLnNhaWxpbmcuZ3d0LnVpLkxlYWRlcmJvYXJkPC9lbnRyeS1wb2ludC1tb2R1bGU+PGVudHJ5LXBvaW50LW1vZHVsZT5jb20uc2FwLnNhaWxpbmcuZ3d0LnVpLkxlYWRlcmJvYXJkRWRpdGluZzwvZW50cnktcG9pbnQtbW9kdWxlPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLnNhcC5zYWlsaW5nLmd3dC51aS5Qb2xhclNoZWV0czwvZW50cnktcG9pbnQtbW9kdWxlPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLnNhcC5zYWlsaW5nLmd3dC51aS5SYWNlQm9hcmQ8L2VudHJ5LXBvaW50LW1vZHVsZT48ZW50cnktcG9pbnQtbW9kdWxlPmNvbS5zYXAuc2FpbGluZy5nd3QudWkuUmVnYXR0YU92ZXJ2aWV3PC9lbnRyeS1wb2ludC1tb2R1bGU+PGVudHJ5LXBvaW50LW1vZHVsZT5jb20uc2FwLnNhaWxpbmcuZ3d0LnVpLlNpbXVsYXRvcjwvZW50cnktcG9pbnQtbW9kdWxlPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLnNhcC5zYWlsaW5nLmd3dC51aS5TcGVjdGF0b3I8L2VudHJ5LXBvaW50LW1vZHVsZT48ZW50cnktcG9pbnQtbW9kdWxlPmNvbS5zYXAuc2FpbGluZy5nd3QudWkuVmlkZW9Qb3B1cDwvZW50cnktcG9pbnQtbW9kdWxlPjwvZ3d0LWNvbXBpbGUtc2V0dGluZ3M+ +gwtCompileSettings=PGd3dC1jb21waWxlLXNldHRpbmdzPjxsb2ctbGV2ZWw+SU5GTzwvbG9nLWxldmVsPjxvdXRwdXQtc3R5bGU+T0JGVVNDQVRFRDwvb3V0cHV0LXN0eWxlPjxleHRyYS1hcmdzPjwhW0NEQVRBWy13YXIgLiAtbG9jYWxXb3JrZXJzIDMgLXN0cmljdCAtbG9nTGV2ZWwgVFJBQ0VdXT48L2V4dHJhLWFyZ3M+PHZtLWFyZ3M+PCFbQ0RBVEFbLVhteDIwMjRtIC1EZ3d0LnVzZWFyY2hpdmVzPWZhbHNlXV0+PC92bS1hcmdzPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLnNhcC5zYWlsaW5nLmd3dC51aS5BZG1pbkNvbnNvbGU8L2VudHJ5LXBvaW50LW1vZHVsZT48ZW50cnktcG9pbnQtbW9kdWxlPmNvbS5zYXAuc2FpbGluZy5nd3QuQXV0b1BsYXk8L2VudHJ5LXBvaW50LW1vZHVsZT48ZW50cnktcG9pbnQtbW9kdWxlPmNvbS5zYXAuc2FpbGluZy5nd3QudWkuRGF0YU1pbmluZzwvZW50cnktcG9pbnQtbW9kdWxlPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLnNhcC5zYWlsaW5nLmd3dC5Ib21lPC9lbnRyeS1wb2ludC1tb2R1bGU+PGVudHJ5LXBvaW50LW1vZHVsZT5jb20uc2FwLnNhaWxpbmcuZ3d0LnVpLkxlYWRlcmJvYXJkPC9lbnRyeS1wb2ludC1tb2R1bGU+PGVudHJ5LXBvaW50LW1vZHVsZT5jb20uc2FwLnNhaWxpbmcuZ3d0LnVpLkxlYWRlcmJvYXJkRWRpdGluZzwvZW50cnktcG9pbnQtbW9kdWxlPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLnNhcC5zYWlsaW5nLmd3dC51aS5Qb2xhclNoZWV0czwvZW50cnktcG9pbnQtbW9kdWxlPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLnNhcC5zYWlsaW5nLmd3dC51aS5SYWNlQm9hcmQ8L2VudHJ5LXBvaW50LW1vZHVsZT48ZW50cnktcG9pbnQtbW9kdWxlPmNvbS5zYXAuc2FpbGluZy5nd3QudWkuUmVnYXR0YU92ZXJ2aWV3PC9lbnRyeS1wb2ludC1tb2R1bGU+PGVudHJ5LXBvaW50LW1vZHVsZT5jb20uc2FwLnNhaWxpbmcuZ3d0LnVpLlNpbXVsYXRvcjwvZW50cnktcG9pbnQtbW9kdWxlPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLnNhcC5zYWlsaW5nLmd3dC51aS5TcGVjdGF0b3I8L2VudHJ5LXBvaW50LW1vZHVsZT48ZW50cnktcG9pbnQtbW9kdWxlPmNvbS5zYXAuc2FpbGluZy5nd3QudWkuVmlkZW9Qb3B1cDwvZW50cnktcG9pbnQtbW9kdWxlPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLnNhcC5zYWlsaW5nLmd3dC51aS5Zb3V0dWJlUG9wdXA8L2VudHJ5LXBvaW50LW1vZHVsZT48L2d3dC1jb21waWxlLXNldHRpbmdzPg\=\= diff --git a/java/com.sap.sailing.gwt.ui/META-INF/MANIFEST.MF b/java/com.sap.sailing.gwt.ui/META-INF/MANIFEST.MF index 8e55b20f2a4..bba0d754f65 100755 --- a/java/com.sap.sailing.gwt.ui/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.gwt.ui/META-INF/MANIFEST.MF @@ -41,7 +41,8 @@ Require-Bundle: com.sap.sailing.domain, org.apache.shiro.ehcache;bundle-version="1.2.3", com.sap.sse.gwt.adminconsole, com.sap.sse.operationaltransformation, - com.sap.sse + com.sap.sse, + com.sap.sse.security.common Bundle-Activator: com.sap.sailing.gwt.ui.server.Activator Bundle-ActivationPolicy: lazy Import-Package: com.sap.sailing.polars, diff --git a/java/com.sap.sailing.gwt.ui/SailingGWT Remote Profiling (Run-Mode only).launch b/java/com.sap.sailing.gwt.ui/SailingGWT Remote Profiling (Run-Mode only).launch old mode 100644 new mode 100755 diff --git a/java/com.sap.sailing.gwt.ui/SailingGWT.launch b/java/com.sap.sailing.gwt.ui/SailingGWT.launch old mode 100644 new mode 100755 index 55ea7b4ab73..495d9608fa0 --- a/java/com.sap.sailing.gwt.ui/SailingGWT.launch +++ b/java/com.sap.sailing.gwt.ui/SailingGWT.launch @@ -30,37 +30,38 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.gwt.ui/pom.xml b/java/com.sap.sailing.gwt.ui/pom.xml index 5e1e99c92ae..b0cfb0e202a 100644 --- a/java/com.sap.sailing.gwt.ui/pom.xml +++ b/java/com.sap.sailing.gwt.ui/pom.xml @@ -88,7 +88,7 @@ com.sap.sailing - com.sap.sse.security + com.sap.sse.security.common 1.0.0-SNAPSHOT sources @@ -131,7 +131,7 @@ com.sap.sailing.gwt.ui.PolarSheets ${basedir}/.generated - 3 + 7 ${basedir} ${basedir}/src/main/resources + com.sap.sailing + 1.0.0-SNAPSHOT + + + 0.21.0 + + + com.sap.sailing.targetplatform.base + + + + + org.eclipse.tycho.extras + tycho-p2-extras-plugin + ${tycho-version} + + ${basedir} + + + + generate-full-metadata + compile + + publish-features-and-bundles + + + + + + + diff --git a/java/com.sap.sailing.targetplatform.updater/TargetPlatformUpdater.launch b/java/com.sap.sailing.targetplatform.updater/TargetPlatformUpdater.launch index 2b4a4fb9ca9..6da393b1491 100644 --- a/java/com.sap.sailing.targetplatform.updater/TargetPlatformUpdater.launch +++ b/java/com.sap.sailing.targetplatform.updater/TargetPlatformUpdater.launch @@ -7,7 +7,7 @@ - + diff --git a/java/com.sap.sailing.targetplatform/build.properties b/java/com.sap.sailing.targetplatform/build.properties deleted file mode 100755 index e69de29bb2d..00000000000 diff --git a/java/com.sap.sailing.targetplatform/definitions/.gitignore b/java/com.sap.sailing.targetplatform/definitions/.gitignore new file mode 100644 index 00000000000..1216ccd286f --- /dev/null +++ b/java/com.sap.sailing.targetplatform/definitions/.gitignore @@ -0,0 +1,2 @@ +# auto-generated by ../scripts/createLocalTargetDef.sh +race-analysis-p2-local.target diff --git a/java/com.sap.sailing.targetplatform/definitions/README_P2ADMIN b/java/com.sap.sailing.targetplatform/definitions/README_P2ADMIN new file mode 100644 index 00000000000..a12204b1ff9 --- /dev/null +++ b/java/com.sap.sailing.targetplatform/definitions/README_P2ADMIN @@ -0,0 +1,3 @@ +The former "p2admin" target definition is not tracked in the repository anymore. +Instead, it can be generated from the existing target definition via ``../scripts/createLocalTargetDef.sh``. +This script copies the existing target definition and replaces the remote URL ``http://p2.sapsailing.com/p2/sailing/`` with a local ``file://`` URL. diff --git a/java/com.sap.sailing.targetplatform/definitions/race-analysis-p2-ide-p2admin.target b/java/com.sap.sailing.targetplatform/definitions/race-analysis-p2-ide-p2admin.target deleted file mode 100644 index c625c47a115..00000000000 --- a/java/com.sap.sailing.targetplatform/definitions/race-analysis-p2-ide-p2admin.target +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/java/com.sap.sailing.targetplatform/definitions/race-analysis-p2-maven-central.target b/java/com.sap.sailing.targetplatform/definitions/race-analysis-p2-maven-central.target deleted file mode 100644 index 05807e6e076..00000000000 --- a/java/com.sap.sailing.targetplatform/definitions/race-analysis-p2-maven-central.target +++ /dev/null @@ -1,224 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/java/com.sap.sailing.targetplatform/definitions/race-analysis-p2-maven-local.target b/java/com.sap.sailing.targetplatform/definitions/race-analysis-p2-maven-local.target deleted file mode 100644 index f7902cce6bf..00000000000 --- a/java/com.sap.sailing.targetplatform/definitions/race-analysis-p2-maven-local.target +++ /dev/null @@ -1,224 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/java/com.sap.sailing.targetplatform/definitions/race-analysis-p2-ide-local.target b/java/com.sap.sailing.targetplatform/definitions/race-analysis-p2-remote.target similarity index 96% rename from java/com.sap.sailing.targetplatform/definitions/race-analysis-p2-ide-local.target rename to java/com.sap.sailing.targetplatform/definitions/race-analysis-p2-remote.target index 12878d23f95..96d86d00b19 100755 --- a/java/com.sap.sailing.targetplatform/definitions/race-analysis-p2-ide-local.target +++ b/java/com.sap.sailing.targetplatform/definitions/race-analysis-p2-remote.target @@ -1,5 +1,5 @@ - + @@ -9,30 +9,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -63,6 +39,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -80,11 +80,9 @@ - - @@ -93,7 +91,6 @@ - diff --git a/java/com.sap.sailing.targetplatform/scripts/createLocalBaseP2repository.sh b/java/com.sap.sailing.targetplatform/scripts/createLocalBaseP2repository.sh index e54847dc964..431be11193e 100755 --- a/java/com.sap.sailing.targetplatform/scripts/createLocalBaseP2repository.sh +++ b/java/com.sap.sailing.targetplatform/scripts/createLocalBaseP2repository.sh @@ -1,22 +1,3 @@ #!/bin/bash -set -u -if [ "$ECLIPSE_HOME" = "" ]; then - ECLIPSE_HOME=C:/Users/D056866/Sailing/eclipse -fi -if [ "$SAILING_GIT_HOME" = "" ]; then - SAILING_GIT_HOME=C:/Users/D056866/Sailing/git -fi -TARGET_PLATFORM_BASE_DIR=${SAILING_GIT_HOME}/java/com.sap.sailing.targetplatform.base - -ECLIPSE_VM_ARGS="-Xmx256m" -ECLIPSE_LAUNCHER=${ECLIPSE_HOME}/plugins/org.eclipse.equinox.launcher_*.jar - -echo TARGET_PLATFORM_BASE_DIR is $SAILING_GIT_HOME -echo ECLIPSE_HOME is $ECLIPSE_HOME -echo Eclipse Launcher $ECLIPSE_LAUNCHER - -java -jar ${ECLIPSE_LAUNCHER} -consolelog -nosplash -verbose -application org.eclipse.equinox.p2.publisher.UpdateSitePublisher \ - -metadataRepository file:/${TARGET_PLATFORM_BASE_DIR}/gen/p2 \ - -artifactRepository file:/${TARGET_PLATFORM_BASE_DIR}/gen/p2 \ - -source ${TARGET_PLATFORM_BASE_DIR} \ - -publishArtifacts -publishArtifactRepository -compress -noDefaultIUs -vmargs ${ECLIPSE_VM_ARGS} +cd ../../com.sap.sailing.targetplatform.base +mvn clean compile diff --git a/java/com.sap.sailing.targetplatform/scripts/createLocalBaseP2repositoryLinux.sh b/java/com.sap.sailing.targetplatform/scripts/createLocalBaseP2repositoryLinux.sh deleted file mode 100755 index d965e839b15..00000000000 --- a/java/com.sap.sailing.targetplatform/scripts/createLocalBaseP2repositoryLinux.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash -# see http://wiki.eclipse.org/Equinox/p2/Publisher for documentation - -if [ "$ECLIPSE_HOME" = "" ]; then - ECLIPSE_BIN=`which eclipse` - ECLIPSE_HOME="`dirname $ECLIPSE_BIN`" -fi - -SAILING_GIT_HOME="`pwd`/../../.." - -TARGET_PLATFORM_BASE_DIR=${SAILING_GIT_HOME}/java/com.sap.sailing.targetplatform.base -ECLIPSE_VM_ARGS="-Xmx256m" -ECLIPSE_LAUNCHER=${ECLIPSE_HOME}/plugins/org.eclipse.equinox.launcher_*.jar - -echo "Deploying metadata to $TARGET_PLATFORM_BASE_DIR/gen/p2..." - -java -jar ${ECLIPSE_LAUNCHER} -consolelog -nosplash -verbose -application org.eclipse.equinox.p2.publisher.UpdateSitePublisher \ - -metadataRepository file:/${TARGET_PLATFORM_BASE_DIR}/gen/p2 \ - -artifactRepository file:/${TARGET_PLATFORM_BASE_DIR}/gen/p2 \ - -source ${TARGET_PLATFORM_BASE_DIR} \ - -publishArtifacts -publishArtifactRepository -compress -noDefaultIUs -vmargs ${ECLIPSE_VM_ARGS} diff --git a/java/com.sap.sailing.targetplatform/scripts/createLocalTargetDef.sh b/java/com.sap.sailing.targetplatform/scripts/createLocalTargetDef.sh new file mode 100755 index 00000000000..e38201b5bc3 --- /dev/null +++ b/java/com.sap.sailing.targetplatform/scripts/createLocalTargetDef.sh @@ -0,0 +1,9 @@ +#!/bin/bash +# generate a target definition pointing to the locally built p2 repo from the race-analysis-p2-remote target defintion + +base="../definitions/race-analysis-p2" +remote_repo="http://p2.sapsailing.com/p2/sailing/" +local_repo="file://`readlink -f ../../com.sap.sailing.targetplatform.base/target/repository/ | sed -e 's/\/cygdrive\/\(.\)/\/\1:/'`" + +# replace remote p2-repo URL with local repo URL +sed -e "/^ $base-local.target diff --git a/java/com.sap.sailing.targetplatform/scripts/uploadRepositoryToServer.sh b/java/com.sap.sailing.targetplatform/scripts/uploadRepositoryToServer.sh index 81c1a45fe4b..ea28968942c 100755 --- a/java/com.sap.sailing.targetplatform/scripts/uploadRepositoryToServer.sh +++ b/java/com.sap.sailing.targetplatform/scripts/uploadRepositoryToServer.sh @@ -19,7 +19,7 @@ echo "Removing old p2-repository" ssh $USER@$SERVER "rm -rf $REPO_HOME/sailing" echo "Uploading local repository to $REPO_HOME/sailing" -scp -r ../../com.sap.sailing.targetplatform.base/gen/p2 $USER@$SERVER:$REPO_HOME/sailing +scp -r ../../com.sap.sailing.targetplatform.base/target/repository $USER@$SERVER:$REPO_HOME/sailing echo "Making readable for everyone..." ssh $USER@$SERVER "chmod -R a+r $REPO_HOME/sailing/*" diff --git a/java/com.sap.sse.common/src/com/sap/sse/common/impl/MillisecondsDurationImpl.java b/java/com.sap.sse.common/src/com/sap/sse/common/impl/MillisecondsDurationImpl.java index 5797596aa80..9f45d03b61e 100755 --- a/java/com.sap.sse.common/src/com/sap/sse/common/impl/MillisecondsDurationImpl.java +++ b/java/com.sap.sse.common/src/com/sap/sse/common/impl/MillisecondsDurationImpl.java @@ -51,7 +51,7 @@ public class MillisecondsDurationImpl implements Duration { @Override public String toString() { StringBuffer result = new StringBuffer(); - result.append(asSeconds()).append("seconds ").append(asMillis()).append("millis"); + result.append(asSeconds()).append("s==").append(asMillis()).append("ms"); return result.toString(); } diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/listedit/ExpandedListEditorUi.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/listedit/ExpandedListEditorUi.java index 87188846ed4..179728ff039 100644 --- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/listedit/ExpandedListEditorUi.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/listedit/ExpandedListEditorUi.java @@ -73,6 +73,9 @@ public abstract class ExpandedListEditorUi extends ListEditorUi=0; i--) { + expandedValuesGrid.removeRow(i); + } for (ValueType value : context.getValue()) { addRow(value); } diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/listedit/StringConstantsListEditorComposite.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/listedit/StringConstantsListEditorComposite.java new file mode 100644 index 00000000000..2f4b1dd7bfe --- /dev/null +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/listedit/StringConstantsListEditorComposite.java @@ -0,0 +1,165 @@ +package com.sap.sse.gwt.client.controls.listedit; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import com.google.gwt.event.dom.client.ChangeEvent; +import com.google.gwt.event.dom.client.ChangeHandler; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.logical.shared.ValueChangeEvent; +import com.google.gwt.event.logical.shared.ValueChangeHandler; +import com.google.gwt.resources.client.ImageResource; +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.ListBox; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sse.common.Util; +import com.sap.sse.gwt.client.StringMessages; + +public class StringConstantsListEditorComposite extends ListEditorComposite { + public StringConstantsListEditorComposite(Iterable initialValues, StringMessages stringMessages, + String popupDialogTitle, ImageResource removeImage, Iterable availableConstantValuesToAdd) { + this(initialValues, stringMessages, popupDialogTitle, removeImage, availableConstantValuesToAdd, /* placeholderTextForAddTextbox */ null); + } + + public StringConstantsListEditorComposite(Iterable initialValues, StringMessages stringMessages, + String popupDialogTitle, ImageResource removeImage, Iterable availableConstantValuesToAdd, String placeholderTextForAddTextbox) { + super(initialValues, new CollapsedUi(stringMessages, popupDialogTitle, + new ExpandedUi(stringMessages, removeImage, availableConstantValuesToAdd, placeholderTextForAddTextbox))); + } + + public StringConstantsListEditorComposite(Iterable initialValues, StringMessages stringMessages, + ImageResource removeImage, Iterable availableConstantValuesToAdd) { + super(initialValues, new ExpandedUi(stringMessages, removeImage, availableConstantValuesToAdd)); + } + + public StringConstantsListEditorComposite(Iterable initialValues, StringMessages stringMessages, + ImageResource removeImage, Iterable availableConstantValuesToAdd, String placeholderTextForAddTextbox) { + super(initialValues, new ExpandedUi(stringMessages, removeImage, availableConstantValuesToAdd, placeholderTextForAddTextbox)); + } + + public StringConstantsListEditorComposite(Iterable initialValues, ListEditorUiStrategy activeUi) { + super(initialValues, activeUi); + } + + public static class CollapsedUi extends CollapsedListEditorUi { + + public CollapsedUi(StringMessages stringMessages, String dialogTitle, ExpandedListEditorUi expandedUi) { + super(stringMessages, dialogTitle, expandedUi); + } + + @Override + protected String getCollapsedValueText(List value) { + StringBuilder valuesText = new StringBuilder(); + for (int i = 0; i < value.size(); i++) { + if (i > 0) { + valuesText.append(','); + } + valuesText.append(value.get(i)); + } + String condensedValue = valuesText.toString(); + return condensedValue; + } + + @Override + protected ListEditorComposite createExpandedUi(Iterable initialValues, ExpandedListEditorUi ui) { + return new StringConstantsListEditorComposite(initialValues, ui); + } + } + + public static class ExpandedUi extends ExpandedListEditorUi { + + protected final String placeholderTextForAddListbox; + protected final List availableConstantValuesToAdd; + private ListBox selectionBox; + + public ExpandedUi(StringMessages stringMessages, ImageResource removeImage, Iterable availableConstantValuesToAdd) { + this(stringMessages, removeImage, availableConstantValuesToAdd, /* placeholderTextForAddTextbox */ null); + } + + public ExpandedUi(StringMessages stringMessages, ImageResource removeImage, Iterable constantValuesToAdd, String placeholderTextForAddListbox) { + super(stringMessages, removeImage, /*canRemoveItems*/true); + this.availableConstantValuesToAdd = new ArrayList(); + Util.addAll(constantValuesToAdd, availableConstantValuesToAdd); + Collections.sort(availableConstantValuesToAdd); + + this.placeholderTextForAddListbox = placeholderTextForAddListbox; + this.selectionBox = null; + } + + @Override + public void setContext(final ListEditorComposite context) { + super.setContext(context); + context.addValueChangeHandler(new ValueChangeHandler>() { + @Override + public void onValueChange(ValueChangeEvent> event) { + if(selectionBox != null) { + // add a removed value item back to the list of available items + List diffList = new ArrayList<>(); + Util.addAll(availableConstantValuesToAdd, diffList); + diffList.removeAll(context.getValue()); + Collections.sort(diffList); + updateSelectionListBox(selectionBox, diffList); + } + } + }); + } + + private void updateSelectionListBox(ListBox listBox, Iterable values) { + listBox.clear(); + if(placeholderTextForAddListbox != null) { + listBox.addItem(placeholderTextForAddListbox); + } else { + listBox.addItem("Please select"); + } + for (String value : values) { + listBox.addItem(value); + } + } + + protected ListBox createListBox() { + ListBox result = new ListBox(false); + updateSelectionListBox(result, availableConstantValuesToAdd); + return result; + } + + @Override + protected Widget createAddWidget() { + selectionBox = createListBox(); + selectionBox.ensureDebugId("SelectionListBox"); + final Button addButton = new Button(getStringMessages().add()); + addButton.ensureDebugId("AddButton"); + addButton.setEnabled(false); + addButton.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + int selIndex = selectionBox.getSelectedIndex(); + String seletedItemText = selectionBox.getItemText(selIndex); + addValue(seletedItemText); + selectionBox.setSelectedIndex(0); + addButton.setEnabled(false); + } + }); + + selectionBox.addChangeHandler(new ChangeHandler() { + @Override + public void onChange(ChangeEvent event) { + int selIndex = selectionBox.getSelectedIndex(); + addButton.setEnabled(selIndex > 0); + } + }); + HorizontalPanel panel = new HorizontalPanel(); + panel.add(selectionBox); + panel.add(addButton); + return panel; + } + + @Override + protected Widget createValueWidget(int rowIndex, String newValue) { + return new Label(newValue); + } + } +} diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/dialog/DataEntryDialog.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/dialog/DataEntryDialog.java index 62ad29afe6b..da3ef0ad045 100755 --- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/dialog/DataEntryDialog.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/dialog/DataEntryDialog.java @@ -473,6 +473,10 @@ public abstract class DataEntryDialog { dateEntryDialog.center(); } + protected DialogBox getDialogBox() { + return dateEntryDialog; + } + public void ensureDebugId(String debugId) { dateEntryDialog.ensureDebugId(debugId); } diff --git a/java/com.sap.sse.operationaltransformation/.settings/org.eclipse.jdt.core.prefs b/java/com.sap.sse.operationaltransformation/.settings/org.eclipse.jdt.core.prefs new file mode 100755 index 00000000000..ace45ceefb4 --- /dev/null +++ b/java/com.sap.sse.operationaltransformation/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,12 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/java/com.sap.sse.operationaltransformation/src/com/sap/sse/operationaltransformation/Operation.java b/java/com.sap.sse.operationaltransformation/src/com/sap/sse/operationaltransformation/Operation.java index 302903b8adc..932f405a253 100755 --- a/java/com.sap.sse.operationaltransformation/src/com/sap/sse/operationaltransformation/Operation.java +++ b/java/com.sap.sse.operationaltransformation/src/com/sap/sse/operationaltransformation/Operation.java @@ -20,6 +20,11 @@ public interface Operation extends Cloneable { /** * Tells if this operation needs to be executed in order with other operations requesting synchronous execution. + * This default implementation returns true which is safe but may be slower and using less concurrency + * than possible. Implementations may make the assertion that parallel execution will do no harm by overriding this + * method, returning true. */ - boolean requiresSynchronousExecution(); + default boolean requiresSynchronousExecution() { + return true; + } } diff --git a/java/com.sap.sse.replication.testsupport/.classpath b/java/com.sap.sse.replication.testsupport/.classpath new file mode 100755 index 00000000000..b862a296d38 --- /dev/null +++ b/java/com.sap.sse.replication.testsupport/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/java/com.sap.sse.replication.testsupport/.project b/java/com.sap.sse.replication.testsupport/.project new file mode 100755 index 00000000000..368f4879d0b --- /dev/null +++ b/java/com.sap.sse.replication.testsupport/.project @@ -0,0 +1,28 @@ + + + com.sap.sse.replication.testsupport + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/java/com.sap.sse.replication.testsupport/.settings/org.eclipse.jdt.core.prefs b/java/com.sap.sse.replication.testsupport/.settings/org.eclipse.jdt.core.prefs new file mode 100755 index 00000000000..295926d9641 --- /dev/null +++ b/java/com.sap.sse.replication.testsupport/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/java/com.sap.sse.replication.testsupport/.settings/org.eclipse.pde.core.prefs b/java/com.sap.sse.replication.testsupport/.settings/org.eclipse.pde.core.prefs new file mode 100755 index 00000000000..b7e72d019c2 --- /dev/null +++ b/java/com.sap.sse.replication.testsupport/.settings/org.eclipse.pde.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +pluginProject.extensions=false +resolve.requirebundle=false diff --git a/java/com.sap.sse.replication.testsupport/META-INF/MANIFEST.MF b/java/com.sap.sse.replication.testsupport/META-INF/MANIFEST.MF new file mode 100755 index 00000000000..425122dc04d --- /dev/null +++ b/java/com.sap.sse.replication.testsupport/META-INF/MANIFEST.MF @@ -0,0 +1,12 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Testsupport +Bundle-SymbolicName: com.sap.sse.replication.testsupport +Bundle-Version: 1.0.0.qualifier +Bundle-Vendor: SAP +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Require-Bundle: org.junit4;bundle-version="4.8.2", + com.sap.sse.replication, + com.sap.sse.common, + com.rabbitmq.client;bundle-version="2.8.4" +Export-Package: com.sap.sse.replication.testsupport diff --git a/java/com.sap.sse.replication.testsupport/build.properties b/java/com.sap.sse.replication.testsupport/build.properties new file mode 100755 index 00000000000..41eb6ade2b4 --- /dev/null +++ b/java/com.sap.sse.replication.testsupport/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/java/com.sap.sse.replication.testsupport/pom.xml b/java/com.sap.sse.replication.testsupport/pom.xml new file mode 100755 index 00000000000..294ba4cc1a2 --- /dev/null +++ b/java/com.sap.sse.replication.testsupport/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + root + com.sap.sailing + 1.0.0-SNAPSHOT + + com.sap.sse.replication.testsupport + eclipse-plugin + diff --git a/java/com.sap.sse.replication.testsupport/src/com/sap/sse/replication/testsupport/AbstractServerReplicationTest.java b/java/com.sap.sse.replication.testsupport/src/com/sap/sse/replication/testsupport/AbstractServerReplicationTest.java new file mode 100755 index 00000000000..56a0cd96d86 --- /dev/null +++ b/java/com.sap.sse.replication.testsupport/src/com/sap/sse/replication/testsupport/AbstractServerReplicationTest.java @@ -0,0 +1,297 @@ +package com.sap.sse.replication.testsupport; + +import static org.junit.Assert.assertFalse; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.OutputStreamWriter; +import java.io.PipedInputStream; +import java.io.PipedOutputStream; +import java.io.PrintWriter; +import java.net.ConnectException; +import java.net.InetAddress; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.URL; +import java.net.URLConnection; +import java.util.UUID; +import java.util.zip.GZIPOutputStream; + +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.rules.Timeout; + +import com.rabbitmq.client.Channel; +import com.rabbitmq.client.QueueingConsumer; +import com.sap.sse.common.Util.Pair; +import com.sap.sse.replication.Replicable; +import com.sap.sse.replication.ReplicationMasterDescriptor; +import com.sap.sse.replication.ReplicationService; +import com.sap.sse.replication.impl.Activator; +import com.sap.sse.replication.impl.RabbitOutputStream; +import com.sap.sse.replication.impl.ReplicaDescriptor; +import com.sap.sse.replication.impl.ReplicationInstancesManager; +import com.sap.sse.replication.impl.ReplicationMasterDescriptorImpl; +import com.sap.sse.replication.impl.ReplicationServiceImpl; +import com.sap.sse.replication.impl.ReplicationReceiver; +import com.sap.sse.replication.impl.SingletonReplicablesProvider; + +public abstract class AbstractServerReplicationTest, ReplicableImpl extends ReplicableInterface> { + protected static final int SERVLET_PORT = 9990; + protected ReplicableImpl replica; + protected ReplicableImpl master; + protected ReplicationServiceTestImpl replicaReplicator; + private ReplicaDescriptor replicaDescriptor; + private ReplicationServiceImpl masterReplicator; + protected ReplicationMasterDescriptor masterDescriptor; + + @Rule public Timeout AbstractTracTracLiveTestTimeout = new Timeout(5 * 60 * 1000); // timeout after 5 minutes + private Thread initialLoadTestServerThread; + + /** + * Sets up master and replica, starts the JMS message broker and registers the replica with the master. If you want + * to drop the DB in your particular test case first, override {@link #persistenceSetUp(boolean)}. If you don't want + * replication to start right away for your test, override this method, execute only {@link #basicSetUp(boolean, Replicable, Replicable)}, + * do what you need to do and then explicitly call {@link ReplicationServiceTestImpl#startToReplicateFrom(ReplicationMasterDescriptor)} + * or {@link ReplicationServiceTestImpl#startToReplicateFromButDontYetFetchInitialLoad(ReplicationMasterDescriptor, boolean)} + * on the first component returned by {@link #basicSetUp(boolean, Replicable, Replicable)}. + */ + @Before + public void setUp() throws Exception { + try { + Pair, ReplicationMasterDescriptor> result = basicSetUp( + /* dropDB */true, /* master=null means create a new one */null, + /* replica=null means create a new one */null); + result.getA().startToReplicateFrom(result.getB()); + } catch (Exception e) { + tearDown(); + throw e; + } + } + + /** + * Gives subclasses a hook to set up a persistence component, such as a DB. This implementation does nothing. + * + * @param dropDB if true the contents of the persistence layers are to be cleared + */ + protected void persistenceSetUp(boolean dropDB) { + } + + /** + * Calls {@link #persistenceSetUp(boolean)} first. + * @param master + * if not null, the value will be used for {@link #master}; otherwise, a new racing event + * service will be created as master + * @param replica + * if not null, the value will be used for {@link #replica}; otherwise, a new racing event + * service will be created as replica + */ + protected Pair, ReplicationMasterDescriptor> basicSetUp(boolean dropDB, + ReplicableImpl master, ReplicableImpl replica) throws Exception { + persistenceSetUp(dropDB); + String exchangeName = "test-sapsailinganalytics-exchange"; + String exchangeHost = "localhost"; + if (System.getenv(Activator.ENV_VAR_NAME_REPLICATION_HOST) != null) { + exchangeHost = System.getenv(Activator.ENV_VAR_NAME_REPLICATION_HOST); + } + final UUID serverUuid = UUID.randomUUID(); + if (master != null) { + this.master = master; + } else { + this.master = createNewMaster(); + } + if (replica != null) { + this.replica = replica; + } else { + this.replica = createNewReplica(); + } + ReplicationInstancesManager rim = new ReplicationInstancesManager(); + masterReplicator = new ReplicationServiceImpl(exchangeName, exchangeHost, 0, rim, new SingletonReplicablesProvider(this.master)); + replicaDescriptor = new ReplicaDescriptor(InetAddress.getLocalHost(), serverUuid, ""); + masterReplicator.registerReplica(replicaDescriptor); + // connect to exchange host and local server running as master + // master server and exchange host can be two different hosts + masterDescriptor = new ReplicationMasterDescriptorImpl(exchangeHost, exchangeName, 0, UUID.randomUUID().toString(), "localhost", SERVLET_PORT); + ReplicationServiceTestImpl replicaReplicator = new ReplicationServiceTestImpl(exchangeName, exchangeHost, rim, replicaDescriptor, + this.replica, this.master, masterReplicator, masterDescriptor); + Pair, ReplicationMasterDescriptor> result = new Pair<>(replicaReplicator, masterDescriptor); + initialLoadTestServerThread = replicaReplicator.startInitialLoadTransmissionServlet(); + this.replicaReplicator = replicaReplicator; + return result; + } + + /** + * Creates a new master replicable. This method is called only after {@link #persistenceSetUp(boolean)} has been called. Therefore, + * any initialization that {@link #persistenceSetUp(boolean)} may have performed can be assumed to have taken place in the implementations + * of this method. + */ + abstract protected ReplicableImpl createNewMaster() throws Exception; + + /** + * Creates a new replica replicable instance. This method is called only after {@link #persistenceSetUp(boolean)} has been called. Therefore, + * any initialization that {@link #persistenceSetUp(boolean)} may have performed can be assumed to have taken place in the implementations + * of this method. + */ + abstract protected ReplicableImpl createNewReplica(); + + @After + public void tearDown() throws Exception { + persistenceTearDown(); + if (masterReplicator != null) { + masterReplicator.unregisterReplica(replicaDescriptor); + } + if (masterDescriptor != null) { + masterDescriptor.stopConnection(); + } + try { + if (initialLoadTestServerThread != null) { + URLConnection urlConnection = new URL("http://localhost:"+SERVLET_PORT+"/STOP").openConnection(); // stop the initial load test server thread + urlConnection.getInputStream().close(); + initialLoadTestServerThread.join(10000 /* wait 10s */); + assertFalse("Expected initial load test server thread to die", initialLoadTestServerThread.isAlive()); + } + } catch (ConnectException ex) { + /* do not make tests fail because of a server that has been shut down + * or when an exception occured (see setUp()) - let the + * original exception propagate */ + ex.printStackTrace(); + } + } + + /** + * Gives subclasses a hook to tear down a persistence component, such as a DB. This implementation does nothing. + */ + protected void persistenceTearDown() { + } + + public void stopReplicatingToMaster() throws IOException { + replicaReplicator.stopToReplicateFromMaster(); + } + + public static class ReplicationServiceTestImpl> extends ReplicationServiceImpl { + protected static final int INITIAL_LOAD_PACKAGE_SIZE = 1024*1024; + private final ReplicableInterface master; + private final ReplicaDescriptor replicaDescriptor; + private final ReplicationService masterReplicationService; + private final ReplicationMasterDescriptor masterDescriptor; + + public ReplicationServiceTestImpl(String exchangeName, String exchangeHost, ReplicationInstancesManager replicationInstancesManager, + ReplicaDescriptor replicaDescriptor, ReplicableInterface replica, + ReplicableInterface master, ReplicationService masterReplicationService, ReplicationMasterDescriptor masterDescriptor) + throws IOException { + super(exchangeName, exchangeHost, 0, replicationInstancesManager, new SingletonReplicablesProvider(replica)); + this.replicaDescriptor = replicaDescriptor; + this.master = master; + this.masterReplicationService = masterReplicationService; + this.masterDescriptor = masterDescriptor; + } + + private Thread startInitialLoadTransmissionServlet() throws InterruptedException { + final boolean[] listening = new boolean[] { false }; + Thread initialLoadTestServerThread = new Thread("Replication initial load test server") { + public void run() { + ServerSocket ss; + try { + ss = new ServerSocket(SERVLET_PORT); + synchronized (listening) { + listening[0] = true; + listening.notifyAll(); + } + boolean stop = false; + while (!stop) { + Socket s = ss.accept(); + String request = new BufferedReader(new InputStreamReader(s.getInputStream())).readLine(); + PrintWriter pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream())); + pw.println("HTTP/1.1 200 OK"); + pw.println("Content-Type: text/plain"); + pw.println(); + pw.flush(); + if (request.contains("DEREGISTER")) { + // assuming that it is safe to unregister all replicas for tests + for (ReplicaDescriptor descriptor : getReplicaInfo()) { + unregisterReplica(descriptor); + } + } else if (request.contains("REGISTER")) { + final String uuid = UUID.randomUUID().toString(); + registerReplicaUuidForMaster(uuid, masterDescriptor); + pw.print(uuid.getBytes()); + } else if (request.contains("INITIAL_LOAD")) { + Channel channel = masterReplicationService.createMasterChannel(); + RabbitOutputStream ros = new RabbitOutputStream(INITIAL_LOAD_PACKAGE_SIZE, channel, + /* queueName */ "initial-load-for-TestClient-"+UUID.randomUUID(), /* syncAfterTimeout */ false); + pw.println(ros.getQueueName()); + final GZIPOutputStream gzipOutputStream = new GZIPOutputStream(ros); + master.serializeForInitialReplication(gzipOutputStream); + gzipOutputStream.finish(); + ros.close(); + } else if (request.contains("STOP")) { + stop = true; + } + pw.close(); + s.close(); + } + ss.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + }; + initialLoadTestServerThread.start(); + synchronized (listening) { + while (!listening[0]) { + listening.wait(); + } + } + return initialLoadTestServerThread; + } + + public ReplicationReceiver startToReplicateFromButDontYetFetchInitialLoad(ReplicationMasterDescriptor master, boolean startReplicatorSuspended) + throws IOException { + masterReplicationService.registerReplica(replicaDescriptor); + registerReplicaUuidForMaster(replicaDescriptor.getUuid().toString(), master); + QueueingConsumer consumer = master.getConsumer(); + final ReplicationReceiver replicator = new ReplicationReceiver(master, getReplicablesProvider(), startReplicatorSuspended, consumer); + new Thread(replicator).start(); + return replicator; + } + + /** + * Clones the {@link #master}'s state to the {@link #replica} using + * {@link RacingEventServiceImpl#serializeForInitialReplication(ObjectOutputStream)} and + * {@link RacingEventServiceImpl#initiallyFillFrom(ObjectInputStream)} through a piped input/output stream. + * @throws InterruptedException + */ + public void initialLoad() throws IOException, ClassNotFoundException, InterruptedException { + PipedOutputStream pos = new PipedOutputStream(); + PipedInputStream pis = new PipedInputStream(pos); + new Thread("clone writer") { + public void run() { + try { + master.serializeForInitialReplication(pos); + pos.close(); + } catch (IOException e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + }.start(); + for (Replicable replicable : getReplicablesProvider().getReplicables()) { + replicable.clearReplicaState(); + replicable.initiallyFillFrom(pis); + } + pis.close(); + } + + public void waitUntilQueueIsEmpty() throws InterruptedException, IllegalAccessException { + synchronized (getReplicator()) { + while (!getReplicator().isQueueEmpty()) { + getReplicator().wait(); + } + } + } + } +} diff --git a/java/com.sap.sse.replication/src/com/sap/sse/replication/OperationWithResult.java b/java/com.sap.sse.replication/src/com/sap/sse/replication/OperationWithResult.java index 26b3e609212..fa0e6354af8 100755 --- a/java/com.sap.sse.replication/src/com/sap/sse/replication/OperationWithResult.java +++ b/java/com.sap.sse.replication/src/com/sap/sse/replication/OperationWithResult.java @@ -1,5 +1,7 @@ package com.sap.sse.replication; +import java.io.Serializable; + import com.sap.sse.operationaltransformation.Operation; /** @@ -8,13 +10,53 @@ import com.sap.sse.operationaltransformation.Operation; * {@link #internalApplyTo} method while in the context of operational transformation the operation will still return * the target state. * + * @param + * type of state to which the operation can be applied + * @param + * result type, or in other words, the return type of the {@link #internalApplyTo(Object)} operation + * * @author Axel Uhl (D043530) * */ -public interface OperationWithResult extends Operation { +@FunctionalInterface +public interface OperationWithResult extends Operation, Serializable { /** * Performs the actual operation, applying it to the toState service. The operation's result is - * returned. + * returned.

+ * + * NOTE: If invoking this method triggers replication of the operation's effects, this object must + * return false from the {@link #isRequiresExplicitTransitiveReplication()} method to avoid + * replication duplication in transitive replication scenarios. */ R internalApplyTo(S toState) throws Exception; + + /** + * Tells whether this operation requires explicit transitive replication to other replicas when received by a + * replica. This is the case for all operations whose {@link #internalApplyTo(Object)} method will not trigger + * replication. An example for an operation that does not require explicit transitive replication is the + * insertion of a GPS fix into a competitor's track because the insertion of the track, as implemented by + * {@link #internalApplyTo} will trigger the replication. + *

+ * + * This default implementation returns true. Implementing classes whose + * {@link #internalApplyTo(Object)} operation implicitly triggers replication must override this to return + * false. + */ + default boolean isRequiresExplicitTransitiveReplication() { + return true; + } + + /** + * Ignores the actual result of {@link #internalApplyTo(Object)} and returns toState which + * for the operational transformation algorithm is the "next state reached." + */ + @Override + default S applyTo(S toState) { + try { + internalApplyTo(toState); + return toState; + } catch (Exception e) { + throw new RuntimeException(e); + } + } } diff --git a/java/com.sap.sse.replication/src/com/sap/sse/replication/Replicable.java b/java/com.sap.sse.replication/src/com/sap/sse/replication/Replicable.java index 6edf84ab50b..235bed6fc9c 100755 --- a/java/com.sap.sse.replication/src/com/sap/sse/replication/Replicable.java +++ b/java/com.sap.sse.replication/src/com/sap/sse/replication/Replicable.java @@ -6,6 +6,7 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.net.MalformedURLException; +import java.util.logging.Logger; import org.osgi.framework.BundleContext; @@ -13,6 +14,7 @@ import com.sap.sse.common.WithID; import com.sap.sse.operationaltransformation.Operation; import com.sap.sse.operationaltransformation.OperationWithTransformationSupport; import com.sap.sse.replication.impl.ObjectInputStreamResolvingAgainstCache; +import com.sap.sse.replication.impl.OperationWithResultWithIdWrapper; /** * Represents a replicable part of an application. Such a replicable part is usually holder of application state and a @@ -56,7 +58,9 @@ import com.sap.sse.replication.impl.ObjectInputStreamResolvingAgainstCache; * @author Axel Uhl (D043530) * */ -public interface Replicable> extends WithID { +public interface Replicable> extends Replicator, WithID { + static final Logger logger = Logger.getLogger(Replicable.class.getName()); + /** * The name of the property to use in the properties dictionary in a call to * {@link BundleContext#registerService(Class, Object, java.util.Dictionary)} when registering a {@link Replicable}. @@ -66,12 +70,39 @@ public interface Replicable> extends With final String OSGi_Service_Registry_ID_Property_Name = "ID"; /** - * Executes an operation whose effects need to be replicated to any replica of this service known and - * {@link OperationExecutionListener#executed(OperationWithTransformationSupport) notifies} all registered - * operation execution listeners about the execution of the operation. + * If this object is not a replica, executes the operation. By + * {@link OperationExecutionListener#executed(OperationWithTransformationSupport) notifying} all registered + * operation execution listeners about the execution of the operation, the operation will in particular + * be replicated to all replicas registered. + *

+ * + * If this object is a replica, the operation will not be executed locally and will instead be forwarded to the + * master server for execution from where it is expected to replicate to all replicas including this object where + * the {@link #applyReplicated(OperationWithResult)} method will then carry out the operation. + *

+ * + * To determine whether this {@link Replicable} is a replica, this method uses the + * {@link ReplicationService#getReplicatingFromMaster()} method which also provides the master server's connectivity + * information required to forward the operation. */ T apply(OperationWithResult operation); + /** + * Executes an operation received from another (usually "master") server where this object lives on a replica. The + * operation's effects also need to be replicated to any replica of this service known and + * {@link OperationExecutionListener#executed(OperationWithTransformationSupport) notifies} all registered operation + * execution listeners about the execution of the operation.

+ * + * One important difference to {@link #apply(OperationWithResult)} is that the operation will be applied immediately + * in any case whereas {@link #apply(OperationWithResult)} will check first if this is a replica and in that case + * forward the operation to the master for first execution instead of initiating the execution on the replica. + */ + T applyReplicated(OperationWithResult operation); + + void startedReplicatingFrom(ReplicationMasterDescriptor master); + + void stoppedReplicatingFrom(ReplicationMasterDescriptor master); + /** * An operation execution listener must be able to process notifications of operations being executed that have * type S or any more specific type. The listener can achieve this also by accepting any type more general than @@ -83,8 +114,11 @@ public interface Replicable> extends With /** * Before {@link #initiallyFillFrom(ObjectInputStream) initially loading a replica's state from a master instance}, - * the replica's old state needs to be "detached". This method clears all top-level data structures and stops all - * tracking currently going on.

+ * the replica's old state needs to be "detached". This method clears all top-level in-memory data structures and stops all + * tracking currently going on. It may choose to leave any persistent content unchanged as the persistence layer is in + * an undefined state on a replica anyhow. This seems like the safer bet, particularly in case of an accidental + * mis-configuration of the replica's DB connection parameters which may lead to an inadvertent overwriting of the + * master's DB contents.

* * The reason this operation needs to be callable separate from {@link #initiallyFillFrom(ObjectInputStream)} is that * it needs to happen before subscribing to the operation feed received from the master instance through the message bus @@ -130,4 +164,25 @@ public interface Replicable> extends With * invoke this method for other operations and/or on other replicables without producing corrupt data. */ void writeOperation(OperationWithResult operation, OutputStream outputStream, boolean closeStream) throws IOException; + + /** + * Checks if {@link #hasSentOperationToMaster(OperationWithResultWithIdWrapper) the operation was previously + * sent to the master}. If so, the operation is ignored because it has been applied before to this replica. + * Otherwise, it is locally applied and replicated, using a call to {@link #applyReplicated(OperationWithResult)}. + */ + default void applyReceivedReplicated(OperationWithResult operation) { + if (!hasSentOperationToMaster(operation)) { + applyReplicated(operation); + } else { + logger.fine("Ignoring operation "+operation+" received back from master after having sent it there for execution and replication earlier"); + } + } + + /** + * If an operation equal to operationWithResultWithIdWrapper has previously been passed to a call to + * {@link #addOperationSentToMasterForReplication(OperationWithResultWithIdWrapper)}, the call returns true + * exactly once. + */ + boolean hasSentOperationToMaster(OperationWithResult operation); + } diff --git a/java/com.sap.sse.replication/src/com/sap/sse/replication/ReplicationMasterDescriptor.java b/java/com.sap.sse.replication/src/com/sap/sse/replication/ReplicationMasterDescriptor.java index 9d865f089c2..7b038be9ffc 100644 --- a/java/com.sap.sse.replication/src/com/sap/sse/replication/ReplicationMasterDescriptor.java +++ b/java/com.sap.sse.replication/src/com/sap/sse/replication/ReplicationMasterDescriptor.java @@ -9,6 +9,7 @@ import java.util.UUID; import com.rabbitmq.client.Channel; import com.rabbitmq.client.QueueingConsumer; import com.sap.sse.replication.impl.RabbitInputStreamProvider; +import com.sap.sse.replication.impl.ReplicationServlet; /** * Identifies a master server instance from which a replica can obtain an initial load and continuous updates. @@ -24,13 +25,21 @@ public interface ReplicationMasterDescriptor { /** * The content produced by the URL returned is the name of the queue from which the client can read the initial load - * using a {@link RabbitInputStreamProvider}. + * using a {@link RabbitInputStreamProvider}. Handled by the {@link ReplicationServlet}. * * @param replicables * the replicables for which to request the initial load */ URL getInitialLoadURL(Iterable> replicables) throws MalformedURLException; + /** + * The {@link ReplicationServlet} handles sending an operation for execution from a replica that initiated it to + * a master where processing and replication along the complete replica tree shall start. This method returns the + * {@link URL} that must be used in POST mode to send the serialized operation to the servlet where it will be + * de-serialized and applied to the {@link Replicable} identified by the replicableIdAsString. + */ + URL getSendReplicaInitiatedOperationToMasterURL(String replicableIdAsString) throws MalformedURLException; + int getMessagingPort(); int getServletPort(); @@ -54,4 +63,5 @@ public interface ReplicationMasterDescriptor { * @return a RabbitMQ channel created with the replication connectivity parameters defined by this descriptor */ Channel createChannel() throws IOException; + } diff --git a/java/com.sap.sse.replication/src/com/sap/sse/replication/Replicator.java b/java/com.sap.sse.replication/src/com/sap/sse/replication/Replicator.java new file mode 100755 index 00000000000..30173d63c81 --- /dev/null +++ b/java/com.sap.sse.replication/src/com/sap/sse/replication/Replicator.java @@ -0,0 +1,5 @@ +package com.sap.sse.replication; + +public interface Replicator> { + void replicate(O operation); +} diff --git a/java/com.sap.sse.replication/src/com/sap/sse/replication/impl/OperationWithResultWithIdWrapper.java b/java/com.sap.sse.replication/src/com/sap/sse/replication/impl/OperationWithResultWithIdWrapper.java new file mode 100755 index 00000000000..6dca2a77335 --- /dev/null +++ b/java/com.sap.sse.replication/src/com/sap/sse/replication/impl/OperationWithResultWithIdWrapper.java @@ -0,0 +1,95 @@ +package com.sap.sse.replication.impl; + +import java.io.Serializable; +import java.util.UUID; + +import com.sap.sse.common.WithID; +import com.sap.sse.replication.OperationWithResult; + +/** + * Wraps an operation and delegates all methods to it. In addition, provides an {@link #id ID} which is used + * as the basis for implementing {@link #equals(Object)} and {@link #hashCode()}. This way, an operation can + * be uniquely identified after serializing it back and forth. + * + * @author Axel Uhl (D043530) + * + * @param + * @param + */ +public class OperationWithResultWithIdWrapper implements OperationWithResult, WithID { + private static final long serialVersionUID = -5435955633510008283L; + private final Serializable id; + private final OperationWithResult delegate; + + /** + * Creates a new UUID for this wrapper operation + */ + public OperationWithResultWithIdWrapper(OperationWithResult delegate) { + this.delegate = delegate; + this.id = UUID.randomUUID(); + } + + /** + * Allows the caller to define the ID for this wrapper. + */ + protected OperationWithResultWithIdWrapper(OperationWithResult delegate, Serializable id) { + super(); + this.id = id; + this.delegate = delegate; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((id == null) ? 0 : id.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + OperationWithResultWithIdWrapper other = (OperationWithResultWithIdWrapper) obj; + if (id == null) { + if (other.id != null) + return false; + } else if (!id.equals(other.id)) + return false; + return true; + } + + @Override + public boolean isRequiresExplicitTransitiveReplication() { + return delegate.isRequiresExplicitTransitiveReplication(); + } + + @Override + public boolean requiresSynchronousExecution() { + return delegate.requiresSynchronousExecution(); + } + + @Override + public S applyTo(S toState) { + return delegate.applyTo(toState); + } + + @Override + public R internalApplyTo(S toState) throws Exception { + return delegate.internalApplyTo(toState); + } + + @Override + public Serializable getId() { + return id; + } + + @Override + public String toString() { + return ""+delegate+" with ID "+getId(); + } +} diff --git a/java/com.sap.sse.replication/src/com/sap/sse/replication/impl/ReplicableWithObjectInputStream.java b/java/com.sap.sse.replication/src/com/sap/sse/replication/impl/ReplicableWithObjectInputStream.java index 0e9745f7c6f..e995c58077e 100755 --- a/java/com.sap.sse.replication/src/com/sap/sse/replication/impl/ReplicableWithObjectInputStream.java +++ b/java/com.sap.sse.replication/src/com/sap/sse/replication/impl/ReplicableWithObjectInputStream.java @@ -1,15 +1,41 @@ package com.sap.sse.replication.impl; +import java.io.BufferedReader; +import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; +import java.io.Serializable; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.logging.Level; +import java.util.logging.Logger; +import com.sap.sse.common.WithID; +import com.sap.sse.operationaltransformation.Operation; +import com.sap.sse.replication.OperationExecutionListener; import com.sap.sse.replication.OperationWithResult; import com.sap.sse.replication.Replicable; +import com.sap.sse.replication.ReplicationMasterDescriptor; public interface ReplicableWithObjectInputStream> extends Replicable { + static final Logger logger = Logger.getLogger(ReplicableWithObjectInputStream.class.getName()); + + /** + * When an operation is applied that is an {@link OperationWithResultWithIdWrapper} then its ID is stored + * in this thread local and removed when the local execution of that operation has finished. When during the + * execution of the operation another operation is fired to the replicas registered, it will be wrapped + * by an {@link OperationWithResultWithIdWrapper} that has this ID. This will let the replica that originally + * passed this operation to this master recognize that it is receiving the operation it triggered itself, so + * it can safely be ignored on that replica. This procedure is important for operations that have + * {@link OperationWithResult#isRequiresExplicitTransitiveReplication()} return false because they + * implicitly replicate their effects while being executed. + */ + static final ThreadLocal idOfOperationBeingExecuted = new ThreadLocal(); + /** * Produces an object input stream that can choose to resolve objects against a cache so that duplicate instances * are avoided. @@ -39,7 +65,15 @@ public interface ReplicableWithObjectInputStream void replicate(O operation) { + @SuppressWarnings("unchecked") + final OperationWithResult castOperation = (OperationWithResult) operation; + if (getMasterDescriptor() != null) { + try { + sendReplicaInitiatedOperationToMaster(castOperation); + } catch (IOException e) { + logger.log(Level.SEVERE, "Exception trying to send operation "+operation+" to master for replication", e); + } + } + replicateReplicated(operation); // this anticipates receiving the operation back from master; then, the operation will be ignored; + // see also addOperationSentToMasterForReplication + } + + /** + * Replicates operation to any replica registered. This is different from {@link #replicate(OperationWithResult)} + * which would also send the operation to a master if this is a replica. If on the current call stack there is an operation + * being {@link #apply(OperationWithResult) applied} that was received from a replica (indicated by the operation + * being a {@link WithID} instance) and the operation to be sent to the replicas does not {@link WithID carry an ID}, + * a new {@link OperationWithResultWithIdWrapper ID decorator} is wrapped around the operation with the ID + * of the call stack's operation currently being {@link #apply(OperationWithResult) applied}. This will tell the replicas + * that operation is just replicating the effects of another operation, and the replica where the original + * operation was initiated can therefore safely ignore operation when receiving it. + */ + default void replicateReplicated(O operation) { + @SuppressWarnings("unchecked") + final OperationWithResult owr = (OperationWithResult) operation; + final Serializable idOfCurrentlyExecutingOperation = idOfOperationBeingExecuted.get(); + final OperationWithResult operationToNotify; + if (!(owr instanceof OperationWithResultWithIdWrapper) && idOfCurrentlyExecutingOperation != null) { + operationToNotify = new OperationWithResultWithIdWrapper(owr, idOfCurrentlyExecutingOperation); + } else { + operationToNotify = owr; + } + for (OperationExecutionListener listener : getOperationExecutionListeners()) { + try { + listener.executed(operationToNotify); + } catch (Exception e) { + // don't risk the master's operation only because replication to a listener/replica doesn't work + logger.severe("Error replicating operation " + operationToNotify + " to replication listener " + listener); + logger.log(Level.SEVERE, "replicate", e); + } + } + } + + Iterable> getOperationExecutionListeners(); + + /** + * When a replica has initiated (not received through replication) an operation, this operation needs to be sent to + * the master for execution from where it will replicate across the replication tree. This method uses the + * {@link ReplicationMasterDescriptor#getSendReplicaInitiatedOperationToMasterURL(String) URL for sending an + * operation to the replication servlet on the master} and through the POST request's output stream first sends the + * target replicable's ID as a string using a {@link DataOutputStream}, then + * {@link #writeOperation(OperationWithResult, OutputStream, boolean) serializes the operation}. + */ + default void sendReplicaInitiatedOperationToMaster(OperationWithResult operation) throws IOException { + ReplicationMasterDescriptor masterDescriptor = getMasterDescriptor(); + assert masterDescriptor != null; + final OperationWithResultWithIdWrapper operationWithResultWithIdWrapper = new OperationWithResultWithIdWrapper(operation); + addOperationSentToMasterForReplication(operationWithResultWithIdWrapper); + URL url = masterDescriptor.getSendReplicaInitiatedOperationToMasterURL(this.getId().toString()); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setDoOutput(true); // we want to post the serialized operation + connection.setRequestMethod("POST"); + logger.info("Sending operation "+operation+" to master "+masterDescriptor+"'s replicable with ID "+this+" for initial execution and replication"); + connection.connect(); + OutputStream outputStream = connection.getOutputStream(); + DataOutputStream dos = new DataOutputStream(outputStream); + dos.writeUTF(getId().toString()); + this.writeOperation(operationWithResultWithIdWrapper, outputStream, /* closeStream */ true); + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream())); + bufferedReader.close(); + } + + /** + * Checks whether this replicable is a replica. If yes, the operation is not executed locally but instead sent to + * the master server for execution. Otherwise, {@link #applyReplicated(OperationWithResult)} is invoked which executes + * and replicates the operation immediately. + */ + default T apply(OperationWithResult operation) { + boolean needToRemoveThreadLocal = false; + try { + if (operation instanceof OperationWithResultWithIdWrapper) { + idOfOperationBeingExecuted.set(((OperationWithResultWithIdWrapper) operation).getId()); + needToRemoveThreadLocal = true; + } + ReplicationMasterDescriptor masterDescriptor = getMasterDescriptor(); + final T result = applyReplicated(operation); + if (masterDescriptor != null) { + sendReplicaInitiatedOperationToMaster(operation); + } + return result; + } catch (Exception e) { + logger.log(Level.SEVERE, "apply", e); + throw new RuntimeException(e); + } finally { + if (needToRemoveThreadLocal) { + idOfOperationBeingExecuted.remove(); + } + } + } + + void addOperationSentToMasterForReplication(OperationWithResultWithIdWrapper operationWithResultWithIdWrapper); + + ReplicationMasterDescriptor getMasterDescriptor(); + + /** + * The operation is executed by immediately {@link Operation#internalApplyTo(Object) applying} it to this + * service object. It is then replicated to all replicas if and only if the operation is marked as + * {@link OperationWithResult#isRequiresExplicitTransitiveReplication()}. + * + * @see {@link #replicate(RacingEventServiceOperation)} + */ + default T applyReplicated(OperationWithResult operation) { + OperationWithResult reso = (OperationWithResult) operation; + try { + @SuppressWarnings("unchecked") + S replicable = (S) this; + T result = reso.internalApplyTo(replicable); + @SuppressWarnings("unchecked") // This is necessary because otherwise apply(...) couldn't bind the result type T + O oo = (O) operation; + if (oo.isRequiresExplicitTransitiveReplication()) { + replicateReplicated(oo); + } + return result; + } catch (Exception e) { + logger.log(Level.SEVERE, "apply", e); + throw new RuntimeException(e); + } + } } diff --git a/java/com.sap.sse.replication/src/com/sap/sse/replication/impl/ReplicationMasterDescriptorImpl.java b/java/com.sap.sse.replication/src/com/sap/sse/replication/impl/ReplicationMasterDescriptorImpl.java index 974d2c03b08..d199fcfc44e 100755 --- a/java/com.sap.sse.replication/src/com/sap/sse/replication/impl/ReplicationMasterDescriptorImpl.java +++ b/java/com.sap.sse.replication/src/com/sap/sse/replication/impl/ReplicationMasterDescriptorImpl.java @@ -80,7 +80,12 @@ public class ReplicationMasterDescriptorImpl implements ReplicationMasterDescrip map(r->r.getId().toString()).collect(Collectors.joining(",")); return new URL("http", getHostname(), servletPort, REPLICATION_SERVLET + "?" + ReplicationServlet.ACTION + "=" + ReplicationServlet.Action.INITIAL_LOAD.name() + - "&"+ReplicationServlet.REPLICA_IDS_AS_STRINGS_COMMA_SEPARATED+"="+replicablesIdsAsStringSeparatedByCommas); + "&"+ReplicationServlet.REPLICABLES_IDS_AS_STRINGS_COMMA_SEPARATED+"="+replicablesIdsAsStringSeparatedByCommas); + } + + @Override + public URL getSendReplicaInitiatedOperationToMasterURL(String replicableIdAsString) throws MalformedURLException { + return new URL("http", getHostname(), servletPort, REPLICATION_SERVLET); } @Override diff --git a/java/com.sap.sse.replication/src/com/sap/sse/replication/impl/Replicator.java b/java/com.sap.sse.replication/src/com/sap/sse/replication/impl/ReplicationReceiver.java similarity index 96% rename from java/com.sap.sse.replication/src/com/sap/sse/replication/impl/Replicator.java rename to java/com.sap.sse.replication/src/com/sap/sse/replication/impl/ReplicationReceiver.java index 9c47c5c2f9f..b6555bf2784 100755 --- a/java/com.sap.sse.replication/src/com/sap/sse/replication/impl/Replicator.java +++ b/java/com.sap.sse.replication/src/com/sap/sse/replication/impl/ReplicationReceiver.java @@ -61,8 +61,8 @@ import com.sap.sse.replication.ReplicationMasterDescriptor; * @author Axel Uhl (d043530) * */ -public class Replicator implements Runnable { - private final static Logger logger = Logger.getLogger(Replicator.class.getName()); +public class ReplicationReceiver implements Runnable { + private final static Logger logger = Logger.getLogger(ReplicationReceiver.class.getName()); private static final long CHECK_INTERVAL_MILLIS = 2000; // how long (milliseconds) to pause before checking connection again private static final int CHECK_COUNT = 150; // how long to check, value is CHECK_INTERVAL second steps @@ -123,7 +123,7 @@ public class Replicator implements Runnable { * @param consumer * the RabbitMQ consumer from which to load messages */ - public Replicator(ReplicationMasterDescriptor master, ReplicablesProvider replicableProvider, boolean startSuspended, QueueingConsumer consumer) { + public ReplicationReceiver(ReplicationMasterDescriptor master, ReplicablesProvider replicableProvider, boolean startSuspended, QueueingConsumer consumer) { this.queueByReplicableIdAsString = new HashMap<>(); this.master = master; this.replicableProvider = replicableProvider; @@ -301,7 +301,7 @@ public class Replicator implements Runnable { Runnable runnable = new Runnable() { @Override public void run() { - replicable.apply(operation); + replicable.applyReceivedReplicated(operation); } }; if (operation.requiresSynchronousExecution()) { diff --git a/java/com.sap.sse.replication/src/com/sap/sse/replication/impl/ReplicationServiceImpl.java b/java/com.sap.sse.replication/src/com/sap/sse/replication/impl/ReplicationServiceImpl.java index 668b0f75dd9..1b3cfb25f16 100755 --- a/java/com.sap.sse.replication/src/com/sap/sse/replication/impl/ReplicationServiceImpl.java +++ b/java/com.sap.sse.replication/src/com/sap/sse/replication/impl/ReplicationServiceImpl.java @@ -48,7 +48,7 @@ import com.sap.sse.replication.ReplicationService; * * The observers are registered only when there are replicas registered. If the last replica is de-registered, the * service stops observing the {@link Replicable}. Operations received that require replication are sent to the - * {@link Exchange} to which replica queues can bind, using a {@link Replicator}. By prefixing each message with the + * {@link Exchange} to which replica queues can bind, using a {@link ReplicationReceiver}. By prefixing each message with the * {@link Object#toString()} representation of the {@link Replicable}'s {@link Replicable#getId() ID} the receiver can * determine to which {@link Replicable} to forward the operation. As such, this service multiplexes the replication * channels for potentially many {@link Replicable}s living in this server instance. @@ -113,7 +113,7 @@ public class ReplicationServiceImpl implements ReplicationService { * For this instance running as a replica, the replicator receives messages from the master's queue and applies them * to the local replica. */ - private Replicator replicator; + private ReplicationReceiver replicator; private final Map> executionListenersByReplicableIdAsString; @@ -258,7 +258,7 @@ public class ReplicationServiceImpl implements ReplicationService { return replicablesProvider; } - protected Replicator getReplicator() { + protected ReplicationReceiver getReplicator() { return replicator; } @@ -496,11 +496,12 @@ public class ReplicationServiceImpl implements ReplicationService { URL initialLoadURL = master.getInitialLoadURL(replicables); logger.info("Initial load URL is "+initialLoadURL); // start receiving messages already now, but start in suspended mode - replicator = new Replicator(master, replicablesProvider, /* startSuspended */true, consumer); + replicator = new ReplicationReceiver(master, replicablesProvider, /* startSuspended */true, consumer); // clear Replicable state here, before starting to receive and de-serialized operations which builds up // new state, e.g., in competitor store for (Replicable r : getReplicables()) { r.clearReplicaState(); + r.startedReplicatingFrom(master); } replicatorThread = new Thread(replicator, "Replicator receiving from " + master.getMessagingHostname() + "/" + master.getExchangeName()); @@ -523,7 +524,7 @@ public class ReplicationServiceImpl implements ReplicationService { logger.info("Deleted queue " + queueName + " used for initial load: " + deleteOk.toString()); } } - + /** * @return the UUID that the master generated for this client which is also entered into {@link #replicaUUIDs} */ @@ -558,6 +559,9 @@ public class ReplicationServiceImpl implements ReplicationService { read = content.read(buf); } content.close(); + for (Replicable r : getReplicables()) { + r.stoppedReplicatingFrom(master); + } } catch (Exception ex) { // ignore exceptions here - they will mostly be caused by an incompatible server // it is also not problematic if the server does not get this deregistration diff --git a/java/com.sap.sse.replication/src/com/sap/sse/replication/impl/ReplicationServlet.java b/java/com.sap.sse.replication/src/com/sap/sse/replication/impl/ReplicationServlet.java index 003a4e57ee3..d2d55e34589 100755 --- a/java/com.sap.sse.replication/src/com/sap/sse/replication/impl/ReplicationServlet.java +++ b/java/com.sap.sse.replication/src/com/sap/sse/replication/impl/ReplicationServlet.java @@ -1,6 +1,8 @@ package com.sap.sse.replication.impl; +import java.io.DataInputStream; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.InetAddress; @@ -21,6 +23,7 @@ import org.osgi.util.tracker.ServiceTracker; import com.rabbitmq.client.Channel; import com.sap.sse.gateway.AbstractHttpServlet; +import com.sap.sse.replication.OperationWithResult; import com.sap.sse.replication.Replicable; import com.sap.sse.replication.ReplicationService; import com.sap.sse.util.impl.CountingOutputStream; @@ -51,7 +54,9 @@ public class ReplicationServlet extends AbstractHttpServlet { */ private static final int INITIAL_LOAD_PACKAGE_SIZE = 1024*1024; - public static final String REPLICA_IDS_AS_STRINGS_COMMA_SEPARATED = "replicaIdsAsStringsCommaSeparated"; + public static final String REPLICABLES_IDS_AS_STRINGS_COMMA_SEPARATED = "replicaIdsAsStringsCommaSeparated"; + + public static final String REPLICABLE_ID_AS_STRING = "replicaIdAsString"; private final ServiceTracker replicationServiceTracker; @@ -87,7 +92,7 @@ public class ReplicationServlet extends AbstractHttpServlet { deregisterClientWithReplicationService(req, resp); break; case INITIAL_LOAD: - String[] replicableIdsAsStrings = req.getParameter(REPLICA_IDS_AS_STRINGS_COMMA_SEPARATED).split(","); + String[] replicableIdsAsStrings = req.getParameter(REPLICABLES_IDS_AS_STRINGS_COMMA_SEPARATED).split(","); Channel channel = getReplicationService().createMasterChannel(); RabbitOutputStream ros = new RabbitOutputStream(INITIAL_LOAD_PACKAGE_SIZE, channel, /* queueName */ "initialLoad-for-"+req.getRemoteHost()+"@"+new Date()+"-"+UUID.randomUUID(), @@ -122,6 +127,41 @@ public class ReplicationServlet extends AbstractHttpServlet { } } + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + logger.info("Received request to apply and replicate an operation from a replica"); + InputStream is = req.getInputStream(); + DataInputStream dis = new DataInputStream(is); + String replicableIdAsString = dis.readUTF(); + try { + Replicable replicable = replicablesProvider.getReplicable(replicableIdAsString, /* wait */ false); + if (replicable != null) { + applyOperationToReplicable(replicable, is); + } else { + logger.warning("Received operation for replicable "+replicableIdAsString+ + ", but a replicable with that ID couldn't be found. Ignoring the operation."); + } + } catch (ClassNotFoundException e) { + logger.log(Level.SEVERE, + "Exception occurred while trying to receive and apply operation initiated on replica", e); + resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Exception " + e + + " occurred while trying to receive and apply operation initiated on replica"); + } + } + + /** + * Applies operation to the replicable identified by replicableIdAsString. If such a + * replicable cannot be found on this server instance, a warning is logged and the operation is ignored. + */ + private void applyOperationToReplicable(Replicable replicable, InputStream is) + throws ClassNotFoundException, IOException { + ClassLoader oldContextClassLoader = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(replicable.getClass().getClassLoader()); + OperationWithResult operation = replicable.readOperation(is); + Thread.currentThread().setContextClassLoader(oldContextClassLoader); + replicable.apply(operation); + } + private void deregisterClientWithReplicationService(HttpServletRequest req, HttpServletResponse resp) throws IOException { ReplicaDescriptor replica = getReplicaDescriptor(req); getReplicationService().unregisterReplica(replica); diff --git a/java/com.sap.sse.security.common/.classpath b/java/com.sap.sse.security.common/.classpath new file mode 100755 index 00000000000..947620eea47 --- /dev/null +++ b/java/com.sap.sse.security.common/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/java/com.sap.sse.security.common/.project b/java/com.sap.sse.security.common/.project new file mode 100755 index 00000000000..275f1bad90b --- /dev/null +++ b/java/com.sap.sse.security.common/.project @@ -0,0 +1,28 @@ + + + com.sap.sse.security.common + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/java/com.sap.sse.security.common/.settings/org.eclipse.jdt.core.prefs b/java/com.sap.sse.security.common/.settings/org.eclipse.jdt.core.prefs new file mode 100755 index 00000000000..980b98c1d5f --- /dev/null +++ b/java/com.sap.sse.security.common/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,12 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/java/com.sap.sse.security.common/.settings/org.eclipse.pde.core.prefs b/java/com.sap.sse.security.common/.settings/org.eclipse.pde.core.prefs new file mode 100755 index 00000000000..b7e72d019c2 --- /dev/null +++ b/java/com.sap.sse.security.common/.settings/org.eclipse.pde.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +pluginProject.extensions=false +resolve.requirebundle=false diff --git a/java/com.sap.sse.security.common/META-INF/MANIFEST.MF b/java/com.sap.sse.security.common/META-INF/MANIFEST.MF new file mode 100755 index 00000000000..8f64b1fafe2 --- /dev/null +++ b/java/com.sap.sse.security.common/META-INF/MANIFEST.MF @@ -0,0 +1,9 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Common +Bundle-SymbolicName: com.sap.sse.security.common +Bundle-Version: 1.0.0.qualifier +Bundle-Vendor: SAP +Bundle-RequiredExecutionEnvironment: JavaSE-1.7 +Export-Package: com.sap.sse.security.shared +Require-Bundle: com.sap.sse.common diff --git a/java/com.sap.sse.security.common/build.properties b/java/com.sap.sse.security.common/build.properties new file mode 100755 index 00000000000..a2e16dfebcd --- /dev/null +++ b/java/com.sap.sse.security.common/build.properties @@ -0,0 +1,5 @@ +source.. = src/,\ + resources/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/java/com.sap.sse.security.common/pom.xml b/java/com.sap.sse.security.common/pom.xml new file mode 100755 index 00000000000..063d3938b30 --- /dev/null +++ b/java/com.sap.sse.security.common/pom.xml @@ -0,0 +1,32 @@ + + + 4.0.0 + + root + com.sap.sailing + 1.0.0-SNAPSHOT + + com.sap.sse.security.common + eclipse-plugin + + + + + org.eclipse.tycho + tycho-source-plugin + ${tycho-version} + + + plugin-source + generate-sources + + plugin-source + + + + + + + + diff --git a/java/com.sap.sse.security/resources/com/sap/sse/Security.gwt.xml b/java/com.sap.sse.security.common/resources/com/sap/sse/Security.gwt.xml similarity index 100% rename from java/com.sap.sse.security/resources/com/sap/sse/Security.gwt.xml rename to java/com.sap.sse.security.common/resources/com/sap/sse/Security.gwt.xml diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/shared/Account.java b/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/Account.java similarity index 86% rename from java/com.sap.sse.security/src/com/sap/sse/security/shared/Account.java rename to java/com.sap.sse.security.common/src/com/sap/sse/security/shared/Account.java index 83329bcdced..86b6352cd5e 100644 --- a/java/com.sap.sse.security/src/com/sap/sse/security/shared/Account.java +++ b/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/Account.java @@ -1,7 +1,8 @@ package com.sap.sse.security.shared; +import java.io.Serializable; -public interface Account { +public interface Account extends Serializable { public AccountType getAccountType(); diff --git a/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/DefaultPermissions.java b/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/DefaultPermissions.java new file mode 100755 index 00000000000..79b1928472e --- /dev/null +++ b/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/DefaultPermissions.java @@ -0,0 +1,15 @@ +package com.sap.sse.security.shared; + +public enum DefaultPermissions { + ALL_EVENTS("event:*"); + + private DefaultPermissions(String permissionname) { + this.permissionname = permissionname; + } + + public String getPermissionname() { + return permissionname; + } + + private final String permissionname; +} diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/shared/DefaultRoles.java b/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/DefaultRoles.java similarity index 100% rename from java/com.sap.sse.security/src/com/sap/sse/security/shared/DefaultRoles.java rename to java/com.sap.sse.security.common/src/com/sap/sse/security/shared/DefaultRoles.java diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/shared/MailException.java b/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/MailException.java similarity index 100% rename from java/com.sap.sse.security/src/com/sap/sse/security/shared/MailException.java rename to java/com.sap.sse.security.common/src/com/sap/sse/security/shared/MailException.java diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/shared/SocialUserAccount.java b/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/SocialUserAccount.java similarity index 93% rename from java/com.sap.sse.security/src/com/sap/sse/security/shared/SocialUserAccount.java rename to java/com.sap.sse.security.common/src/com/sap/sse/security/shared/SocialUserAccount.java index aa4e2f1cd0b..6ea0e36e664 100644 --- a/java/com.sap.sse.security/src/com/sap/sse/security/shared/SocialUserAccount.java +++ b/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/SocialUserAccount.java @@ -3,13 +3,13 @@ package com.sap.sse.security.shared; import java.util.HashMap; import java.util.Map; -import com.sap.sse.security.SecurityService; - /** * The object we send back and forth between client and server. See also * {@link SecurityService#createSocialUser(String, SocialUserAccount)}. */ public class SocialUserAccount implements Account { + private static final long serialVersionUID = -1702877798960390855L; + private String sessionId; private Map properties = new HashMap(); diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/shared/UserManagementException.java b/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/UserManagementException.java similarity index 100% rename from java/com.sap.sse.security/src/com/sap/sse/security/shared/UserManagementException.java rename to java/com.sap.sse.security.common/src/com/sap/sse/security/shared/UserManagementException.java diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/shared/UsernamePasswordAccount.java b/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/UsernamePasswordAccount.java similarity index 69% rename from java/com.sap.sse.security/src/com/sap/sse/security/shared/UsernamePasswordAccount.java rename to java/com.sap.sse.security.common/src/com/sap/sse/security/shared/UsernamePasswordAccount.java index 25ef04a59b9..e8ed3849209 100644 --- a/java/com.sap.sse.security/src/com/sap/sse/security/shared/UsernamePasswordAccount.java +++ b/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/UsernamePasswordAccount.java @@ -1,13 +1,15 @@ package com.sap.sse.security.shared; +import com.sap.sse.common.Named; -public class UsernamePasswordAccount implements Account { +public class UsernamePasswordAccount implements Named, Account { + private static final long serialVersionUID = 5986653173215900637L; private String name; private String saltedPassword; - private Object salt; + private byte[] salt; - public UsernamePasswordAccount(String name, String saltedPassword, Object salt) { + public UsernamePasswordAccount(String name, String saltedPassword, byte[] salt) { this.name = name; this.saltedPassword = saltedPassword; this.salt = salt; @@ -21,22 +23,19 @@ public class UsernamePasswordAccount implements Account { this.saltedPassword = saltedPassword; } - public Object getSalt() { + public byte[] getSalt() { return salt; } - public void setSalt(Object salt) { + public void setSalt(byte[] salt) { this.salt = salt; } + @Override public String getName() { return name; } - public void setName(String name) { - this.name = name; - } - @Override public AccountType getAccountType() { return AccountType.USERNAME_PASSWORD; diff --git a/java/com.sap.sse.security.replication.test/.classpath b/java/com.sap.sse.security.replication.test/.classpath new file mode 100755 index 00000000000..b862a296d38 --- /dev/null +++ b/java/com.sap.sse.security.replication.test/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/java/com.sap.sse.security.replication.test/.project b/java/com.sap.sse.security.replication.test/.project new file mode 100755 index 00000000000..1fe0f51b15d --- /dev/null +++ b/java/com.sap.sse.security.replication.test/.project @@ -0,0 +1,28 @@ + + + com.sap.sse.security.replication.test + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/java/com.sap.sse.security.replication.test/.settings/org.eclipse.jdt.core.prefs b/java/com.sap.sse.security.replication.test/.settings/org.eclipse.jdt.core.prefs new file mode 100755 index 00000000000..295926d9641 --- /dev/null +++ b/java/com.sap.sse.security.replication.test/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/java/com.sap.sse.security.replication.test/.settings/org.eclipse.pde.core.prefs b/java/com.sap.sse.security.replication.test/.settings/org.eclipse.pde.core.prefs new file mode 100755 index 00000000000..b7e72d019c2 --- /dev/null +++ b/java/com.sap.sse.security.replication.test/.settings/org.eclipse.pde.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +pluginProject.extensions=false +resolve.requirebundle=false diff --git a/java/com.sap.sse.security.replication.test/META-INF/MANIFEST.MF b/java/com.sap.sse.security.replication.test/META-INF/MANIFEST.MF new file mode 100755 index 00000000000..15b1ae22c52 --- /dev/null +++ b/java/com.sap.sse.security.replication.test/META-INF/MANIFEST.MF @@ -0,0 +1,15 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Test +Bundle-SymbolicName: com.sap.sse.security.replication.test +Bundle-Version: 1.0.0.qualifier +Bundle-Vendor: SAP +Fragment-Host: com.sap.sse.security +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Require-Bundle: org.junit4;bundle-version="4.8.2", + com.sap.sse.security.userstore.mongodb, + com.sap.sse.mongodb, + com.mongodb.driver, + com.rabbitmq.client, + com.sap.sse.replication.testsupport, + com.sap.sse.replication.testsupport diff --git a/java/com.sap.sse.security.replication.test/build.properties b/java/com.sap.sse.security.replication.test/build.properties new file mode 100755 index 00000000000..41eb6ade2b4 --- /dev/null +++ b/java/com.sap.sse.security.replication.test/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/java/com.sap.sse.security.replication.test/pom.xml b/java/com.sap.sse.security.replication.test/pom.xml new file mode 100755 index 00000000000..537bf71052b --- /dev/null +++ b/java/com.sap.sse.security.replication.test/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + root + com.sap.sailing + 1.0.0-SNAPSHOT + + com.sap.sse.security.replication.test + eclipse-plugin + diff --git a/java/com.sap.sse.security.replication.test/src/com/sap/sse/security/replication/test/AbstractSecurityReplicationTest.java b/java/com.sap.sse.security.replication.test/src/com/sap/sse/security/replication/test/AbstractSecurityReplicationTest.java new file mode 100755 index 00000000000..e1b5b5a94fb --- /dev/null +++ b/java/com.sap.sse.security.replication.test/src/com/sap/sse/security/replication/test/AbstractSecurityReplicationTest.java @@ -0,0 +1,45 @@ +package com.sap.sse.security.replication.test; + +import java.io.IOException; +import java.net.MalformedURLException; +import java.util.Properties; + +import com.sap.sse.mongodb.MongoDBService; +import com.sap.sse.replication.testsupport.AbstractServerReplicationTest; +import com.sap.sse.security.SecurityService; +import com.sap.sse.security.impl.SecurityServiceImpl; +import com.sap.sse.security.userstore.mongodb.MongoObjectFactory; +import com.sap.sse.security.userstore.mongodb.PersistenceFactory; +import com.sap.sse.security.userstore.mongodb.UserStoreImpl; + +public abstract class AbstractSecurityReplicationTest extends AbstractServerReplicationTest { + private MongoDBService mongoDBService; + private MongoObjectFactory mongoObjectFactory; + + @Override + protected void persistenceSetUp(boolean dropDB) { + mongoDBService = MongoDBService.INSTANCE; + if (dropDB) { + mongoDBService.getDB().dropDatabase(); + } + mongoObjectFactory = PersistenceFactory.INSTANCE.getMongoObjectFactory(mongoDBService); + mongoObjectFactory.getDatabase().requestStart(); + } + + @Override + protected SecurityServiceImpl createNewMaster() throws MalformedURLException, IOException, InterruptedException { + SecurityServiceImpl result = new SecurityServiceImpl(new UserStoreImpl(), new Properties()); + result.clearReplicaState(); + return result; + } + + @Override + protected SecurityServiceImpl createNewReplica() { + return new SecurityServiceImpl(new UserStoreImpl(), new Properties()); + } + + @Override + protected void persistenceTearDown() { + mongoObjectFactory.getDatabase().requestDone(); + } +} diff --git a/java/com.sap.sse.security.replication.test/src/com/sap/sse/security/replication/test/SimpleSecurityReplicationTest.java b/java/com.sap.sse.security.replication.test/src/com/sap/sse/security/replication/test/SimpleSecurityReplicationTest.java new file mode 100755 index 00000000000..439018643f9 --- /dev/null +++ b/java/com.sap.sse.security.replication.test/src/com/sap/sse/security/replication/test/SimpleSecurityReplicationTest.java @@ -0,0 +1,107 @@ +package com.sap.sse.security.replication.test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +import com.sap.sse.security.User; +import com.sap.sse.security.shared.MailException; +import com.sap.sse.security.shared.UserManagementException; + +public class SimpleSecurityReplicationTest extends AbstractSecurityReplicationTest { + @Test + public void testSimpleReplicationOfUserCreation() throws InterruptedException, UserManagementException, MailException, IllegalAccessException { + final String username = "Ernie"; + final String email = "ernie@sesame-street.com"; + final String password = "BertMyFriend"; + final String validationBaseURL = "http://me.to.back.com"; + assertNull(master.getUserByName(username)); + User user = master.createSimpleUser(username, email, password, validationBaseURL); + assertNotNull(user); + assertSame(user, master.getUserByName(username)); + assertTrue(master.checkPassword(username, password)); + final String emailValidationSecret = user.getValidationSecret(); + + replicaReplicator.waitUntilQueueIsEmpty(); + Thread.sleep(3000); + + User replicatedErnie = replica.getUserByName(username); + assertNotNull(replicatedErnie); + assertEquals(username, replicatedErnie.getName()); + assertEquals(email, replicatedErnie.getEmail()); + assertTrue(replica.checkPassword(username, password)); + assertEquals(emailValidationSecret, replicatedErnie.getValidationSecret()); + } + + @Test + public void testSimpleReplicationOfUserEmailChange() throws InterruptedException, UserManagementException, MailException, IllegalAccessException { + final String username = "Ernie"; + final String email = "ernie@sesame-street.com"; + final String newEmail = "ernie2@sesame-street.com"; + final String password = "BertMyFriend"; + final String validationBaseURL = "http://me.to.back.com"; + User user = master.createSimpleUser(username, email, password, validationBaseURL); + final String emailValidationSecretAfterCreation = user.getValidationSecret(); + master.updateSimpleUserEmail(username, newEmail, validationBaseURL); + final String emailValidationSecretAfterChangingEmail = user.getValidationSecret(); + assertFalse(emailValidationSecretAfterChangingEmail.equals(emailValidationSecretAfterCreation)); + assertEquals(newEmail, user.getEmail()); + + replicaReplicator.waitUntilQueueIsEmpty(); + Thread.sleep(3000); + + User replicatedErnie = replica.getUserByName(username); + assertNotNull(replicatedErnie); + assertEquals(username, replicatedErnie.getName()); + assertEquals(newEmail, replicatedErnie.getEmail()); + assertEquals(emailValidationSecretAfterChangingEmail, replicatedErnie.getValidationSecret()); + } + + @Test + public void testSimpleReplicationOfUserPasswordChange() throws InterruptedException, UserManagementException, MailException, IllegalAccessException { + final String username = "Ernie"; + final String email = "ernie@sesame-street.com"; + final String password = "BertMyFriend"; + final String newPassword = "ErnieAndBert"; + final String validationBaseURL = "http://me.to.back.com"; + master.createSimpleUser(username, email, password, validationBaseURL); + master.updateSimpleUserPassword(username, newPassword); + assertTrue(master.checkPassword(username, newPassword)); + + replicaReplicator.waitUntilQueueIsEmpty(); + Thread.sleep(3000); + + User replicatedErnie = replica.getUserByName(username); + assertNotNull(replicatedErnie); + assertEquals(username, replicatedErnie.getName()); + assertFalse(replica.checkPassword(username, password)); + assertTrue(replica.checkPassword(username, newPassword)); + } + + @Test + public void testReplicationOfPasswordReset() throws InterruptedException, UserManagementException, MailException, IllegalAccessException { + final String username = "Ernie"; + final String email = "ernie@sesame-street.com"; + final String password = "BertMyFriend"; + final String validationBaseURL = "http://me.to.back.com/validateemail"; + final String passwordResetBaseURL = "http://me.to.back.com/passwordreset"; + User user = master.createSimpleUser(username, email, password, validationBaseURL); + master.validateEmail(username, user.getValidationSecret()); + assertTrue(user.isEmailValidated()); + master.resetPassword(username, passwordResetBaseURL); + String passwordResetSecret = user.getPasswordResetSecret(); + + replicaReplicator.waitUntilQueueIsEmpty(); + Thread.sleep(3000); + + User replicatedErnie = replica.getUserByName(username); + assertNotNull(replicatedErnie); + assertTrue(replicatedErnie.isEmailValidated()); + assertEquals(passwordResetSecret, replicatedErnie.getPasswordResetSecret()); + } +} diff --git a/java/com.sap.sse.security.test/src/com/sap/sse/security/test/LoginTest.java b/java/com.sap.sse.security.test/src/com/sap/sse/security/test/LoginTest.java index 3f8363d91e8..71d9f9da6f1 100644 --- a/java/com.sap.sse.security.test/src/com/sap/sse/security/test/LoginTest.java +++ b/java/com.sap.sse.security.test/src/com/sap/sse/security/test/LoginTest.java @@ -3,6 +3,7 @@ package com.sap.sse.security.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; import java.net.UnknownHostException; import java.util.Properties; @@ -13,11 +14,13 @@ import org.junit.Test; import com.mongodb.DB; import com.mongodb.MongoException; +import com.sap.sse.common.Util; import com.sap.sse.mongodb.MongoDBConfiguration; import com.sap.sse.mongodb.MongoDBService; -import com.sap.sse.security.SecurityServiceImpl; import com.sap.sse.security.UsernamePasswordRealm; import com.sap.sse.security.impl.Activator; +import com.sap.sse.security.impl.SecurityServiceImpl; +import com.sap.sse.security.shared.UserManagementException; import com.sap.sse.security.userstore.mongodb.UserStoreImpl; import com.sap.sse.security.userstore.mongodb.impl.CollectionNames; @@ -29,6 +32,7 @@ public class LoginTest { final MongoDBConfiguration dbConfiguration = MongoDBConfiguration.getDefaultTestConfiguration(); final MongoDBService service = dbConfiguration.getService(); DB db = service.getDB(); + db.getCollection(CollectionNames.USERS.name()).drop(); db.getCollection(CollectionNames.SETTINGS.name()).drop(); db.getCollection(CollectionNames.PREFERENCES.name()).drop(); db.getCollection(CollectionNames.PREFERENCES.name()).drop(); @@ -58,4 +62,21 @@ public class LoginTest { UserStoreImpl store2 = new UserStoreImpl(); assertNull(store2.getPreference("me", "key")); } + + @Test + public void rolesTest() throws UserManagementException { + store.createUser("me", "me@sap.com"); + store.addRoleForUser("me", "testrole"); + UserStoreImpl store2 = new UserStoreImpl(); + assertTrue(Util.contains(store2.getUserByName("me").getRoles(), "testrole")); + } + + @Test + public void permissionsTest() throws UserManagementException { + store.createUser("me", "me@sap.com"); + store.addPermissionForUser("me", "a:b:c"); + UserStoreImpl store2 = new UserStoreImpl(); + assertTrue(store2.getUserByName("me").hasPermission("a:b:c")); + } + } diff --git a/java/com.sap.sse.security.ui/META-INF/MANIFEST.MF b/java/com.sap.sse.security.ui/META-INF/MANIFEST.MF index e157e0ce445..ae9abfb660e 100644 --- a/java/com.sap.sse.security.ui/META-INF/MANIFEST.MF +++ b/java/com.sap.sse.security.ui/META-INF/MANIFEST.MF @@ -19,7 +19,9 @@ Require-Bundle: javax.servlet;bundle-version="2.5.0", com.sap.sse.common, com.sap.sse.gwt, org.apache.shiro.core;bundle-version="1.2.2", - org.apache.shiro.web;bundle-version="1.2.2" + org.apache.shiro.web;bundle-version="1.2.2", + com.sap.sse.replication, + com.sap.sse.security.common Web-ContextPath: /security/ui Export-Package: com.sap.sse.security.ui.client, com.sap.sse.security.ui.client.component, diff --git a/java/com.sap.sse.security.ui/pom.xml b/java/com.sap.sse.security.ui/pom.xml index 4f9011eb74a..09cbf3448e6 100644 --- a/java/com.sap.sse.security.ui/pom.xml +++ b/java/com.sap.sse.security.ui/pom.xml @@ -43,7 +43,13 @@ 1.0.0-SNAPSHOT sources - + + com.sap.sailing + com.sap.sse.security.common + 1.0.0-SNAPSHOT + sources + + @@ -80,7 +86,7 @@ com.sap.sse.security.ui.EmailValidation ${basedir}/.generated - 3 + 7 ${basedir} ${basedir}/src/main/resources diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/AbstractSecureEntryPoint.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/AbstractSecureEntryPoint.java index 0e9af047ad0..e97b829a8c8 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/AbstractSecureEntryPoint.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/AbstractSecureEntryPoint.java @@ -5,8 +5,6 @@ import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.rpc.ServiceDefTarget; import com.sap.sse.gwt.client.EntryPointHelper; import com.sap.sse.gwt.client.StringMessages; -import com.sap.sse.security.ui.shared.UserManagementService; -import com.sap.sse.security.ui.shared.UserManagementServiceAsync; /** * Adds user management service and user service for security management to the general abstract entry point. diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/shared/UserManagementService.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserManagementService.java similarity index 92% rename from java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/shared/UserManagementService.java rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserManagementService.java index 1b7db92f9f0..6ae80791520 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/shared/UserManagementService.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserManagementService.java @@ -1,4 +1,4 @@ -package com.sap.sse.security.ui.shared; +package com.sap.sse.security.ui.client; import java.util.Collection; import java.util.Map; @@ -9,6 +9,8 @@ import com.sap.sse.security.shared.MailException; import com.sap.sse.security.shared.UserManagementException; import com.sap.sse.security.ui.oauth.client.CredentialDTO; import com.sap.sse.security.ui.oauth.shared.OAuthException; +import com.sap.sse.security.ui.shared.SuccessInfo; +import com.sap.sse.security.ui.shared.UserDTO; public interface UserManagementService extends RemoteService { Collection getUserList(); @@ -39,6 +41,8 @@ public interface UserManagementService extends RemoteService { SuccessInfo setRolesForUser(String username, Iterable roles); + SuccessInfo setPermissionsForUser(String username, Iterable permissions); + Map getSettings(); Map getSettingTypes(); diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/shared/UserManagementServiceAsync.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserManagementServiceAsync.java similarity index 90% rename from java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/shared/UserManagementServiceAsync.java rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserManagementServiceAsync.java index a5908c866bf..b2a3724b729 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/shared/UserManagementServiceAsync.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserManagementServiceAsync.java @@ -1,10 +1,12 @@ -package com.sap.sse.security.ui.shared; +package com.sap.sse.security.ui.client; import java.util.Collection; import java.util.Map; import com.google.gwt.user.client.rpc.AsyncCallback; import com.sap.sse.security.ui.oauth.client.CredentialDTO; +import com.sap.sse.security.ui.shared.SuccessInfo; +import com.sap.sse.security.ui.shared.UserDTO; public interface UserManagementServiceAsync { void getUserList(AsyncCallback> callback); @@ -29,6 +31,8 @@ public interface UserManagementServiceAsync { void setRolesForUser(String username, Iterable roles, AsyncCallback callback); + void setPermissionsForUser(String username, Iterable permissions, AsyncCallback callback); + void deleteUser(String username, AsyncCallback callback); void getSettings(AsyncCallback> callback); @@ -37,12 +41,6 @@ public interface UserManagementServiceAsync { void getSettingTypes(AsyncCallback> callback); - //------------------------------------------------ OAuth Interface ---------------------------------------------------------------------- - - void getAuthorizationUrl(CredentialDTO credential, AsyncCallback callback); - - void verifySocialUser(CredentialDTO credential, AsyncCallback callback); - void addSetting(String key, String clazz, String setting, AsyncCallback callback); void setPreference(String username, String key, String value, AsyncCallback callback); @@ -51,4 +49,10 @@ public interface UserManagementServiceAsync { void getPreference(String username, String key, AsyncCallback callback); + //------------------------------------------------ OAuth Interface ---------------------------------------------------------------------- + + void getAuthorizationUrl(CredentialDTO credential, AsyncCallback callback); + + void verifySocialUser(CredentialDTO credential, AsyncCallback callback); + } diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserService.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserService.java index cf9b12bbd31..6621e108742 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserService.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserService.java @@ -16,7 +16,6 @@ import com.sap.sse.security.ui.client.i18n.StringMessages; import com.sap.sse.security.ui.oauth.client.util.ClientUtils; import com.sap.sse.security.ui.shared.SuccessInfo; import com.sap.sse.security.ui.shared.UserDTO; -import com.sap.sse.security.ui.shared.UserManagementServiceAsync; /** * Encapsulates the current user, remembered as a {@link UserDTO} object. The current user is determined by a call to diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AbstractUserDialog.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AbstractUserDialog.java index ebaee232e38..9a28b1ae138 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AbstractUserDialog.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/AbstractUserDialog.java @@ -6,10 +6,10 @@ import com.google.gwt.user.client.ui.PasswordTextBox; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Widget; import com.sap.sse.gwt.client.dialog.DataEntryDialog; +import com.sap.sse.security.ui.client.UserManagementServiceAsync; import com.sap.sse.security.ui.client.component.AbstractUserDialog.UserData; import com.sap.sse.security.ui.client.i18n.StringMessages; import com.sap.sse.security.ui.shared.UserDTO; -import com.sap.sse.security.ui.shared.UserManagementServiceAsync; /** * Produces username, e-mail and password as the dialog's result. This class's default implementation of diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/ChangePasswordDialog.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/ChangePasswordDialog.java index f23c8a6cb0d..8eca71ae0d4 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/ChangePasswordDialog.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/ChangePasswordDialog.java @@ -1,8 +1,8 @@ package com.sap.sse.security.ui.client.component; +import com.sap.sse.security.ui.client.UserManagementServiceAsync; import com.sap.sse.security.ui.client.i18n.StringMessages; import com.sap.sse.security.ui.shared.UserDTO; -import com.sap.sse.security.ui.shared.UserManagementServiceAsync; public class ChangePasswordDialog extends AbstractUserDialog { public ChangePasswordDialog(StringMessages stringMessages, UserManagementServiceAsync userManagementService, UserDTO user, diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/CreateUserDialog.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/CreateUserDialog.java index a4aae011723..6bd57708dda 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/CreateUserDialog.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/CreateUserDialog.java @@ -5,10 +5,10 @@ import java.util.HashMap; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.sap.sse.security.ui.client.EntryPointLinkFactory; +import com.sap.sse.security.ui.client.UserManagementServiceAsync; import com.sap.sse.security.ui.client.component.UserManagementPanel.UserCreatedEventHandler; import com.sap.sse.security.ui.client.i18n.StringMessages; import com.sap.sse.security.ui.shared.UserDTO; -import com.sap.sse.security.ui.shared.UserManagementServiceAsync; /** * Produces username, e-mail and password as the dialog's result. diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/EditEmailDialog.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/EditEmailDialog.java index 699494691a1..9122513c785 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/EditEmailDialog.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/EditEmailDialog.java @@ -3,9 +3,9 @@ package com.sap.sse.security.ui.client.component; import com.google.gwt.user.client.ui.Grid; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Widget; +import com.sap.sse.security.ui.client.UserManagementServiceAsync; import com.sap.sse.security.ui.client.i18n.StringMessages; import com.sap.sse.security.ui.shared.UserDTO; -import com.sap.sse.security.ui.shared.UserManagementServiceAsync; public class EditEmailDialog extends AbstractUserDialog { public EditEmailDialog(final StringMessages stringMessages, UserManagementServiceAsync userManagementService, UserDTO user, DialogCallback callback) { diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/EditEmailDialogWithDefaultCallback.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/EditEmailDialogWithDefaultCallback.java index d919f180924..d327751a18b 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/EditEmailDialogWithDefaultCallback.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/EditEmailDialogWithDefaultCallback.java @@ -6,9 +6,9 @@ import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.sap.sse.gwt.client.async.MarkedAsyncCallback; import com.sap.sse.security.ui.client.EntryPointLinkFactory; +import com.sap.sse.security.ui.client.UserManagementServiceAsync; import com.sap.sse.security.ui.client.i18n.StringMessages; import com.sap.sse.security.ui.shared.UserDTO; -import com.sap.sse.security.ui.shared.UserManagementServiceAsync; /** * Forwards the e-mail update request to a {@link UserManagementServiceAsync} and uses default diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/ForgotPasswordDialog.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/ForgotPasswordDialog.java index e24b77d6211..1050c38e0a2 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/ForgotPasswordDialog.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/ForgotPasswordDialog.java @@ -10,9 +10,9 @@ import com.google.gwt.user.client.ui.Widget; import com.sap.sse.gwt.client.async.MarkedAsyncCallback; import com.sap.sse.security.shared.UserManagementException; import com.sap.sse.security.ui.client.EntryPointLinkFactory; +import com.sap.sse.security.ui.client.UserManagementServiceAsync; import com.sap.sse.security.ui.client.i18n.StringMessages; import com.sap.sse.security.ui.shared.UserDTO; -import com.sap.sse.security.ui.shared.UserManagementServiceAsync; public class ForgotPasswordDialog extends AbstractUserDialog { public ForgotPasswordDialog(StringMessages stringMessages, UserManagementServiceAsync userManagementService, UserDTO user, diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/SettingsPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/SettingsPanel.java index 964736a8797..ca05964b91d 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/SettingsPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/SettingsPanel.java @@ -27,8 +27,8 @@ import com.google.gwt.user.client.ui.TabLayoutPanel; import com.google.gwt.user.client.ui.TextBox; import com.sap.sse.gwt.client.AbstractEntryPoint; import com.sap.sse.security.ui.client.IconResources; +import com.sap.sse.security.ui.client.UserManagementServiceAsync; import com.sap.sse.security.ui.client.i18n.StringMessages; -import com.sap.sse.security.ui.shared.UserManagementServiceAsync; public class SettingsPanel extends LayoutPanel { diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserDetailsView.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserDetailsView.java index f312e22c3ee..839ca489f9d 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserDetailsView.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserDetailsView.java @@ -26,10 +26,12 @@ import com.google.gwt.user.client.ui.VerticalPanel; import com.sap.sse.gwt.client.async.MarkedAsyncCallback; import com.sap.sse.gwt.client.controls.listedit.StringListEditorComposite; import com.sap.sse.gwt.client.dialog.DataEntryDialog; +import com.sap.sse.security.shared.DefaultPermissions; import com.sap.sse.security.shared.DefaultRoles; import com.sap.sse.security.shared.UserManagementException; import com.sap.sse.security.ui.client.IconResources; import com.sap.sse.security.ui.client.UserChangeEventHandler; +import com.sap.sse.security.ui.client.UserManagementServiceAsync; import com.sap.sse.security.ui.client.UserService; import com.sap.sse.security.ui.client.component.AbstractUserDialog.UserData; import com.sap.sse.security.ui.client.i18n.StringMessages; @@ -37,7 +39,6 @@ import com.sap.sse.security.ui.oauth.client.SocialUserDTO; import com.sap.sse.security.ui.shared.AccountDTO; import com.sap.sse.security.ui.shared.SuccessInfo; import com.sap.sse.security.ui.shared.UserDTO; -import com.sap.sse.security.ui.shared.UserManagementServiceAsync; import com.sap.sse.security.ui.shared.UsernamePasswordAccountDTO; public class UserDetailsView extends FlowPanel { @@ -48,6 +49,7 @@ public class UserDetailsView extends FlowPanel { private final Label usernameLabel; private final Label emailLabel; private final StringListEditorComposite rolesEditor; + private final StringListEditorComposite permissionsEditor; private final VerticalPanel accountPanels; private UserDTO user; @@ -60,12 +62,16 @@ public class UserDetailsView extends FlowPanel { for (DefaultRoles defaultRole : DefaultRoles.values()) { defaultRoleNames.add(defaultRole.getRolename()); } + List defaultPermissionNames = new ArrayList<>(); + for (DefaultPermissions defaultPermission : DefaultPermissions.values()) { + defaultPermissionNames.add(defaultPermission.getPermissionname()); + } rolesEditor = new StringListEditorComposite(user==null?Collections.emptySet():user.getRoles(), stringMessages, IconResources.INSTANCE.remove(), defaultRoleNames, stringMessages.enterRoleName()); rolesEditor.addValueChangeHandler(new ValueChangeHandler>() { @Override public void onValueChange(ValueChangeEvent> event) { - Iterable newRoleList = event.getValue(); + final Iterable newRoleList = event.getValue(); final UserDTO selectedUser = UserDetailsView.this.user; userManagementService.setRolesForUser(selectedUser.getName(), newRoleList, new MarkedAsyncCallback( new AsyncCallback() { @@ -79,6 +85,7 @@ public class UserDetailsView extends FlowPanel { if (!result.isSuccessful()) { Window.alert(stringMessages.errorUpdatingRoles(selectedUser.getName(), result.getMessage())); } else { + selectedUser.setRoles(newRoleList); if (userService.getCurrentUser().getName().equals(selectedUser.getName())) { // if the current user's roles changed, update the user object in the user service and notify others userService.updateUser(/* notify other instances */ true); @@ -88,6 +95,35 @@ public class UserDetailsView extends FlowPanel { })); } }); + permissionsEditor = new StringListEditorComposite(user==null?Collections.emptySet():user.getPermissions(), stringMessages, IconResources.INSTANCE.remove(), defaultPermissionNames, + stringMessages.enterPermissionName()); + permissionsEditor.addValueChangeHandler(new ValueChangeHandler>() { + @Override + public void onValueChange(ValueChangeEvent> event) { + final Iterable newPermissionList = event.getValue(); + final UserDTO selectedUser = UserDetailsView.this.user; + userManagementService.setPermissionsForUser(selectedUser.getName(), newPermissionList, new MarkedAsyncCallback( + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + Window.alert(stringMessages.errorUpdatingPermissions(selectedUser.getName(), caught.getMessage())); + } + + @Override + public void onSuccess(SuccessInfo result) { + if (!result.isSuccessful()) { + Window.alert(stringMessages.errorUpdatingPermissions(selectedUser.getName(), result.getMessage())); + } else { + selectedUser.setPermissions(newPermissionList); + if (userService.getCurrentUser().getName().equals(selectedUser.getName())) { + // if the current user's permissions changed, update the user object in the user service and notify others + userService.updateUser(/* notify other instances */ true); + } + } + } + })); + } + }); usernameLabel = new Label(); emailLabel = new Label(); final Button changeEmail = new Button(stringMessages.edit()); @@ -131,6 +167,7 @@ public class UserDetailsView extends FlowPanel { decoratorPanel.setWidget(fp); this.add(decoratorPanel); this.add(rolesEditor); + this.add(permissionsEditor); updateUser(user, userManagementService); } @@ -203,6 +240,7 @@ public class UserDetailsView extends FlowPanel { accountPanels.add(accountPanelDecorator); } rolesEditor.setValue(user.getRoles(), /* fireEvents */ false); + permissionsEditor.setValue(user.getPermissions(), /* fireEvents */ false); } } diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserListDataProvider.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserListDataProvider.java index 8c3fa23b672..e9d7b37c1ab 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserListDataProvider.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserListDataProvider.java @@ -15,8 +15,8 @@ import com.google.gwt.view.client.AbstractDataProvider; import com.google.gwt.view.client.HasData; import com.google.gwt.view.client.Range; import com.google.gwt.view.client.SelectionModel; +import com.sap.sse.security.ui.client.UserManagementServiceAsync; import com.sap.sse.security.ui.shared.UserDTO; -import com.sap.sse.security.ui.shared.UserManagementServiceAsync; public class UserListDataProvider extends AbstractDataProvider { diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserManagementPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserManagementPanel.java index 1aa35e8fce3..ec1f706e1bc 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserManagementPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserManagementPanel.java @@ -24,11 +24,11 @@ import com.google.gwt.view.client.SelectionChangeEvent; import com.google.gwt.view.client.SelectionChangeEvent.Handler; import com.google.gwt.view.client.SingleSelectionModel; import com.sap.sse.security.ui.client.UserChangeEventHandler; +import com.sap.sse.security.ui.client.UserManagementServiceAsync; import com.sap.sse.security.ui.client.UserService; import com.sap.sse.security.ui.client.i18n.StringMessages; import com.sap.sse.security.ui.shared.SuccessInfo; import com.sap.sse.security.ui.shared.UserDTO; -import com.sap.sse.security.ui.shared.UserManagementServiceAsync; public class UserManagementPanel extends DockPanel { diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.java index cf947e3d6cb..8511ea6a4ef 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.java @@ -45,7 +45,9 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages { String add(); String edit(); String errorUpdatingRoles(String username, String message); + String errorUpdatingPermissions(String name, String message); String enterRoleName(); + String enterPermissionName(); String errorCreatingUser(String username, String message); String signedUpSuccessfully(String username); String unknownErrorCreatingUser(String username); @@ -69,6 +71,7 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages { String failedToSignIn(); String emailValidationUnsuccessful(String username); String roles(); + String permissions(); String signInWith(); String generalWelcome(); String newUser(); diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.properties b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.properties index 739d7da62c6..0ff97b2bf48 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.properties +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.properties @@ -38,7 +38,9 @@ remove=Remove add=Add edit=Edit errorUpdatingRoles=Error updating roles for user {0}: {1} +errorUpdatingPermissions=Error updating permissions for user {0}: {1} enterRoleName=Enter role name... +enterPermissionName=Enter permission name... errorCreatingUser=Error signing up with username {0}: {1} signedUpSuccessfully=Successfully signed up user {0}. Please check you e-mails to validate your e-mail account. unknownErrorCreatingUser=Unknown error trying to sign up user with name {0}. Perhaps another user with that name already exists. @@ -62,6 +64,7 @@ successfullyResetPassword=Successfully reset password for user {0}. e-Mail has b failedToSignIn=Failed to sign in. Check your credentials. emailValidationUnsuccessful=Validation of e-mail address for user {0} failed. Did you really use the latest validation code? roles=Roles +permissions=Permissions signInWith=Sign in with... generalWelcome=Welcome! newUser=New here? diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_de.properties b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_de.properties index db4cbca232a..c7140a49800 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_de.properties +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_de.properties @@ -38,7 +38,9 @@ remove=Löschen add=Hinzufügen edit=Bearbeiten errorUpdatingRoles=Fehler beim Aktualisieren der Rollen des Benutzers {0}: {1} +errorUpdatingPermissions=Fehler beim Aktualisieren der Berechtigungen des Benutzers {0}: {1} enterRoleName=Rollennamen eingeben... +enterPermissionName=Berechtigungsnamen eingeben... errorCreatingUser=Fehler beim Anlegen des Benutzers mit Namen {0}: {1} signedUpSuccessfully=Benutzer {0} erfolgreich angelegt. Bitte e-Mails pr�fen, um e-Mail-Adresse zu validieren. unknownErrorCreatingUser=Unbekannter Fehler beim Versuch, den Benutzer mit dem Namen {0} anzulegen. M�glicherweise existiert ein Benutzer gleichen Namens bereits. @@ -62,6 +64,7 @@ successfullyResetPassword=Passwort für Benutzer {0} erfolgreich zurückgesetzt. failedToSignIn=Anmeldung fehlgeschlagen. Zugangsdaten überprüfen. emailValidationUnsuccessful=Validierung der e-Mail-Adresse für Benutzer {0} fehlgeschlagen. Handelte es sich wirklich um den zuletzt ausgestellten Validierungs-Code? roles=Rollen +permissions=Berechtigungen signInWith=Anmelden mit... generalWelcome=Herzlich Willkommen. newUser=Neuer Benutzer? diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/shared/oauthlogin/OAuthLogin.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/shared/oauthlogin/OAuthLogin.java index b38f6b2b039..75fc66ae37c 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/shared/oauthlogin/OAuthLogin.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/shared/oauthlogin/OAuthLogin.java @@ -10,9 +10,9 @@ import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Widget; +import com.sap.sse.security.ui.client.UserManagementServiceAsync; import com.sap.sse.security.ui.oauth.client.CredentialDTO; import com.sap.sse.security.ui.oauth.client.util.ClientUtils; -import com.sap.sse.security.ui.shared.UserManagementServiceAsync; public class OAuthLogin extends Composite { private static OAuthLoginUiBinder uiBinder = GWT.create(OAuthLoginUiBinder.class); diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/editprofile/EditProfileEntryPoint.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/editprofile/EditProfileEntryPoint.java index 769ae0b771a..f79a1698185 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/editprofile/EditProfileEntryPoint.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/editprofile/EditProfileEntryPoint.java @@ -25,6 +25,8 @@ import com.google.gwt.user.client.ui.TextBox; import com.sap.sse.gwt.client.EntryPointHelper; import com.sap.sse.security.shared.UserManagementException; import com.sap.sse.security.ui.client.RemoteServiceMappingConstants; +import com.sap.sse.security.ui.client.UserManagementService; +import com.sap.sse.security.ui.client.UserManagementServiceAsync; import com.sap.sse.security.ui.client.UserService; import com.sap.sse.security.ui.client.UserStatusEventHandler; import com.sap.sse.security.ui.client.component.AbstractUserDialog.UserData; @@ -32,8 +34,6 @@ import com.sap.sse.security.ui.client.component.EditEmailDialogWithDefaultCallba import com.sap.sse.security.ui.client.component.NewAccountValidator; import com.sap.sse.security.ui.client.i18n.StringMessages; import com.sap.sse.security.ui.shared.UserDTO; -import com.sap.sse.security.ui.shared.UserManagementService; -import com.sap.sse.security.ui.shared.UserManagementServiceAsync; public class EditProfileEntryPoint implements EntryPoint { private final UserManagementServiceAsync userManagementService = GWT.create(UserManagementService.class); @@ -68,6 +68,9 @@ public class EditProfileEntryPoint implements EntryPoint { rolesPanel.add(new Label(stringMessages.roles())); final Label rolesLabel = new Label(); rolesPanel.add(rolesLabel); + rolesPanel.add(new Label(stringMessages.permissions())); + final Label permissionsLabel = new Label(); + rolesPanel.add(permissionsLabel); fp.add(rolesPanel); final Label emailLabel = new Label(stringMessages.email()); fp.add(emailLabel); @@ -116,6 +119,7 @@ public class EditProfileEntryPoint implements EntryPoint { nameText.setText(user.getName()); emailText.setText(user.getEmail()); rolesLabel.setText(user.getRoles().toString()); + permissionsLabel.setText(user.getPermissions().toString()); } } }); diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/login/LoginView.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/login/LoginView.java index 69df9ac791d..6759b402553 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/login/LoginView.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/login/LoginView.java @@ -21,12 +21,12 @@ import com.sap.sse.gwt.client.controls.PasswordTextBoxWithWatermark; import com.sap.sse.gwt.client.controls.TextBoxWithWatermark; import com.sap.sse.gwt.client.dialog.DialogUtils; import com.sap.sse.security.ui.client.EntryPointLinkFactory; +import com.sap.sse.security.ui.client.UserManagementServiceAsync; import com.sap.sse.security.ui.client.UserService; import com.sap.sse.security.ui.client.component.ForgotPasswordDialog; import com.sap.sse.security.ui.client.i18n.StringMessages; import com.sap.sse.security.ui.client.shared.oauthlogin.OAuthLogin; import com.sap.sse.security.ui.shared.SuccessInfo; -import com.sap.sse.security.ui.shared.UserManagementServiceAsync; public class LoginView extends Composite { private static LoginViewUiBinder uiBinder = GWT.create(LoginViewUiBinder.class); diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/loginpanel/LoginPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/loginpanel/LoginPanel.java index 2234992f63c..dc1f21d1183 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/loginpanel/LoginPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/loginpanel/LoginPanel.java @@ -16,6 +16,7 @@ import com.sap.sse.gwt.client.async.MarkedAsyncCallback; import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback; import com.sap.sse.security.ui.client.EntryPointLinkFactory; import com.sap.sse.security.ui.client.IconResources; +import com.sap.sse.security.ui.client.UserManagementServiceAsync; import com.sap.sse.security.ui.client.UserService; import com.sap.sse.security.ui.client.UserStatusEventHandler; import com.sap.sse.security.ui.client.component.AbstractUserDialog.UserData; @@ -23,7 +24,6 @@ import com.sap.sse.security.ui.client.i18n.StringMessages; import com.sap.sse.security.ui.client.shared.oauthlogin.OAuthLogin; import com.sap.sse.security.ui.shared.SuccessInfo; import com.sap.sse.security.ui.shared.UserDTO; -import com.sap.sse.security.ui.shared.UserManagementServiceAsync; public class LoginPanel extends HorizontalPanel implements UserStatusEventHandler { public final UserManagementServiceAsync userManagementService; diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/loginpanel/SignInDialog.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/loginpanel/SignInDialog.java index f7837a7a67a..faeff96ae8b 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/loginpanel/SignInDialog.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/loginpanel/SignInDialog.java @@ -6,12 +6,12 @@ import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Grid; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Widget; +import com.sap.sse.security.ui.client.UserManagementServiceAsync; import com.sap.sse.security.ui.client.UserService; import com.sap.sse.security.ui.client.component.AbstractUserDialog; import com.sap.sse.security.ui.client.component.ForgotPasswordDialog; import com.sap.sse.security.ui.client.i18n.StringMessages; import com.sap.sse.security.ui.client.shared.oauthlogin.OAuthLogin; -import com.sap.sse.security.ui.shared.UserManagementServiceAsync; public class SignInDialog extends AbstractUserDialog { private final UserService userService; diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/loginpanel/SignUpDialog.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/loginpanel/SignUpDialog.java index 2717ceac720..febf4aa50e7 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/loginpanel/SignUpDialog.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/loginpanel/SignUpDialog.java @@ -1,8 +1,8 @@ package com.sap.sse.security.ui.loginpanel; +import com.sap.sse.security.ui.client.UserManagementServiceAsync; import com.sap.sse.security.ui.client.component.AbstractUserDialog; import com.sap.sse.security.ui.client.i18n.StringMessages; -import com.sap.sse.security.ui.shared.UserManagementServiceAsync; public class SignUpDialog extends AbstractUserDialog { public SignUpDialog(StringMessages stringMessages, UserManagementServiceAsync userManagementService, DialogCallback callback) { diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/oauth/client/OAuthLoginEntryPoint.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/oauth/client/OAuthLoginEntryPoint.java index d4150e945c2..df3bc7d0d70 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/oauth/client/OAuthLoginEntryPoint.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/oauth/client/OAuthLoginEntryPoint.java @@ -15,13 +15,13 @@ import com.google.gwt.user.client.ui.Widget; import com.sap.sse.gwt.client.EntryPointHelper; import com.sap.sse.security.ui.client.RemoteServiceMappingConstants; import com.sap.sse.security.ui.client.UserChangeEventHandler; +import com.sap.sse.security.ui.client.UserManagementService; +import com.sap.sse.security.ui.client.UserManagementServiceAsync; import com.sap.sse.security.ui.client.UserService; import com.sap.sse.security.ui.client.i18n.StringMessages; import com.sap.sse.security.ui.client.shared.oauthlogin.OAuthLogin; import com.sap.sse.security.ui.oauth.client.util.ClientUtils; import com.sap.sse.security.ui.shared.UserDTO; -import com.sap.sse.security.ui.shared.UserManagementService; -import com.sap.sse.security.ui.shared.UserManagementServiceAsync; public class OAuthLoginEntryPoint implements EntryPoint, UserChangeEventHandler { private final UserManagementServiceAsync userManagementService = GWT.create(UserManagementService.class); diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/oauth/client/util/ClientUtils.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/oauth/client/util/ClientUtils.java index 44e7422917d..479e3c74c2f 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/oauth/client/util/ClientUtils.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/oauth/client/util/ClientUtils.java @@ -4,9 +4,9 @@ import com.google.gwt.user.client.Cookies; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.Window.Location; import com.google.gwt.user.client.rpc.AsyncCallback; +import com.sap.sse.security.ui.client.UserManagementServiceAsync; import com.sap.sse.security.ui.oauth.client.CredentialDTO; import com.sap.sse.security.ui.shared.SuccessInfo; -import com.sap.sse.security.ui.shared.UserManagementServiceAsync; public class ClientUtils { private final static String AUTH_PROVIDER_COOKIE = "sapsailing_provider"; diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/registration/RegisterView.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/registration/RegisterView.java index ca861ec16a7..cf4272158e8 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/registration/RegisterView.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/registration/RegisterView.java @@ -20,10 +20,10 @@ import com.sap.sse.gwt.client.controls.TextBoxWithWatermark; import com.sap.sse.gwt.client.dialog.DialogUtils; import com.sap.sse.security.shared.UserManagementException; import com.sap.sse.security.ui.client.EntryPointLinkFactory; +import com.sap.sse.security.ui.client.UserManagementServiceAsync; import com.sap.sse.security.ui.client.component.NewAccountValidator; import com.sap.sse.security.ui.client.i18n.StringMessages; import com.sap.sse.security.ui.shared.UserDTO; -import com.sap.sse.security.ui.shared.UserManagementServiceAsync; public class RegisterView extends Composite { private static RegisterViewUiBinder uiBinder = GWT.create(RegisterViewUiBinder.class); diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/UserManagementServiceImpl.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/UserManagementServiceImpl.java index 50a106325d3..09ee21b30e4 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/UserManagementServiceImpl.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/UserManagementServiceImpl.java @@ -21,7 +21,6 @@ import javax.servlet.http.HttpSession; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.subject.Subject; -import org.apache.shiro.util.ByteSource; import org.osgi.framework.BundleContext; import org.osgi.util.tracker.ServiceTracker; @@ -40,13 +39,13 @@ import com.sap.sse.security.shared.MailException; import com.sap.sse.security.shared.SocialUserAccount; import com.sap.sse.security.shared.UserManagementException; import com.sap.sse.security.shared.UsernamePasswordAccount; +import com.sap.sse.security.ui.client.UserManagementService; import com.sap.sse.security.ui.oauth.client.CredentialDTO; import com.sap.sse.security.ui.oauth.client.SocialUserDTO; import com.sap.sse.security.ui.oauth.shared.OAuthException; import com.sap.sse.security.ui.shared.AccountDTO; import com.sap.sse.security.ui.shared.SuccessInfo; import com.sap.sse.security.ui.shared.UserDTO; -import com.sap.sse.security.ui.shared.UserManagementService; import com.sap.sse.security.ui.shared.UsernamePasswordAccountDTO; public class UserManagementServiceImpl extends RemoteServiceServlet implements UserManagementService { @@ -175,11 +174,11 @@ public class UserManagementServiceImpl extends RemoteServiceServlet implements U } @Override - public void resetPassword(String username, String email, String baseURL) throws UserManagementException, MailException { + public void resetPassword(String username, String email, String passwordResetBaseURL) throws UserManagementException, MailException { if (username == null || username.isEmpty()) { username = getSecurityService().getUserByEmail(email).getName(); } - getSecurityService().resetPassword(username, baseURL); + getSecurityService().resetPassword(username, passwordResetBaseURL); } @Override @@ -215,25 +214,49 @@ public class UserManagementServiceImpl extends RemoteServiceServlet implements U if (currentSubject.hasRole(DefaultRoles.ADMIN.getRolename())) { User u = getSecurityService().getUserByName(username); if (u == null) { - return new SuccessInfo(false, "User does not exist.", /* redirectURL */ null, null); + return new SuccessInfo(false, "User does not exist.", /* redirectURL */null, null); } - try { - Set rolesToRemove = new HashSet<>(); - Util.addAll(u.getRoles(), rolesToRemove); - Util.removeAll(roles, rolesToRemove); - for (String roleToRemove : rolesToRemove) { - getSecurityService().removeRoleFromUser(username, roleToRemove); - } - Set rolesToAdd = new HashSet<>(); - Util.addAll(roles, rolesToAdd); - Util.removeAll(u.getRoles(), rolesToAdd); - for (String roleToAdd : rolesToAdd) { - getSecurityService().addRoleForUser(username, roleToAdd); - } - return new SuccessInfo(true, "Added role: " + roles + ".", /* redirectURL */ null, createUserDTOFromUser(u)); - } catch (UserManagementException e) { - return new SuccessInfo(false, e.getMessage(), /* redirectURL */ null, null); + Set rolesToRemove = new HashSet<>(); + Util.addAll(u.getRoles(), rolesToRemove); + Util.removeAll(roles, rolesToRemove); + for (String roleToRemove : rolesToRemove) { + getSecurityService().removeRoleFromUser(username, roleToRemove); } + Set rolesToAdd = new HashSet<>(); + Util.addAll(roles, rolesToAdd); + Util.removeAll(u.getRoles(), rolesToAdd); + for (String roleToAdd : rolesToAdd) { + getSecurityService().addRoleForUser(username, roleToAdd); + } + return new SuccessInfo(true, "Set roles " + roles + " for user " + username, /* redirectURL */null, + createUserDTOFromUser(u)); + } else { + return new SuccessInfo(false, "You don't have the required permissions to add a role.", /* redirectURL */ null, null); + } + } + + @Override + public SuccessInfo setPermissionsForUser(String username, Iterable permissions) { + Subject currentSubject = SecurityUtils.getSubject(); + if (currentSubject.hasRole(DefaultRoles.ADMIN.getRolename())) { + User u = getSecurityService().getUserByName(username); + if (u == null) { + return new SuccessInfo(false, "User does not exist.", /* redirectURL */null, null); + } + Set permissionsToRemove = new HashSet<>(); + Util.addAll(u.getPermissions(), permissionsToRemove); + Util.removeAll(permissions, permissionsToRemove); + for (String permissionToRemove : permissionsToRemove) { + getSecurityService().removePermissionFromUser(username, permissionToRemove); + } + Set permissionsToAdd = new HashSet<>(); + Util.addAll(permissions, permissionsToAdd); + Util.removeAll(u.getPermissions(), permissionsToAdd); + for (String permissionToAdd : permissionsToAdd) { + getSecurityService().addPermissionForUser(username, permissionToAdd); + } + return new SuccessInfo(true, "Set roles " + permissions + " for user " + username, /* redirectURL */null, + createUserDTOFromUser(u)); } else { return new SuccessInfo(false, "You don't have the required permissions to add a role.", /* redirectURL */ null, null); } @@ -261,12 +284,13 @@ public class UserManagementServiceImpl extends RemoteServiceServlet implements U default: UsernamePasswordAccount upa = (UsernamePasswordAccount) a; - accountDTOs.add(new UsernamePasswordAccountDTO(upa.getName(), upa.getSaltedPassword(), ((ByteSource) upa.getSalt()).getBytes())); + accountDTOs.add(new UsernamePasswordAccountDTO(upa.getName(), upa.getSaltedPassword(), upa.getSalt())); break; } } userDTO = new UserDTO(user.getName(), user.getEmail(), user.isEmailValidated(), accountDTOs); userDTO.addRoles(user.getRoles()); + userDTO.addPermissions(user.getPermissions()); return userDTO; } diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/shared/UserDTO.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/shared/UserDTO.java index 09f48a513d6..de53f0b7ffd 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/shared/UserDTO.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/shared/UserDTO.java @@ -1,17 +1,18 @@ package com.sap.sse.security.ui.shared; -import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; import com.google.gwt.user.client.rpc.IsSerializable; +import com.sap.sse.common.Util; public class UserDTO implements IsSerializable { private String name; private String email; private List accounts; private Set roles = new HashSet<>(); + private Set permissions = new HashSet<>(); private boolean emailValidated; UserDTO() {} // for serialization only @@ -34,11 +35,33 @@ public class UserDTO implements IsSerializable { public boolean hasRole(String role) { return roles.contains(role); } - - public void addRoles(Collection roles) { - this.roles.addAll(roles); + + public void addRoles(Iterable roles) { + Util.addAll(roles, this.roles); + } + + public void setRoles(Iterable newRoleList) { + this.roles.clear(); + Util.addAll(newRoleList, this.roles); + } + + public Iterable getPermissions() { + return permissions; + } + + public boolean hasPermission(String permission) { + return permissions.contains(permission); } + public void addPermissions(Iterable permissions) { + Util.addAll(permissions, this.permissions); + } + + public void setPermissions(Iterable newPermissionList) { + this.permissions.clear(); + Util.addAll(newPermissionList, this.permissions); + } + public List getAccounts() { return accounts; } @@ -50,4 +73,5 @@ public class UserDTO implements IsSerializable { public boolean isEmailValidated() { return emailValidated; } + } diff --git a/java/com.sap.sse.security.ui/src/main/resources/shiro.ini b/java/com.sap.sse.security.ui/src/main/resources/shiro.ini index 7c0466025e0..8e7d14f8c4b 100755 --- a/java/com.sap.sse.security.ui/src/main/resources/shiro.ini +++ b/java/com.sap.sse.security.ui/src/main/resources/shiro.ini @@ -1,10 +1,4 @@ - [main] -#shiro.loginUrl = /security/ui/Login.html -#shiro.successUrl = /UserManagement.html -# Use Built-in Chache Manager - - credentialsMatcher = org.apache.shiro.authc.credential.Sha256CredentialsMatcher # base64 encoding, not hex in this example: credentialsMatcher.storedCredentialsHexEncoded = false @@ -19,8 +13,6 @@ securityManager.realms = $upRealm, $oauthRealm sessionManager = com.sap.sse.security.SecurityWebSessionManager securityManager.sessionManager = $sessionManager -#globalCookie = com.sap.sse.security.GlobalCookie -#securityManager.sessionManager.sessionIdCookie = $globalCookie authc = com.sap.sse.security.CustomFilter authc.loginUrl = /security/ui/Login.html @@ -32,8 +24,6 @@ securityManager.sessionManager.sessionDAO = $sessionDAO cacheManager = com.sap.sse.security.SessionCacheManager securityManager.cacheManager = $cacheManager -#securityManager.sessionMode = native - [urls] /Login.html = anon /UserManagement.html = authc,roles[admin] diff --git a/java/com.sap.sse.security.userstore.mongodb/META-INF/MANIFEST.MF b/java/com.sap.sse.security.userstore.mongodb/META-INF/MANIFEST.MF index 8485bd6328b..142723bcd75 100644 --- a/java/com.sap.sse.security.userstore.mongodb/META-INF/MANIFEST.MF +++ b/java/com.sap.sse.security.userstore.mongodb/META-INF/MANIFEST.MF @@ -12,6 +12,8 @@ Bundle-ClassPath: . Require-Bundle: com.sap.sse.security, com.mongodb.driver;bundle-version="2.6.2", org.apache.shiro.core;bundle-version="1.2.2", - com.sap.sse.mongodb + com.sap.sse.mongodb, + com.sap.sse.common, + com.sap.sse.security.common Export-Package: com.sap.sse.security.userstore.mongodb, com.sap.sse.security.userstore.mongodb.impl;x-friends:="com.sap.sse.security.test" diff --git a/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/MongoObjectFactory.java b/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/MongoObjectFactory.java index 2d7d3755bca..d734a232c47 100644 --- a/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/MongoObjectFactory.java +++ b/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/MongoObjectFactory.java @@ -2,6 +2,7 @@ package com.sap.sse.security.userstore.mongodb; import java.util.Map; +import com.mongodb.DB; import com.sap.sse.security.User; public interface MongoObjectFactory { @@ -15,4 +16,6 @@ public interface MongoObjectFactory { public void storeSettingTypes(Map> settingTypes); public void storePreferences(String username, Map userMap); + + public DB getDatabase(); } diff --git a/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/UserStoreImpl.java b/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/UserStoreImpl.java index fb167bc4833..46c3a062db5 100644 --- a/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/UserStoreImpl.java +++ b/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/UserStoreImpl.java @@ -1,7 +1,7 @@ package com.sap.sse.security.userstore.mongodb; import java.util.ArrayList; -import java.util.Collection; +import java.util.Collections; import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; @@ -15,28 +15,42 @@ import com.sap.sse.security.UserStore; import com.sap.sse.security.shared.Account; import com.sap.sse.security.shared.UserManagementException; +/** + * An implementation of the {@link UserStore} interface, intended to store its state durably in a MongoDB instance. + * A de-serialized copy, however, will have its {@link #mongoObjectFactory} field set to null and will + * therefore not perform any changes to the database. This is also the reason why all access to the + * {@link #mongoObjectFactory} field needs to be null-safe.

+ * + * @author Axel Uhl (D043530) + * + */ public class UserStoreImpl implements UserStore { + private static final long serialVersionUID = -3860868283827473187L; + private static final Logger logger = Logger.getLogger(UserStoreImpl.class.getName()); private String name = "MongoDB user store"; private final ConcurrentHashMap users; private final ConcurrentHashMap> usersByEmail; - private final ConcurrentHashMap emailForUser; + private final ConcurrentHashMap emailForUsername; private final ConcurrentHashMap settings; private final ConcurrentHashMap> settingTypes; private final ConcurrentHashMap> preferences; - private final DomainObjectFactory domainObjectFactory; - private final MongoObjectFactory mongoObjectFactory; + + /** + * Won't be serialized and remains null on the de-serializing end. + */ + private final transient MongoObjectFactory mongoObjectFactory; public UserStoreImpl() { users = new ConcurrentHashMap<>(); usersByEmail = new ConcurrentHashMap<>(); - emailForUser = new ConcurrentHashMap<>(); + emailForUsername = new ConcurrentHashMap<>(); settings = new ConcurrentHashMap<>(); settingTypes = new ConcurrentHashMap>(); preferences = new ConcurrentHashMap<>(); - domainObjectFactory = PersistenceFactory.INSTANCE.getDefaultDomainObjectFactory(); + final DomainObjectFactory domainObjectFactory = PersistenceFactory.INSTANCE.getDefaultDomainObjectFactory(); mongoObjectFactory = PersistenceFactory.INSTANCE.getDefaultMongoObjectFactory(); for (Entry> e : domainObjectFactory.loadSettingTypes().entrySet()) { settingTypes.put(e.getKey(), e.getValue()); @@ -59,6 +73,34 @@ public class UserStoreImpl implements UserStore { } } + @Override + public void clear() { + preferences.clear(); + emailForUsername.clear(); + settings.clear(); + settingTypes.clear(); + users.clear(); + usersByEmail.clear(); + } + + @Override + public void replaceContentsFrom(UserStore newUserStore) { + clear(); + for (User user : newUserStore.getUsers()) { + users.put(user.getName(), user); + addToUsersByEmail(user); + for (Entry userPref : newUserStore.getAllPreferences(user.getName()).entrySet()) { + setPreference(user.getName(), userPref.getKey(), userPref.getValue()); + } + } + for (Entry setting : newUserStore.getAllSettings().entrySet()) { + settings.put(setting.getKey(), setting.getValue()); + } + for (Entry> settingType : newUserStore.getAllSettingTypes().entrySet()) { + settingTypes.put(settingType.getKey(), settingType.getValue()); + } + } + private void addToUsersByEmail(User u) { if (u.getEmail() != null && !u.getEmail().isEmpty()) { Set set = usersByEmail.get(u.getEmail()); @@ -67,17 +109,19 @@ public class UserStoreImpl implements UserStore { usersByEmail.put(u.getEmail(), set); } set.add(u); - emailForUser.put(u, u.getEmail()); + emailForUsername.put(u.getName(), u.getEmail()); } } private void removeFromUsersByEmail(User u) { if (u != null) { - Set set = usersByEmail.get(emailForUser.get(u)); // this also works if the user's e-mail has changed meanwhile - if (set != null) { - set.remove(u); + final String email = emailForUsername.remove(u.getName()); + if (email != null) { + Set set = usersByEmail.get(email); // this also works if the user's e-mail has changed meanwhile + if (set != null) { + set.remove(u); + } } - emailForUser.remove(u); } } @@ -105,7 +149,9 @@ public class UserStoreImpl implements UserStore { } User user = new User(name, email, accounts); logger.info("Creating user: " + user); - mongoObjectFactory.storeUser(user); + if (mongoObjectFactory != null) { + mongoObjectFactory.storeUser(user); + } users.put(name, user); addToUsersByEmail(user); return user; @@ -114,13 +160,16 @@ public class UserStoreImpl implements UserStore { @Override public void updateUser(User user) { logger.info("Updating user "+user+" in DB"); + users.put(user.getName(), user); removeFromUsersByEmail(user); addToUsersByEmail(user); - mongoObjectFactory.storeUser(user); + if (mongoObjectFactory != null) { + mongoObjectFactory.storeUser(user); + } } @Override - public Collection getUserCollection() { + public Iterable getUsers() { return new ArrayList(users.values()); } @@ -149,7 +198,7 @@ public class UserStoreImpl implements UserStore { } @Override - public Set getRolesFromUser(String username) throws UserManagementException { + public Iterable getRolesFromUser(String username) throws UserManagementException { if (users.get(username) == null) { throw new UserManagementException(UserManagementException.USER_DOES_NOT_EXIST); } @@ -163,7 +212,9 @@ public class UserStoreImpl implements UserStore { throw new UserManagementException(UserManagementException.USER_DOES_NOT_EXIST); } user.addRole(role); - mongoObjectFactory.storeUser(user); + if (mongoObjectFactory != null) { + mongoObjectFactory.storeUser(user); + } } @Override @@ -172,7 +223,40 @@ public class UserStoreImpl implements UserStore { throw new UserManagementException(UserManagementException.USER_DOES_NOT_EXIST); } users.get(name).removeRole(role); - mongoObjectFactory.storeUser(users.get(name)); + if (mongoObjectFactory != null) { + mongoObjectFactory.storeUser(users.get(name)); + } + } + + @Override + public Iterable getPermissionsFromUser(String username) throws UserManagementException { + if (users.get(username) == null) { + throw new UserManagementException(UserManagementException.USER_DOES_NOT_EXIST); + } + return users.get(username).getPermissions(); + } + + @Override + public void addPermissionForUser(String name, String permission) throws UserManagementException { + final User user = users.get(name); + if (user == null) { + throw new UserManagementException(UserManagementException.USER_DOES_NOT_EXIST); + } + user.addPermission(permission); + if (mongoObjectFactory != null) { + mongoObjectFactory.storeUser(user); + } + } + + @Override + public void removePermissionFromUser(String name, String permission) throws UserManagementException { + if (users.get(name) == null) { + throw new UserManagementException(UserManagementException.USER_DOES_NOT_EXIST); + } + users.get(name).removePermission(permission); + if (mongoObjectFactory != null) { + mongoObjectFactory.storeUser(users.get(name)); + } } @Override @@ -181,7 +265,9 @@ public class UserStoreImpl implements UserStore { throw new UserManagementException(UserManagementException.USER_DOES_NOT_EXIST); } logger.info("Deleting user: " + users.get(name).toString()); - mongoObjectFactory.deleteUser(users.get(name)); + if (mongoObjectFactory != null) { + mongoObjectFactory.deleteUser(users.get(name)); + } removeFromUsersByEmail(users.remove(name)); } @@ -200,7 +286,9 @@ public class UserStoreImpl implements UserStore { @Override public void addSetting(String key, Class type) { settingTypes.put(key, type); - mongoObjectFactory.storeSettingTypes(settingTypes); + if (mongoObjectFactory != null) { + mongoObjectFactory.storeSettingTypes(settingTypes); + } } @Override @@ -211,7 +299,9 @@ public class UserStoreImpl implements UserStore { result = false; } else { settings.put(key, setting); - mongoObjectFactory.storeSettings(settings); + if (mongoObjectFactory != null) { + mongoObjectFactory.storeSettings(settings); + } result = true; } return result; @@ -231,7 +321,9 @@ public class UserStoreImpl implements UserStore { } } userMap.put(key, value); - mongoObjectFactory.storePreferences(username, userMap); + if (mongoObjectFactory != null) { + mongoObjectFactory.storePreferences(username, userMap); + } } @Override @@ -239,7 +331,9 @@ public class UserStoreImpl implements UserStore { Map userMap = preferences.get(username); if (userMap != null) { userMap.remove(key); - mongoObjectFactory.storePreferences(username, userMap); + if (mongoObjectFactory != null) { + mongoObjectFactory.storePreferences(username, userMap); + } } } @@ -255,6 +349,18 @@ public class UserStoreImpl implements UserStore { return result; } + @Override + public Map getAllPreferences(String username) { + final Map userPrefs = preferences.get(username); + final Map result; + if (userPrefs == null) { + result = Collections.emptyMap(); + } else { + result = Collections.unmodifiableMap(userPrefs); + } + return result; + } + @Override public Map getAllSettings() { return settings; @@ -264,5 +370,4 @@ public class UserStoreImpl implements UserStore { public Map> getAllSettingTypes() { return settingTypes; } - } diff --git a/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/impl/DomainObjectFactoryImpl.java b/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/impl/DomainObjectFactoryImpl.java index 9f42e95bb6b..147863f9173 100644 --- a/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/impl/DomainObjectFactoryImpl.java +++ b/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/impl/DomainObjectFactoryImpl.java @@ -9,8 +9,6 @@ import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; -import org.apache.shiro.util.SimpleByteSource; - import com.mongodb.BasicDBList; import com.mongodb.BasicDBObject; import com.mongodb.DB; @@ -19,9 +17,9 @@ import com.mongodb.DBObject; import com.sap.sse.security.Social; import com.sap.sse.security.User; import com.sap.sse.security.shared.Account; +import com.sap.sse.security.shared.Account.AccountType; import com.sap.sse.security.shared.SocialUserAccount; import com.sap.sse.security.shared.UsernamePasswordAccount; -import com.sap.sse.security.shared.Account.AccountType; import com.sap.sse.security.userstore.mongodb.DomainObjectFactory; public class DomainObjectFactoryImpl implements DomainObjectFactory { @@ -72,18 +70,28 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { String passwordResetSecret = (String) userDBObject.get(FieldNames.User.PASSWORD_RESET_SECRET.name()); String validationSecret = (String) userDBObject.get(FieldNames.User.VALIDATION_SECRET.name()); Set roles = new HashSet(); + Set permissions = new HashSet(); BasicDBList rolesO = (BasicDBList) userDBObject.get(FieldNames.User.ROLES.name()); - if (rolesO != null){ - for (Object o : rolesO){ + if (rolesO != null) { + for (Object o : rolesO) { roles.add((String) o); } } + BasicDBList permissionsO = (BasicDBList) userDBObject.get(FieldNames.User.PERMISSIONS.name()); + if (permissionsO != null) { + for (Object o : permissionsO) { + permissions.add((String) o); + } + } DBObject accountsMap = (DBObject) userDBObject.get(FieldNames.User.ACCOUNTS.name()); Map accounts = createAccountMapFromdDBObject(accountsMap); User result = new User(name, email, emailValidated==null?false:emailValidated, passwordResetSecret, validationSecret, accounts.values()); for (String role : roles) { result.addRole(role); } + for (String permission : permissions) { + result.addPermission(permission); + } return result; } @@ -103,7 +111,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { case USERNAME_PASSWORD: String name = (String) dbAccount.get(FieldNames.UsernamePassword.NAME.name()); String saltedPassword = (String) dbAccount.get(FieldNames.UsernamePassword.SALTED_PW.name()); - Object salt = new SimpleByteSource((byte[]) dbAccount.get(FieldNames.UsernamePassword.SALT.name())); + byte[] salt = (byte[]) dbAccount.get(FieldNames.UsernamePassword.SALT.name()); return new UsernamePasswordAccount(name, saltedPassword, salt); //TODO [D056866] add other Account-types case SOCIAL_USER: diff --git a/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/impl/FieldNames.java b/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/impl/FieldNames.java index d0c33505fe4..ef41cc62a25 100644 --- a/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/impl/FieldNames.java +++ b/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/impl/FieldNames.java @@ -6,7 +6,7 @@ public class FieldNames { NAME, EMAIL, ACCOUNTS, - ROLES, + ROLES, PERMISSIONS, EMAIL_VALIDATED, PASSWORD_RESET_SECRET, VALIDATION_SECRET; diff --git a/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/impl/MongoObjectFactoryImpl.java b/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/impl/MongoObjectFactoryImpl.java index da9fab70fd7..53e1fadb6d8 100644 --- a/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/impl/MongoObjectFactoryImpl.java +++ b/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/impl/MongoObjectFactoryImpl.java @@ -3,8 +3,6 @@ package com.sap.sse.security.userstore.mongodb.impl; import java.util.Map; import java.util.Map.Entry; -import org.apache.shiro.util.SimpleByteSource; - import com.mongodb.BasicDBList; import com.mongodb.BasicDBObject; import com.mongodb.DB; @@ -27,6 +25,11 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { this.db = db; } + @Override + public DB getDatabase() { + return db; + } + @Override public void storeUser(User user) { DBCollection usersCollection = db.getCollection(CollectionNames.USERS.name()); @@ -40,6 +43,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { dbUser.put(FieldNames.User.VALIDATION_SECRET.name(), user.getValidationSecret()); dbUser.put(FieldNames.User.ACCOUNTS.name(), createAccountMapObject(user.getAllAccounts())); dbUser.put(FieldNames.User.ROLES.name(), user.getRoles()); + dbUser.put(FieldNames.User.PERMISSIONS.name(), user.getPermissions()); usersCollection.update(query, dbUser, /* upsrt */true, /* multi */false, WriteConcern.SAFE); } @@ -66,7 +70,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { UsernamePasswordAccount upa = (UsernamePasswordAccount) a; dbAccount.put(FieldNames.UsernamePassword.NAME.name(), upa.getName()); dbAccount.put(FieldNames.UsernamePassword.SALTED_PW.name(), upa.getSaltedPassword()); - dbAccount.put(FieldNames.UsernamePassword.SALT.name(), ((SimpleByteSource) upa.getSalt()).getBytes()); + dbAccount.put(FieldNames.UsernamePassword.SALT.name(), upa.getSalt()); } if (a instanceof SocialUserAccount) { SocialUserAccount account = (SocialUserAccount) a; diff --git a/java/com.sap.sse.security/.classpath b/java/com.sap.sse.security/.classpath index 1b3ce3e24f7..d47cca9a1e3 100644 --- a/java/com.sap.sse.security/.classpath +++ b/java/com.sap.sse.security/.classpath @@ -1,9 +1,8 @@ - - + diff --git a/java/com.sap.sse.security/.settings/org.eclipse.jdt.core.prefs b/java/com.sap.sse.security/.settings/org.eclipse.jdt.core.prefs index f42de363afa..a698e59674f 100644 --- a/java/com.sap.sse.security/.settings/org.eclipse.jdt.core.prefs +++ b/java/com.sap.sse.security/.settings/org.eclipse.jdt.core.prefs @@ -1,7 +1,12 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 -org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.7 +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/java/com.sap.sse.security/META-INF/MANIFEST.MF b/java/com.sap.sse.security/META-INF/MANIFEST.MF index 36adb23e795..524101252cc 100644 --- a/java/com.sap.sse.security/META-INF/MANIFEST.MF +++ b/java/com.sap.sse.security/META-INF/MANIFEST.MF @@ -5,7 +5,7 @@ Bundle-SymbolicName: com.sap.sse.security Bundle-Version: 1.0.0.qualifier Bundle-Activator: com.sap.sse.security.impl.Activator Bundle-Vendor: SAP -Bundle-RequiredExecutionEnvironment: JavaSE-1.7 +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Import-Package: javax.mail;version="1.4.0", javax.mail.internet;version="1.4.0", javax.ws.rs;version="1.1.1", @@ -27,7 +27,10 @@ Require-Bundle: javax.servlet;bundle-version="2.5.0", org.apache.shiro.web;bundle-version="1.2.2", org.apache.servicemix.bundles.ehcache;bundle-version="2.6.9", org.apache.servicemix.bundles.scribe;bundle-version="1.3.3", - com.sap.sse.common + com.sap.sse.common, + com.sap.sse.replication, + com.sap.sse.operationaltransformation, + com.sap.sse.security.common, + com.sap.sse Web-ContextPath: /security -Export-Package: com.sap.sse.security, - com.sap.sse.security.shared +Export-Package: com.sap.sse.security diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/AbstractUserStoreBasedRealm.java b/java/com.sap.sse.security/src/com/sap/sse/security/AbstractUserStoreBasedRealm.java index a6824756c71..81453ea9614 100755 --- a/java/com.sap.sse.security/src/com/sap/sse/security/AbstractUserStoreBasedRealm.java +++ b/java/com.sap.sse.security/src/com/sap/sse/security/AbstractUserStoreBasedRealm.java @@ -1,5 +1,7 @@ package com.sap.sse.security; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @@ -7,11 +9,17 @@ import java.util.concurrent.FutureTask; import java.util.logging.Level; import java.util.logging.Logger; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authz.AuthorizationInfo; +import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; +import org.apache.shiro.subject.PrincipalCollection; import org.osgi.framework.BundleContext; import org.osgi.util.tracker.ServiceTracker; +import com.sap.sse.common.Util; import com.sap.sse.security.impl.Activator; +import com.sap.sse.security.shared.UserManagementException; public abstract class AbstractUserStoreBasedRealm extends AuthorizingRealm { private static final Logger logger = Logger.getLogger(AbstractUserStoreBasedRealm.class.getName()); @@ -83,4 +91,23 @@ public abstract class AbstractUserStoreBasedRealm extends AuthorizingRealm { } return result; } + + @Override + protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { + final SimpleAuthorizationInfo ai = new SimpleAuthorizationInfo(); + final List roles = new ArrayList<>(); + final List permissions = new ArrayList<>(); + for (Object r : principals) { + String username = r.toString(); + try { + Util.addAll(getUserStore().getRolesFromUser(username), roles); + Util.addAll(getUserStore().getPermissionsFromUser(username), permissions); + } catch (UserManagementException e) { + throw new AuthenticationException(e.getMessage()); + } + } + ai.addRoles(roles); + ai.addStringPermissions(permissions); + return ai; + } } diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/OAuthRealm.java b/java/com.sap.sse.security/src/com/sap/sse/security/OAuthRealm.java index 06908b08e05..ea139f5f7be 100644 --- a/java/com.sap.sse.security/src/com/sap/sse/security/OAuthRealm.java +++ b/java/com.sap.sse.security/src/com/sap/sse/security/OAuthRealm.java @@ -1,7 +1,5 @@ package com.sap.sse.security; -import java.util.ArrayList; -import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.UUID; @@ -12,9 +10,6 @@ import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.SimpleAuthenticationInfo; -import org.apache.shiro.authz.AuthorizationInfo; -import org.apache.shiro.authz.Permission; -import org.apache.shiro.subject.PrincipalCollection; import org.apache.shiro.subject.SimplePrincipalCollection; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; @@ -49,37 +44,6 @@ public class OAuthRealm extends AbstractUserStoreBasedRealm { super(); } - @Override - protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection token) { - AuthorizationInfo info = new AuthorizationInfo() { - private static final long serialVersionUID = 1L; - - @Override - public Collection getStringPermissions() { - return new ArrayList(); - } - - @Override - public Collection getRoles() { - ArrayList roles = new ArrayList<>(); - return roles; - } - - @Override - public Collection getObjectPermissions() { - ArrayList permissions = new ArrayList<>(); - permissions.add(new Permission() { - @Override - public boolean implies(Permission arg0) { - return false; - } - }); - return permissions; - } - }; - return info; - } - @Override public boolean supports(AuthenticationToken token) { if (token == null) diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/SecurityService.java b/java/com.sap.sse.security/src/com/sap/sse/security/SecurityService.java index cd9dd874888..b3840233f21 100644 --- a/java/com.sap.sse.security/src/com/sap/sse/security/SecurityService.java +++ b/java/com.sap.sse.security/src/com/sap/sse/security/SecurityService.java @@ -1,8 +1,6 @@ package com.sap.sse.security; -import java.util.Collection; import java.util.Map; -import java.util.Set; import java.util.UUID; import javax.servlet.ServletContext; @@ -10,16 +8,19 @@ import javax.servlet.ServletContext; import org.apache.shiro.cache.CacheManager; import org.apache.shiro.mgt.SecurityManager; +import com.sap.sse.replication.impl.ReplicableWithObjectInputStream; +import com.sap.sse.security.impl.ReplicableSecurityService; +import com.sap.sse.security.operations.SecurityOperation; import com.sap.sse.security.shared.DefaultRoles; import com.sap.sse.security.shared.MailException; import com.sap.sse.security.shared.SocialUserAccount; import com.sap.sse.security.shared.UserManagementException; -public interface SecurityService { +public interface SecurityService extends ReplicableWithObjectInputStream> { SecurityManager getSecurityManager(); - Collection getUserList(); + Iterable getUserList(); User getUserByName(String username); @@ -51,11 +52,17 @@ public interface SecurityService { void deleteUser(String username) throws UserManagementException; - Set getRolesFromUser(String username) throws UserManagementException; + Iterable getRolesFromUser(String username) throws UserManagementException; - void addRoleForUser(String username, String role) throws UserManagementException; + void addRoleForUser(String username, String role); - void removeRoleFromUser(String username, String role) throws UserManagementException; + void removeRoleFromUser(String username, String role); + + Iterable getPermissionsFromUser(String username) throws UserManagementException; + + void removePermissionFromUser(String username, String permissionToRemove); + + void addPermissionForUser(String username, String permissionToAdd); /** * Registers a settings key together with its type. Calling this method is necessary for {@link #setSetting(String, Object)} diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/SecurityWebSessionManager.java b/java/com.sap.sse.security/src/com/sap/sse/security/SecurityWebSessionManager.java index b10b8f84e48..bffb9043927 100644 --- a/java/com.sap.sse.security/src/com/sap/sse/security/SecurityWebSessionManager.java +++ b/java/com.sap.sse.security/src/com/sap/sse/security/SecurityWebSessionManager.java @@ -1,11 +1,69 @@ package com.sap.sse.security; +import java.util.WeakHashMap; + +import org.apache.shiro.session.InvalidSessionException; +import org.apache.shiro.session.Session; +import org.apache.shiro.session.SessionException; +import org.apache.shiro.session.UnknownSessionException; +import org.apache.shiro.session.mgt.SessionKey; import org.apache.shiro.web.servlet.Cookie; import org.apache.shiro.web.session.mgt.DefaultWebSessionManager; +import com.sap.sse.common.Duration; +import com.sap.sse.common.impl.MillisecondsDurationImpl; +import com.sap.sse.common.impl.MillisecondsTimePoint; +import com.sap.sse.util.TimerWithRunnable; + +/** + * Uses the {@link Cookie#ROOT_PATH} for the session ID cookie and delays the {@link #onChange(Session) onChange} + * updates for calls to {@link #touch(SessionKey)} to avoid flooding the replication. It guarantees to notify the + * {@link #touch(SessionKey)}-induced change at the latest after half the {@link Session#getTimeout() session expiration + * interval}. + * + * @author Axel Uhl (D043530) + * + */ public class SecurityWebSessionManager extends DefaultWebSessionManager { + private static final TimerWithRunnable timer = new TimerWithRunnable("Timer delaying Session.touch() onChange(s) notifications", /* isDaemon */ true); + private static final Duration MAX_DURATION_ASSUMED_FOR_MESSAGE_DELIVERY = Duration.ONE_SECOND.times(30); + + private static final WeakHashMap sessionsAlreadyScheduledForOnChange = new WeakHashMap<>(); + public SecurityWebSessionManager() { super(); getSessionIdCookie().setPath(Cookie.ROOT_PATH); } + + @Override + public void touch(SessionKey key) throws InvalidSessionException { + Session s = lookupRequiredSession(key); + s.touch(); + triggerOnChangeLatestInHalfTimeoutPeriod(s); + } + + private void triggerOnChangeLatestInHalfTimeoutPeriod(Session s) { + Duration sendDurationLatestIn = new MillisecondsDurationImpl(s.getTimeout()).minus(MAX_DURATION_ASSUMED_FOR_MESSAGE_DELIVERY); + if (!sessionsAlreadyScheduledForOnChange.containsKey(s)) { + sessionsAlreadyScheduledForOnChange.put(s, null); + timer.schedule(()->{ onChange(s); sessionsAlreadyScheduledForOnChange.remove(s); }, + MillisecondsTimePoint.now().plus(sendDurationLatestIn).asDate()); + } + } + + private Session lookupSession(SessionKey key) throws SessionException { + if (key == null) { + throw new NullPointerException("SessionKey argument cannot be null."); + } + return doGetSession(key); + } + + private Session lookupRequiredSession(SessionKey key) throws SessionException { + Session session = lookupSession(key); + if (session == null) { + String msg = "Unable to locate required Session instance based on SessionKey [" + key + "]."; + throw new UnknownSessionException(msg); + } + return session; + } } diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/SessionCacheManager.java b/java/com.sap.sse.security/src/com/sap/sse/security/SessionCacheManager.java index 824965d51f1..40a933a83e8 100644 --- a/java/com.sap.sse.security/src/com/sap/sse/security/SessionCacheManager.java +++ b/java/com.sap.sse.security/src/com/sap/sse/security/SessionCacheManager.java @@ -3,12 +3,16 @@ package com.sap.sse.security; import org.apache.shiro.cache.Cache; import org.apache.shiro.cache.CacheException; import org.apache.shiro.cache.CacheManager; +import org.apache.shiro.mgt.SecurityManager; import com.sap.sse.security.impl.Activator; +import com.sap.sse.security.impl.ReplicableSecurityService; /** - * Obtains the singleton cache manager instance from the singleton {@link SecurityService} instance. Using an instance - * of this class as the cache manager in your Shiro configuration as in + * A {@link CacheManager} implementation that can be used in a shiro.ini configuration for a + * {@link SecurityManager}. {@link SecurityService#getCacheManager() Obtains} the singleton cache manager instance from + * the singleton {@link SecurityService} instance. Using an instance of this class as the cache manager in your + * Shiro configuration as in * *

  *      sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO
@@ -22,16 +26,19 @@ import com.sap.sse.security.impl.Activator;
  * 
  * @see SecurityService#getCacheManager()
  * 
- * @author Benjamin Ebling
+ * @author Benjamin Ebling, Axel Uhl
  *
  */
 public class SessionCacheManager implements CacheManager {
     @Override
     public  Cache getCache(String name) throws CacheException {
-        final SecurityService securityService = Activator.getSecurityService();
+        final ReplicableSecurityService securityService = (ReplicableSecurityService) Activator.getSecurityService();
+        final Cache result;
         if (securityService == null) {
-            return null;
+            result = null;
+        } else {
+            result = securityService.getCacheManager().getCache(name);
         }
-        return securityService.getCacheManager().getCache(name);
+        return result;
     }
 }
diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/SimpleSaltedAuthenticationInfo.java b/java/com.sap.sse.security/src/com/sap/sse/security/SimpleSaltedAuthenticationInfo.java
index 50b0f3ddfad..a8b8fff5a0f 100644
--- a/java/com.sap.sse.security/src/com/sap/sse/security/SimpleSaltedAuthenticationInfo.java
+++ b/java/com.sap.sse.security/src/com/sap/sse/security/SimpleSaltedAuthenticationInfo.java
@@ -4,18 +4,15 @@ import org.apache.shiro.authc.SaltedAuthenticationInfo;
 import org.apache.shiro.subject.PrincipalCollection;
 import org.apache.shiro.subject.SimplePrincipalCollection;
 import org.apache.shiro.util.ByteSource;
+import org.apache.shiro.util.SimpleByteSource;
 
 public class SimpleSaltedAuthenticationInfo implements SaltedAuthenticationInfo {
-
-    /**
-     * 
-     */
     private static final long serialVersionUID = -8423637970683173260L;
     private String username;
     private String password;
-    private ByteSource salt;
+    private byte[] salt;
 
-    public SimpleSaltedAuthenticationInfo(String username, String password, ByteSource salt) {
+    public SimpleSaltedAuthenticationInfo(String username, String password, byte[] salt) {
         this.username = username;
         this.password = password;
         this.salt = salt;
@@ -34,7 +31,7 @@ public class SimpleSaltedAuthenticationInfo implements SaltedAuthenticationInfo
 
     @Override
     public ByteSource getCredentialsSalt() {
-        return  salt; 
+        return new SimpleByteSource(salt); 
     }
 
 }
diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/User.java b/java/com.sap.sse.security/src/com/sap/sse/security/User.java
index 1c58c276849..147b7b729a1 100644
--- a/java/com.sap.sse.security/src/com/sap/sse/security/User.java
+++ b/java/com.sap.sse.security/src/com/sap/sse/security/User.java
@@ -1,5 +1,6 @@
 package com.sap.sse.security;
 
+import java.io.Serializable;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
@@ -10,10 +11,13 @@ import java.util.Set;
 
 import org.apache.shiro.crypto.hash.Sha256Hash;
 
+import com.sap.sse.common.Named;
+import com.sap.sse.common.WithID;
 import com.sap.sse.security.shared.Account;
 import com.sap.sse.security.shared.Account.AccountType;
 
-public class User {
+public class User implements Named, WithID {
+    private static final long serialVersionUID = 1788215575606546042L;
 
     private String name;
 
@@ -39,6 +43,7 @@ public class User {
     private boolean emailValidated;
 
     private final Set roles;
+    private final Set permissions;
     private final Map accounts;
 
     public User(String name, String email, Account... accounts) {
@@ -54,6 +59,7 @@ public class User {
         super();
         this.name = name;
         this.roles = new HashSet<>();
+        this.permissions = new HashSet<>();
         this.email = email;
         this.passwordResetSecret = passwordResetSecret;
         this.validationSecret = validationSecret;
@@ -64,6 +70,14 @@ public class User {
         }
     }
 
+    /**
+     * For the time being, the user {@link #getName() name} is used as ID
+     */
+    @Override
+    public Serializable getId() {
+        return getName();
+    }
+
     public String getName() {
         return name;
     }
@@ -72,7 +86,7 @@ public class User {
         this.name = name;
     }
 
-    public Set getRoles() {
+    public Iterable getRoles() {
         return roles;
     }
 
@@ -88,6 +102,22 @@ public class User {
         roles.remove(role);
     }
 
+    public Iterable getPermissions() {
+        return permissions;
+    }
+
+    public void addPermission(String permission) {
+        permissions.add(permission);
+    }
+    
+    public boolean hasPermission(String permission) {
+        return permissions.contains(permission);
+    }
+    
+    public void removePermission(String permission) {
+        permissions.remove(permission);
+    }
+    
     public Account getAccount(AccountType type) {
         return accounts.get(type);
     }
diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/UserStore.java b/java/com.sap.sse.security/src/com/sap/sse/security/UserStore.java
index 2d32efa5d85..4dd17e4947f 100644
--- a/java/com.sap.sse.security/src/com/sap/sse/security/UserStore.java
+++ b/java/com.sap.sse.security/src/com/sap/sse/security/UserStore.java
@@ -1,18 +1,14 @@
 package com.sap.sse.security;
 
-import java.util.Collection;
 import java.util.Map;
-import java.util.Set;
 import java.util.UUID;
 
+import com.sap.sse.common.Named;
 import com.sap.sse.security.shared.Account;
 import com.sap.sse.security.shared.UserManagementException;
 
-public interface UserStore {
-
-    String getName();
-
-    Collection getUserCollection();
+public interface UserStore extends Named {
+    Iterable getUsers();
 
     User getUserByName(String name);
 
@@ -22,12 +18,18 @@ public interface UserStore {
 
     void updateUser(User user);
 
-    Set getRolesFromUser(String username) throws UserManagementException;
+    Iterable getRolesFromUser(String username) throws UserManagementException;
 
     void addRoleForUser(String name, String role) throws UserManagementException;
 
     void removeRoleFromUser(String name, String role) throws UserManagementException;
 
+    Iterable getPermissionsFromUser(String username) throws UserManagementException;
+
+    void removePermissionFromUser(String name, String permission) throws UserManagementException;
+
+    void addPermissionForUser(String name, String permission) throws UserManagementException;
+
     void deleteUser(String name) throws UserManagementException;
 
     /**
@@ -40,6 +42,11 @@ public interface UserStore {
     
     void setPreference(String username, String key, String value);
     
+    /**
+     * Always returns a valid map which may be empty.
+     */
+    Map getAllPreferences(String username);
+    
     void unsetPreference(String username, String key);
 
     String getPreference(String username, String key);
@@ -64,7 +71,20 @@ public interface UserStore {
      T getSetting(String key, Class clazz);
 
     Map getAllSettings();
-
+    
     Map> getAllSettingTypes();
 
+    /**
+     * Removes all users and all their preferences and all settings from this store's in-memory representation.
+     * For safety reasons and because a replica's DB state is undefined anyhow, leaves persistent content in place.
+     * Use with due care.
+     */
+    void clear();
+
+    /**
+     * Replaces all existing contents by those provided by the newUserStore. This has no impact on the persistent
+     * representation of this store and is meant for use on a replica only; the replica's database state is undefined.
+     */
+    void replaceContentsFrom(UserStore newUserStore);
+
 }
diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/UsernamePasswordRealm.java b/java/com.sap.sse.security/src/com/sap/sse/security/UsernamePasswordRealm.java
index 3d623b30c7a..722cdd52e16 100644
--- a/java/com.sap.sse.security/src/com/sap/sse/security/UsernamePasswordRealm.java
+++ b/java/com.sap.sse.security/src/com/sap/sse/security/UsernamePasswordRealm.java
@@ -1,21 +1,13 @@
 package com.sap.sse.security;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import org.apache.shiro.authc.AuthenticationException;
 import org.apache.shiro.authc.AuthenticationInfo;
 import org.apache.shiro.authc.AuthenticationToken;
 import org.apache.shiro.authc.SaltedAuthenticationInfo;
 import org.apache.shiro.authc.UsernamePasswordToken;
-import org.apache.shiro.authz.AuthorizationInfo;
-import org.apache.shiro.authz.SimpleAuthorizationInfo;
-import org.apache.shiro.subject.PrincipalCollection;
-import org.apache.shiro.util.ByteSource;
 
-import com.sap.sse.security.shared.UserManagementException;
-import com.sap.sse.security.shared.UsernamePasswordAccount;
 import com.sap.sse.security.shared.Account.AccountType;
+import com.sap.sse.security.shared.UsernamePasswordAccount;
 
 public class UsernamePasswordRealm extends AbstractUserStoreBasedRealm {
     
@@ -36,22 +28,6 @@ public class UsernamePasswordRealm extends AbstractUserStoreBasedRealm {
         return result;
     }
 
-    @Override
-    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
-        final SimpleAuthorizationInfo ai = new SimpleAuthorizationInfo();
-        final List roles = new ArrayList<>();
-        for (Object r : principals.asList()){
-            String username = r.toString();
-            try {
-                roles.addAll(getUserStore().getRolesFromUser(username));
-            } catch (UserManagementException e) {
-               throw new AuthenticationException(e.getMessage());
-            }
-        }
-        ai.addRoles(roles);
-        return ai;
-    }
-
     @Override
     protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
         UsernamePasswordToken userPassToken = (UsernamePasswordToken) token;
@@ -63,7 +39,7 @@ public class UsernamePasswordRealm extends AbstractUserStoreBasedRealm {
 
         // read password hash and salt from db
         String saltedPassword = null;
-        ByteSource salt = null;
+        byte[] salt = null;
         User user = getUserStore().getUserByName(username);
         if (user == null){
             return null;
@@ -73,7 +49,7 @@ public class UsernamePasswordRealm extends AbstractUserStoreBasedRealm {
             return null;
         }
         saltedPassword = upa.getSaltedPassword();
-        salt = (ByteSource) upa.getSalt();
+        salt = upa.getSalt();
         if (saltedPassword == null) {
             return null;
         }
diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/impl/Activator.java b/java/com.sap.sse.security/src/com/sap/sse/security/impl/Activator.java
index 0ccbef8e773..f8c54dfdbe5 100644
--- a/java/com.sap.sse.security/src/com/sap/sse/security/impl/Activator.java
+++ b/java/com.sap.sse.security/src/com/sap/sse/security/impl/Activator.java
@@ -3,6 +3,8 @@ package com.sap.sse.security.impl;
 import java.io.File;
 import java.io.FileReader;
 import java.io.IOException;
+import java.util.Dictionary;
+import java.util.Hashtable;
 import java.util.Properties;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -12,10 +14,11 @@ import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.util.tracker.ServiceTracker;
 
+import com.sap.sse.replication.Replicable;
 import com.sap.sse.security.SecurityService;
-import com.sap.sse.security.SecurityServiceImpl;
 import com.sap.sse.security.UserStore;
 import com.sap.sse.security.UsernamePasswordRealm;
+import com.sap.sse.util.ClearStateTestSupport;
 
 public class Activator implements BundleActivator {
     private static final Logger logger = Logger.getLogger(Activator.class.getName());
@@ -75,6 +78,10 @@ public class Activator implements BundleActivator {
         securityService = new SecurityServiceImpl(store, mailProperties);
         registration = context.registerService(SecurityService.class.getName(),
                 securityService, null);
+        final Dictionary replicableServiceProperties = new Hashtable<>();
+        replicableServiceProperties.put(Replicable.OSGi_Service_Registry_ID_Property_Name, securityService.getId().toString());
+        context.registerService(Replicable.class.getName(), securityService, replicableServiceProperties);
+        context.registerService(ClearStateTestSupport.class.getName(), securityService, null);
         Logger.getLogger(Activator.class.getName()).info("Security Service registered.");
     }
 
diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/impl/ObjectInputStreamResolvingAgainstSecurityCache.java b/java/com.sap.sse.security/src/com/sap/sse/security/impl/ObjectInputStreamResolvingAgainstSecurityCache.java
new file mode 100755
index 00000000000..3e2f01eac87
--- /dev/null
+++ b/java/com.sap.sse.security/src/com/sap/sse/security/impl/ObjectInputStreamResolvingAgainstSecurityCache.java
@@ -0,0 +1,13 @@
+package com.sap.sse.security.impl;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import com.sap.sse.replication.impl.ObjectInputStreamResolvingAgainstCache;
+import com.sap.sse.security.UserStore;
+
+public class ObjectInputStreamResolvingAgainstSecurityCache extends ObjectInputStreamResolvingAgainstCache {
+    ObjectInputStreamResolvingAgainstSecurityCache(InputStream in, UserStore cache) throws IOException {
+        super(in, cache);
+    }
+}
diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/impl/ReplicableSecurityService.java b/java/com.sap.sse.security/src/com/sap/sse/security/impl/ReplicableSecurityService.java
new file mode 100755
index 00000000000..e248a93c404
--- /dev/null
+++ b/java/com.sap.sse.security/src/com/sap/sse/security/impl/ReplicableSecurityService.java
@@ -0,0 +1,37 @@
+package com.sap.sse.security.impl;
+
+import com.sap.sse.security.SecurityService;
+import com.sap.sse.security.User;
+import com.sap.sse.security.shared.UserManagementException;
+
+/**
+ * Publishes those methods of {@link SecurityServiceImpl} that are required by operations implemented as lambda
+ * expressions to fulfill their tasks. These operations should not be invoked by external service clients.
+ * {@link SecurityService} is the one registered with the OSGi registry and thus the publicly-visible
+ * interface.
+ * 
+ * @author Axel Uhl (D043530)
+ *
+ */
+public interface ReplicableSecurityService extends SecurityService {
+    Void internalStoreUser(User user);
+
+    Void internalSetPreference(String username, String key, String value);
+
+    Void internalUnsetPreference(String username, String key);
+
+    Boolean internalSetSetting(String key, Object setting);
+
+    Void internalAddSetting(String key, Class clazz);
+
+    Void internalAddRoleForUser(String username, String role) throws UserManagementException;
+
+    Void internalRemoveRoleFromUser(String username, String role) throws UserManagementException;
+
+    Void internalAddPermissionForUser(String username, String permissionToAdd) throws UserManagementException;
+
+    Void internalRemovePermissionForUser(String username, String permissionToRemove) throws UserManagementException;
+
+    Void internalDeleteUser(String username) throws UserManagementException;
+
+}
diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/impl/ReplicatingCache.java b/java/com.sap.sse.security/src/com/sap/sse/security/impl/ReplicatingCache.java
new file mode 100755
index 00000000000..9ae7b7bf314
--- /dev/null
+++ b/java/com.sap.sse.security/src/com/sap/sse/security/impl/ReplicatingCache.java
@@ -0,0 +1,117 @@
+package com.sap.sse.security.impl;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.util.Collection;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.apache.shiro.cache.Cache;
+import org.apache.shiro.cache.CacheException;
+import org.apache.shiro.session.Session;
+
+import com.sap.sse.common.Named;
+
+/**
+ * A {@link Cache}s whose modifying operations are replicated. This works because by intercepting the writing operations
+ * and running them as a replicable operation on the {@link ReplicableSecurityService}.
+ * 
+ * @author Axel Uhl (D043530)
+ *
+ */
+public class ReplicatingCache implements Cache, Named {
+    private static final Logger logger = Logger.getLogger(ReplicatingCache.class.getName());
+    private static final long serialVersionUID = 6628512191363526330L;
+    private transient ReplicableSecurityService securityService;
+    private final String name;
+    private final ConcurrentHashMap cache;
+
+    public ReplicatingCache(ReplicableSecurityService securityService, String name) {
+        super();
+        this.securityService = securityService;
+        this.name = name;
+        this.cache = new ConcurrentHashMap();
+    }
+
+    private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException {
+        ois.defaultReadObject();
+        securityService = (ReplicableSecurityService) Activator.getSecurityService();
+    }
+    
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public V get(K key) throws CacheException {
+        if (logger.isLoggable(Level.FINER)) {
+            logger.finer("get("+key+") on "+name+"@"+System.identityHashCode(this)+"="+cache.get(key));
+        }
+        return cache.get(key);
+    }
+
+    @Override
+    public V put(K key, V value) throws CacheException {
+        if (logger.isLoggable(Level.FINER)) {
+            logger.finer("put("+key+", "+value+") into cache "+name+"@"+System.identityHashCode(this));
+            if (value instanceof Session) {
+                Session session = (Session) value;
+                logSession(session);
+            }
+        }
+        V result = cache.put(key, value);
+        final String myName = name;
+        securityService.replicate(s->
+            s.getCacheManager().getCache(myName).put(key, value));
+        return result;
+    }
+
+    private void logSession(Session session) {
+        final StringBuilder sb = new StringBuilder();
+        for (Object key : session.getAttributeKeys()) {
+            sb.append("  ");
+            sb.append(key);
+            sb.append("=");
+            sb.append(session.getAttribute(key));
+            sb.append("\n");
+        }
+        logger.finer("Session:\n"+sb.toString());
+        
+    }
+
+    @Override
+    public V remove(K key) throws CacheException {
+        V result = cache.remove(key);
+        final String myName = name;
+        securityService.replicate(s->
+            s.getCacheManager().getCache(myName).remove(key));
+        return result;
+    }
+
+    @Override
+    public void clear() throws CacheException {
+        cache.clear();
+        final String myName = name;
+        securityService.replicate(s->{ 
+            s.getCacheManager().getCache(myName).clear(); return null;
+        });
+    }
+
+    @Override
+    public int size() {
+        return cache.size();
+    }
+
+    @Override
+    public Set keys() {
+        return cache.keySet();
+    }
+
+    @Override
+    public Collection values() {
+        return cache.values();
+    }
+}
diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/impl/ReplicatingCacheManager.java b/java/com.sap.sse.security/src/com/sap/sse/security/impl/ReplicatingCacheManager.java
new file mode 100755
index 00000000000..d73506196ed
--- /dev/null
+++ b/java/com.sap.sse.security/src/com/sap/sse/security/impl/ReplicatingCacheManager.java
@@ -0,0 +1,70 @@
+package com.sap.sse.security.impl;
+
+import java.io.Serializable;
+import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.shiro.cache.Cache;
+import org.apache.shiro.cache.CacheException;
+import org.apache.shiro.cache.CacheManager;
+
+/**
+ * Wraps a {@link CacheManager} and makes all modifying operations replicate their changes. This happens by wrapping
+ * all {@link Cache}s by an object that intercepts the writing operations, producing replicating operations.
+ * 
+ * @author Axel Uhl (D043530)
+ *
+ */
+public class ReplicatingCacheManager implements CacheManager, Serializable {
+    private static final long serialVersionUID = -8035346668009900228L;
+    private ConcurrentHashMap> caches;
+    
+    public ReplicatingCacheManager() {
+        this.caches = new ConcurrentHashMap<>();
+    }
+    
+    @Override
+    public  Cache getCache(String name) throws CacheException {
+        final ReplicableSecurityService securityService = (ReplicableSecurityService) Activator.getSecurityService();
+        if (securityService == null) {
+            return null;
+        }
+        @SuppressWarnings("unchecked")
+        ReplicatingCache cache = (ReplicatingCache) this.caches.get(name);
+        if (cache == null) {
+            cache = new ReplicatingCache(securityService, name);
+            caches.put(name, cache);
+        }
+        return cache;
+    }
+    
+    public void replaceContentsFrom(ReplicatingCacheManager other) {
+        for (Entry> i : other.caches.entrySet()) {
+            replaceOrUpdate(i.getKey(), i.getValue());
+        }
+    }
+
+    private  void replaceOrUpdate(String name, ReplicatingCache otherCache) {
+        @SuppressWarnings("unchecked")
+        ReplicatingCache castCache = (ReplicatingCache) this.caches.get(name);
+        if (castCache == null) {
+            this.caches.put(name, otherCache);
+        } else {
+            putAll(castCache, otherCache);
+        }
+    }
+
+    private  void putAll(final ReplicatingCache from, ReplicatingCache into) {
+        from.clear();
+        for (K k:into.keys()) {
+            from.put(k, into.get(k));
+        }
+    }
+    
+    /**
+     * For test purposes; clears all state held by this cache manager.
+     */
+    public void clear() {
+        this.caches.clear();
+    }
+}
diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/SecurityServiceImpl.java b/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java
similarity index 71%
rename from java/com.sap.sse.security/src/com/sap/sse/security/SecurityServiceImpl.java
rename to java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java
index 34f8d5b8952..b63f062e1db 100644
--- a/java/com.sap.sse.security/src/com/sap/sse/security/SecurityServiceImpl.java
+++ b/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java
@@ -1,15 +1,22 @@
-package com.sap.sse.security;
+package com.sap.sse.security.impl;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
 import java.io.UnsupportedEncodingException;
+import java.net.MalformedURLException;
 import java.net.URLEncoder;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Properties;
 import java.util.Set;
 import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -31,12 +38,12 @@ import org.apache.shiro.authc.LockedAccountException;
 import org.apache.shiro.authc.UnknownAccountException;
 import org.apache.shiro.authc.UsernamePasswordToken;
 import org.apache.shiro.cache.CacheManager;
-import org.apache.shiro.cache.ehcache.EhCacheManager;
 import org.apache.shiro.config.Ini;
 import org.apache.shiro.config.Ini.Section;
 import org.apache.shiro.crypto.RandomNumberGenerator;
 import org.apache.shiro.crypto.SecureRandomNumberGenerator;
 import org.apache.shiro.crypto.hash.Sha256Hash;
+import org.apache.shiro.mgt.CachingSecurityManager;
 import org.apache.shiro.mgt.SecurityManager;
 import org.apache.shiro.subject.Subject;
 import org.apache.shiro.util.Factory;
@@ -64,23 +71,56 @@ import org.scribe.oauth.OAuthService;
 
 import com.google.gwt.user.server.rpc.RemoteServiceServlet;
 import com.sap.sse.common.Util;
+import com.sap.sse.replication.OperationExecutionListener;
+import com.sap.sse.replication.OperationWithResult;
+import com.sap.sse.replication.ReplicationMasterDescriptor;
+import com.sap.sse.replication.impl.OperationWithResultWithIdWrapper;
+import com.sap.sse.security.ClientUtils;
+import com.sap.sse.security.Credential;
+import com.sap.sse.security.GithubApi;
+import com.sap.sse.security.InstagramApi;
+import com.sap.sse.security.OAuthRealm;
+import com.sap.sse.security.OAuthToken;
+import com.sap.sse.security.SessionCacheManager;
+import com.sap.sse.security.SessionUtils;
+import com.sap.sse.security.Social;
+import com.sap.sse.security.SocialSettingsKeys;
+import com.sap.sse.security.User;
+import com.sap.sse.security.UserStore;
 import com.sap.sse.security.shared.Account.AccountType;
 import com.sap.sse.security.shared.DefaultRoles;
 import com.sap.sse.security.shared.MailException;
 import com.sap.sse.security.shared.SocialUserAccount;
 import com.sap.sse.security.shared.UserManagementException;
 import com.sap.sse.security.shared.UsernamePasswordAccount;
+import com.sap.sse.util.ClearStateTestSupport;
 
-public class SecurityServiceImpl extends RemoteServiceServlet implements SecurityService {
+public class SecurityServiceImpl extends RemoteServiceServlet implements ReplicableSecurityService, ClearStateTestSupport {
 
     private static final long serialVersionUID = -3490163216601311858L;
 
     private static final Logger logger = Logger.getLogger(SecurityServiceImpl.class.getName());
 
-    private SecurityManager securityManager;
-    private final CacheManager cacheManager = new EhCacheManager();
-    private final UserStore store;
+    private CachingSecurityManager securityManager;
+    
+    /**
+     * A cache manager that the {@link SessionCacheManager} delegates to. This way, multiple Shiro configurations can
+     * share the cache manager provided as a singleton within this bundle instance. The cache manager is replicating,
+     * forwarding changes to the caches to all replicas registered.
+     */
+    private final ReplicatingCacheManager cacheManager;
+    
+    private UserStore store;
     private final Properties mailProperties;
+    private final ConcurrentHashMap, OperationExecutionListener> operationExecutionListeners;
+
+    /**
+     * The master from which this replicable is currently replicating, or null if this replicable is not currently
+     * replicated from any master.
+     */
+    private ReplicationMasterDescriptor replicatingFromMaster;
+    
+    private Set> operationsSentToMasterForReplication;
     
     private static Ini shiroConfiguration;
     static {
@@ -94,18 +134,13 @@ public class SecurityServiceImpl extends RemoteServiceServlet implements Securit
     public SecurityServiceImpl(UserStore store, Properties mailProperties) {
         assert mailProperties != null;
         logger.info("Initializing Security Service with user store " + store+" and mail properties "+mailProperties);
+        operationsSentToMasterForReplication = new HashSet<>();
+        cacheManager = new ReplicatingCacheManager();
+        this.operationExecutionListeners = new ConcurrentHashMap<>();
         this.store = store;
         this.mailProperties = mailProperties;
         // Create default users if no users exist yet.
-        if (store.getUserCollection().isEmpty()) {
-            try {
-                logger.info("No users found, creating default user \"admin\" with password \"admin\"");
-                createSimpleUser("admin", "nobody@sapsailing.com", "admin", /* validationBaseURL */ null);
-                addRoleForUser("admin", DefaultRoles.ADMIN.getRolename());
-            } catch (UserManagementException | MailException e) {
-                logger.log(Level.SEVERE, "Exception while creating default admin user", e);
-            }
-        }
+        initEmptyStore();
         Factory factory = new WebIniSecurityManagerFactory(shiroConfiguration);
         logger.info("Loaded shiro.ini file from: classpath:shiro.ini");
         StringBuilder logMessage = new StringBuilder("[urls] section from Shiro configuration:");
@@ -120,12 +155,28 @@ public class SecurityServiceImpl extends RemoteServiceServlet implements Securit
         }
         logger.info(logMessage.toString());
         System.setProperty("java.net.useSystemProxies", "true");
-        SecurityManager securityManager = factory.getInstance();
+        CachingSecurityManager securityManager = (CachingSecurityManager) factory.getInstance();
         logger.info("Created: " + securityManager);
         SecurityUtils.setSecurityManager(securityManager);
         this.securityManager = securityManager;
     }
 
+    /**
+     * Creates a default "admin" user with initial password "admin" and initial role "admin" if the user store
+     * is empty.
+     */
+    private void initEmptyStore() {
+        if (Util.isEmpty(store.getUsers())) {
+            try {
+                logger.info("No users found, creating default user \"admin\" with password \"admin\"");
+                createSimpleUser("admin", "nobody@sapsailing.com", "admin", /* validationBaseURL */ null);
+                addRoleForUser("admin", DefaultRoles.ADMIN.getRolename());
+            } catch (UserManagementException | MailException e) {
+                logger.log(Level.SEVERE, "Exception while creating default admin user", e);
+            }
+        }
+    }
+
     private class SMTPAuthenticator extends javax.mail.Authenticator {
         public PasswordAuthentication getPasswordAuthentication() {
            String username = mailProperties.getProperty("mail.smtp.user");
@@ -136,32 +187,39 @@ public class SecurityServiceImpl extends RemoteServiceServlet implements Securit
 
     @Override
     public void sendMail(String username, String subject, String body) throws MailException {
-        final User user = getUserByName(username);
-        if (user != null) {
-            final String toAddress = user.getEmail();
-            if (toAddress != null) {
-                Session session = Session.getInstance(this.mailProperties, new SMTPAuthenticator());
-                MimeMessage msg = new MimeMessage(session);
-                try {
-                    msg.setFrom(new InternetAddress(mailProperties.getProperty("mail.from", "root@sapsailing.com")));
-                    msg.setSubject(subject);
-                    msg.setContent(body, "text/plain");
-                    msg.addRecipient(RecipientType.TO, new InternetAddress(toAddress.trim()));
-                    Transport ts = session.getTransport();
-                    ts.connect();
-                    ts.sendMessage(msg, msg.getRecipients(RecipientType.TO));
-                    ts.close();
-                    logger.info("mail sent to user "+username+" with e-mail address "+toAddress+" with subject "+subject);
-                } catch (MessagingException e) {
-                    logger.log(Level.SEVERE, "Error trying to send mail to user "+username+" with e-mail address "+toAddress, e);
-                    throw new MailException(e.getMessage());
+        if (this.mailProperties != null && this.mailProperties.containsKey("mail.transport.protocol")) {
+            final User user = getUserByName(username);
+            if (user != null) {
+                final String toAddress = user.getEmail();
+                if (toAddress != null) {
+                    Session session = Session.getInstance(this.mailProperties, new SMTPAuthenticator());
+                    MimeMessage msg = new MimeMessage(session);
+                    try {
+                        msg.setFrom(new InternetAddress(mailProperties.getProperty("mail.from", "root@sapsailing.com")));
+                        msg.setSubject(subject);
+                        msg.setContent(body, "text/plain");
+                        msg.addRecipient(RecipientType.TO, new InternetAddress(toAddress.trim()));
+                        Transport ts = session.getTransport();
+                        ts.connect();
+                        ts.sendMessage(msg, msg.getRecipients(RecipientType.TO));
+                        ts.close();
+                        logger.info("mail sent to user " + username + " with e-mail address " + toAddress
+                                + " with subject " + subject);
+                    } catch (MessagingException e) {
+                        logger.log(Level.SEVERE, "Error trying to send mail to user " + username
+                                + " with e-mail address " + toAddress, e);
+                        throw new MailException(e.getMessage());
+                    }
                 }
             }
+        } else {
+            logger.warning("No mail properties provided. Cannot send e-mail about "+subject+" to user "+username+
+                    ". This could also mean that this is running on a replica server in which case this is perfectly fine.");
         }
     }
     
     @Override
-    public void resetPassword(final String username, String baseURL) throws UserManagementException, MailException {
+    public void resetPassword(final String username, String passwordResetBaseURL) throws UserManagementException, MailException {
         final User user = store.getUserByName(username);
         if (user == null) {
             throw new UserManagementException(UserManagementException.USER_DOES_NOT_EXIST);
@@ -170,13 +228,13 @@ public class SecurityServiceImpl extends RemoteServiceServlet implements Securit
             throw new UserManagementException(UserManagementException.CANNOT_RESET_PASSWORD_WITHOUT_VALIDATED_EMAIL);
         }
         final String passwordResetSecret = user.startPasswordReset();
-        store.updateUser(user); // durably storing the password reset secret
+        apply(s->s.internalStoreUser(user)); // durably storing the password reset secret
         Map urlParameters = new HashMap<>();
         try {
             urlParameters.put("u", URLEncoder.encode(user.getName(), "UTF-8"));
             urlParameters.put("e", URLEncoder.encode(user.getEmail(), "UTF-8"));
             urlParameters.put("s", URLEncoder.encode(passwordResetSecret, "UTF-8"));
-            final StringBuilder url = buildURL(baseURL, urlParameters);
+            final StringBuilder url = buildURL(passwordResetBaseURL, urlParameters);
             new Thread("sending password reset e-mail to user " + username) {
                 @Override
                 public void run() {
@@ -198,13 +256,13 @@ public class SecurityServiceImpl extends RemoteServiceServlet implements Securit
     }
 
     @Override
-    public SecurityManager getSecurityManager() {
+    public CachingSecurityManager getSecurityManager() {
         return this.securityManager;
     }
 
     @Override
-    public Collection getUserList() {
-        return store.getUserCollection();
+    public Iterable getUserList() {
+        return store.getUsers();
     }
 
     @Override
@@ -255,17 +313,19 @@ public class SecurityServiceImpl extends RemoteServiceServlet implements Securit
             throw new UserManagementException(UserManagementException.PASSWORD_DOES_NOT_MEET_REQUIREMENTS);
         }
         RandomNumberGenerator rng = new SecureRandomNumberGenerator();
-        Object salt = rng.nextBytes();
+        byte[] salt = rng.nextBytes().getBytes();
         String hashedPasswordBase64 = hashPassword(password, salt);
         UsernamePasswordAccount upa = new UsernamePasswordAccount(username, hashedPasswordBase64, salt);
         final User result = store.createUser(username, email, upa);
-        store.updateUser(result); // store user with unvalidated e-mail
+        final String emailValidationSecret = result.startEmailValidation();
+        // don't replicate exception handling; replicate only the effect on the user store
+        apply(s->s.internalStoreUser(result));
         if (validationBaseURL != null) {
             new Thread("e-mail validation for user " + username + " with e-mail address " + email) {
                 @Override
                 public void run() {
                     try {
-                        startEmailValidation(result, validationBaseURL);
+                        startEmailValidation(result, emailValidationSecret, validationBaseURL);
                     } catch (MailException e) {
                         logger.log(Level.SEVERE, "Error sending mail for new account validation of user " + username
                                 + " to address " + email, e);
@@ -276,6 +336,12 @@ public class SecurityServiceImpl extends RemoteServiceServlet implements Securit
         return result;
     }
 
+    @Override
+    public Void internalStoreUser(User user) {
+        store.updateUser(user);
+        return null;
+    }
+
     @Override
     public void updateSimpleUserPassword(String username, String newPassword) throws UserManagementException {
         final User user = store.getUserByName(username);
@@ -292,12 +358,12 @@ public class SecurityServiceImpl extends RemoteServiceServlet implements Securit
         // for non-admins, check that the old password is correct
         final UsernamePasswordAccount account = (UsernamePasswordAccount) user.getAccount(AccountType.USERNAME_PASSWORD);
         RandomNumberGenerator rng = new SecureRandomNumberGenerator();
-        Object salt = rng.nextBytes();
+        byte[] salt = rng.nextBytes().getBytes();
         String hashedPasswordBase64 = hashPassword(newPassword, salt);
         account.setSalt(salt);
         account.setSaltedPassword(hashedPasswordBase64);
         user.passwordWasReset();
-        store.updateUser(user);
+        apply(s->s.internalStoreUser(user));
     }
 
     @Override
@@ -327,21 +393,21 @@ public class SecurityServiceImpl extends RemoteServiceServlet implements Securit
             throw new UserManagementException(UserManagementException.USER_DOES_NOT_EXIST);
         }
         logger.info("Changing e-mail address of user "+username+" to "+newEmail);
-        user.setEmail(newEmail);
+        final String validationSecret = user.setEmail(newEmail);
         new Thread("e-mail validation after changing e-mail of user " + username + " to " + newEmail) {
             @Override
             public void run() {
                 try {
-                    startEmailValidation(user, validationBaseURL);
+                    startEmailValidation(user, validationSecret, validationBaseURL);
                 } catch (MailException e) {
                     logger.log(Level.SEVERE, "Error sending mail to validate e-mail address change for user "
                             + username + " to address " + newEmail, e);
                 }
             }
         }.start();
-        store.updateUser(user);
+        apply(s->s.internalStoreUser(user));
     }
-    
+
     @Override
     public boolean validateEmail(String username, String validationSecret) throws UserManagementException {
         final User user = store.getUserByName(username);
@@ -349,7 +415,7 @@ public class SecurityServiceImpl extends RemoteServiceServlet implements Securit
             throw new UserManagementException(UserManagementException.USER_DOES_NOT_EXIST);
         }
         final boolean result = user.validate(validationSecret);
-        store.updateUser(user);
+        apply(s->s.internalStoreUser(user));
         return result;
     }
 
@@ -357,17 +423,18 @@ public class SecurityServiceImpl extends RemoteServiceServlet implements Securit
      * {@link User#startEmailValidation() Triggers} e-mail validation for the user object and sends out a
      * URL to the user's e-mail that has the validation secret ready for validation by clicking.
      * 
+     * @param validationSecret
+     *            the result of either {@link User#startEmailValidation()} or {@link User#setEmail(String)}.
      * @param baseURL
-     *            the URL under which the user can reach the e-mail validation service; this URL is required to assemble a
-     *            validation URL that is sent by e-mail to the user, to make the user return the validation secret
-     *            to the right server again.
+     *            the URL under which the user can reach the e-mail validation service; this URL is required to assemble
+     *            a validation URL that is sent by e-mail to the user, to make the user return the validation secret to
+     *            the right server again.
      */
-    private void startEmailValidation(User user, String baseURL) throws MailException {
-        String secret = user.startEmailValidation();
+    private void startEmailValidation(User user, String validationSecret, String baseURL) throws MailException {
         try {
             Map urlParameters = new HashMap<>();
             urlParameters.put("u", URLEncoder.encode(user.getName(), "UTF-8"));
-            urlParameters.put("v", URLEncoder.encode(secret, "UTF-8"));
+            urlParameters.put("v", URLEncoder.encode(validationSecret, "UTF-8"));
             StringBuilder url = buildURL(baseURL, urlParameters);
             sendMail(user.getName(), "e-Mail Validation",
                     "Please click on the link below to validate your e-mail address for user "+user.getName()+".\n   "+url.toString());
@@ -400,27 +467,77 @@ public class SecurityServiceImpl extends RemoteServiceServlet implements Securit
     }
 
     @Override
-    public Set getRolesFromUser(String name) throws UserManagementException {
+    public Iterable getRolesFromUser(String name) throws UserManagementException {
         return store.getRolesFromUser(name);
     }
 
     @Override
-    public void addRoleForUser(String username, String role) throws UserManagementException {
-        store.addRoleForUser(username, role);
+    public void addRoleForUser(String username, String role) {
+        apply(s->s.internalAddRoleForUser(username, role));
     }
 
     @Override
-    public void removeRoleFromUser(String username, String role) throws UserManagementException {
+    public Void internalAddRoleForUser(String username, String role) throws UserManagementException {
+        store.addRoleForUser(username, role);
+        return null;
+    }
+
+    @Override
+    public void removeRoleFromUser(String username, String role) {
+        apply(s->s.internalRemoveRoleFromUser(username, role));
+    }
+
+    @Override
+    public Void internalRemoveRoleFromUser(String username, String role) throws UserManagementException {
         store.removeRoleFromUser(username, role);
+        return null;
+    }
+
+    @Override
+    public Iterable getPermissionsFromUser(String username) throws UserManagementException {
+        return store.getPermissionsFromUser(username);
+    }
+
+    @Override
+    public void removePermissionFromUser(String username, String permissionToRemove) {
+        apply(s->s.internalRemovePermissionForUser(username, permissionToRemove));
+    }
+
+    @Override
+    public Void internalRemovePermissionForUser(String username, String permissionToRemove) throws UserManagementException {
+        store.removePermissionFromUser(username, permissionToRemove);
+        return null;
+    }
+
+    @Override
+    public void addPermissionForUser(String username, String permissionToAdd) {
+        apply(s->s.internalAddPermissionForUser(username, permissionToAdd));
+    }
+
+    @Override
+    public Void internalAddPermissionForUser(String username, String permissionToAdd) throws UserManagementException {
+        store.addPermissionForUser(username, permissionToAdd);
+        return null;
     }
 
     @Override
     public void deleteUser(String username) throws UserManagementException {
+        apply(s->s.internalDeleteUser(username));
+    }
+
+    @Override
+    public Void internalDeleteUser(String username) throws UserManagementException {
         store.deleteUser(username);
+        return null;
     }
 
     @Override
     public boolean setSetting(String key, Object setting) {
+        return apply(s->s.internalSetSetting(key, setting));
+    }
+
+    @Override
+    public Boolean internalSetSetting(String key, Object setting) {
         return store.setSetting(key, setting);
     }
 
@@ -530,7 +647,6 @@ public class SecurityServiceImpl extends RemoteServiceServlet implements Securit
         logger.info("Getting Authorization url...");
         try {
             authorizationUrl = service.getAuthorizationUrl(requestToken);
-
             // Facebook has optional state var to protect against CSFR.
             // We'll use it
             if (authProvider == ClientUtils.FACEBOOK || authProvider == ClientUtils.GITHUB
@@ -679,7 +795,13 @@ public class SecurityServiceImpl extends RemoteServiceServlet implements Securit
         if (!isValidSettingsKey(key)) {
             throw new UserManagementException("Invalid key!");
         }
+        apply(s->s.internalAddSetting(key, clazz));
+    }
+
+    @Override
+    public Void internalAddSetting(String key, Class clazz) {
         store.addSetting(key, clazz);
+        return null;
     }
 
     public static boolean isValidSettingsKey(String key) {
@@ -710,29 +832,6 @@ public class SecurityServiceImpl extends RemoteServiceServlet implements Securit
             for (String s : chainNames) {
                 System.out.println(s + ": " + Arrays.toString(filterChainManager.getChain(s).toArray(new Filter[0])));
             }
-
-            // Map> allSettingTypes = store.getAllSettingTypes();
-            // for (Entry> e : allSettingTypes.entrySet()){
-            // String[] classifier = e.getKey().split("_");
-            // if (classifier[0].equals("URLS") && !classifier[1].equals("AUTH")){
-            // String url = store.getSetting(e.getKey(), String.class);
-            // String n = classifier[0] + "_AUTH";
-            // for (int i = 1; i < classifier.length; i++){
-            // n += "_" + classifier[i];
-            // }
-            // String filter = store.getSetting(n, String.class);
-            // if (url != null && filter != null){
-            // if (!chainNames.contains(url)){
-            // filterChainManager.createChain(url, filter);
-            // logger.info("Created filter " + filter + " for " + url);
-            // }
-            // else {
-            // filterChainManager.addToChain(url, filter);
-            // logger.info("Updated filter " + filter + " for " + url);
-            // }
-            // }
-            // }
-            // }
         }
     }
 
@@ -746,27 +845,39 @@ public class SecurityServiceImpl extends RemoteServiceServlet implements Securit
     }
 
     @Override
-    public void setPreference(String username, String key, String value) {
-        Subject subject = SecurityUtils.getSubject();
+    public void setPreference(final String username, final String key, final String value) {
+        final Subject subject = SecurityUtils.getSubject();
         if (subject.hasRole(DefaultRoles.ADMIN.name()) || username.equals(SessionUtils.loadUsername())) {
-            store.setPreference(username, key, value);
+            apply(s->s.internalSetPreference(username, key, value));
         } else {
             throw new SecurityException("User " + SessionUtils.loadUsername()
                     + " does not have permission to set preference for user " + username);
         }
     }
+
+    @Override
+    public Void internalSetPreference(final String username, final String key, final String value) {
+        store.setPreference(username, key, value);
+        return null;
+    }
     
     @Override
     public void unsetPreference(String username, String key) {
         Subject subject = SecurityUtils.getSubject();
         if (subject.hasRole(DefaultRoles.ADMIN.name()) || username.equals(SessionUtils.loadUsername())) {
-            store.unsetPreference(username, key);
+            apply(s->s.internalUnsetPreference(username, key));
         } else {
             throw new SecurityException("User " + SessionUtils.loadUsername()
                     + " does not have permission to unset preference for user " + username);
         }
     }
 
+    @Override
+    public Void internalUnsetPreference(String username, String key) {
+        store.unsetPreference(username, key);
+        return null;
+    }
+
     @Override
     public String getPreference(String username, String key) {
         Subject subject = SecurityUtils.getSubject();
@@ -777,5 +888,97 @@ public class SecurityServiceImpl extends RemoteServiceServlet implements Securit
                     + " does not have permission to read preferences of user " + username);
         }
     }
+
+    // ----------------- Replication -------------
+    @Override
+    public void clearReplicaState() throws MalformedURLException, IOException, InterruptedException {
+        mailProperties.clear();
+        store.clear();
+    }
+
+    @Override
+    public Serializable getId() {
+        return getClass().getName();
+    }
     
+    @Override
+    public ObjectInputStream createObjectInputStreamResolvingAgainstCache(InputStream is) throws IOException {
+        return new ObjectInputStreamResolvingAgainstSecurityCache(is, store);
+    }
+
+    @Override
+    public void initiallyFillFromInternal(ObjectInputStream is) throws IOException, ClassNotFoundException,
+            InterruptedException {
+        ReplicatingCacheManager newCacheManager = (ReplicatingCacheManager) is.readObject();
+        cacheManager.replaceContentsFrom(newCacheManager);
+        // overriding thread context class loader because the user store may be provided by a different bundle;
+        // We're assuming here that the user store service is provided by the same bundle in the replica as on the master.
+        ClassLoader oldCCL = Thread.currentThread().getContextClassLoader();
+        if (store != null) {
+            Thread.currentThread().setContextClassLoader(store.getClass().getClassLoader());
+        }
+        try {
+            UserStore newUserStore = (UserStore) is.readObject();
+            store.replaceContentsFrom(newUserStore);
+        } finally {
+            Thread.currentThread().setContextClassLoader(oldCCL);
+        }
+    }
+
+    @Override
+    public void serializeForInitialReplicationInternal(ObjectOutputStream objectOutputStream) throws IOException {
+        objectOutputStream.writeObject(cacheManager);
+        objectOutputStream.writeObject(store);
+    }
+
+    @Override
+    public Iterable> getOperationExecutionListeners() {
+        return operationExecutionListeners.keySet();
+    }
+
+    @Override
+    public void addOperationExecutionListener(OperationExecutionListener listener) {
+        operationExecutionListeners.put(listener, listener);
+    }
+
+    @Override
+    public void removeOperationExecutionListener(OperationExecutionListener listener) {
+        operationExecutionListeners.remove(listener);
+    }
+
+    @Override
+    public ReplicationMasterDescriptor getMasterDescriptor() {
+        return replicatingFromMaster;
+    }
+
+    @Override
+    public void startedReplicatingFrom(ReplicationMasterDescriptor master) {
+        this.replicatingFromMaster = master;
+    }
+
+    @Override
+    public void stoppedReplicatingFrom(ReplicationMasterDescriptor master) {
+        this.replicatingFromMaster = null;
+    }
+
+    @Override
+    public void addOperationSentToMasterForReplication(
+            OperationWithResultWithIdWrapper operationWithResultWithIdWrapper) {
+        this.operationsSentToMasterForReplication.add(operationWithResultWithIdWrapper);
+    }
+
+    @Override
+    public boolean hasSentOperationToMaster(OperationWithResult operation) {
+        return this.operationsSentToMasterForReplication.remove(operation);
+    }
+
+    @Override
+    public void clearState() throws Exception {
+        store.clear();
+        initEmptyStore();
+        CacheManager cm = getSecurityManager().getCacheManager();
+        if (cm instanceof ReplicatingCacheManager) {
+            ((ReplicatingCacheManager) cm).clear();
+        }
+    }
 }
diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/operations/SecurityOperation.java b/java/com.sap.sse.security/src/com/sap/sse/security/operations/SecurityOperation.java
new file mode 100755
index 00000000000..b9614a13227
--- /dev/null
+++ b/java/com.sap.sse.security/src/com/sap/sse/security/operations/SecurityOperation.java
@@ -0,0 +1,14 @@
+package com.sap.sse.security.operations;
+
+import com.sap.sse.replication.OperationWithResult;
+import com.sap.sse.security.impl.ReplicableSecurityService;
+
+public interface SecurityOperation extends OperationWithResult {
+    /**
+     * By default, the security-related operations will perform an update on the receiving replica that in turn
+     * will trigger replication of this change transitively.
+     */
+    default boolean isRequiresExplicitTransitiveReplication() {
+        return false;
+    }
+}
diff --git a/java/com.sap.sse/src/com/sap/sse/util/ClearStateTestSupport.java b/java/com.sap.sse/src/com/sap/sse/util/ClearStateTestSupport.java
new file mode 100644
index 00000000000..053f31d6336
--- /dev/null
+++ b/java/com.sap.sse/src/com/sap/sse/util/ClearStateTestSupport.java
@@ -0,0 +1,12 @@
+package com.sap.sse.util;
+
+public interface ClearStateTestSupport {
+    /**
+     * Wipes out the complete state. This method is only used or testing. This also clears the persistent state
+     * accordingly which differs from the {@link Replicable#clearReplicaState()} operation which doesn't care about the
+     * persistent state.
+     * 
+     * Note: Simple properties like the time delay to the 'live' time point are not reset.
+     */
+    void clearState() throws Exception;
+}
diff --git a/java/com.sap.sse/src/com/sap/sse/util/TimerWithRunnable.java b/java/com.sap.sse/src/com/sap/sse/util/TimerWithRunnable.java
new file mode 100755
index 00000000000..42d1b4fd931
--- /dev/null
+++ b/java/com.sap.sse/src/com/sap/sse/util/TimerWithRunnable.java
@@ -0,0 +1,70 @@
+package com.sap.sse.util;
+
+import java.util.Date;
+import java.util.Timer;
+import java.util.TimerTask;
+
+/**
+ * A Java8-compliant {@link Timer} specialization that can deal with {@link Runnable}s instead of
+ * {@link TimerTask} which makes it combinable with lambdas as {@link Runnable} implementations.
+ * 
+ * @author Axel Uhl (D043530)
+ *
+ */
+public class TimerWithRunnable extends Timer {
+    private static class TimerTaskWithRunnable extends TimerTask {
+        private final Runnable runnable;
+
+        protected TimerTaskWithRunnable(Runnable runnable) {
+            super();
+            this.runnable = runnable;
+        }
+
+        @Override
+        public void run() {
+            runnable.run();
+        }
+    }
+
+    public TimerWithRunnable() {
+        super();
+    }
+
+    public TimerWithRunnable(boolean isDaemon) {
+        super(isDaemon);
+    }
+
+    public TimerWithRunnable(String name, boolean isDaemon) {
+        super(name, isDaemon);
+    }
+
+    public TimerWithRunnable(String name) {
+        super(name);
+    }
+
+    public void schedule(Runnable task, long delay) {
+        super.schedule(new TimerTaskWithRunnable(task), delay);
+    }
+
+    public void schedule(Runnable task, Date time) {
+        super.schedule(new TimerTaskWithRunnable(task), time);
+    }
+
+    public void schedule(Runnable task, long delay, long period) {
+        super.schedule(new TimerTaskWithRunnable(task), delay, period);
+    }
+
+    public void schedule(Runnable task, Date firstTime, long period) {
+        super.schedule(new TimerTaskWithRunnable(task), firstTime, period);
+    }
+
+    public void scheduleAtFixedRate(Runnable task, long delay, long period) {
+        super.scheduleAtFixedRate(new TimerTaskWithRunnable(task), delay, period);
+    }
+
+    public void scheduleAtFixedRate(Runnable task, Date firstTime, long period) {
+        super.scheduleAtFixedRate(new TimerTaskWithRunnable(task), firstTime, period);
+    }
+    
+    
+}
diff --git a/java/pom.xml b/java/pom.xml
index f2e21feb53b..5cf75d47147 100755
--- a/java/pom.xml
+++ b/java/pom.xml
@@ -24,12 +24,15 @@
 		com.sap.sse.datamining.shared
 		com.sap.sse.datamining.test
 		com.sap.sse.security
+		com.sap.sse.security.replication.test
 		com.sap.sse.security.test
+		com.sap.sse.security.common
 		com.sap.sse.security.ui
 		com.sap.sse.security.userstore.mongodb
 		com.sap.sse.operationaltransformation
 		com.sap.sse.operationaltransformation.test
 		com.sap.sse.replication
+		com.sap.sse.replication.testsupport
 		com.sap.sse.common.test
 		com.sap.sailing.domain.common
 		com.sap.sailing.domain.shared.android
@@ -118,12 +121,13 @@
 		com.sap.sailing.autoload
 		com.sap.sailing.feature.p2build
 		com.sap.sailing.polars
+		
 	
 	
 	
-      		2.6.1
 		0.21.0
        		2.6.1 
+		race-analysis-p2-remote
 		
+                
+            
+        
     
 
 	
@@ -235,7 +252,7 @@
 					${project.groupId}
 					${project.artifactId}
 					${project.version}
-					../com.sap.sailing.targetplatform/definitions/race-analysis-p2-maven-central
+					../com.sap.sailing.targetplatform/definitions/${p2-target}
                 
               
 				
diff --git a/java/target/env.sh b/java/target/env.sh
index aa87c14a5bc..20988048fbf 100644
--- a/java/target/env.sh
+++ b/java/target/env.sh
@@ -41,7 +41,7 @@ EXPEDITION_PORT=2010
 # set the REPLICATE_MASTER_EXCHANGE_NAME variable to the
 # same channel the master is using in its REPLICATION_CHANNEL variable
 
-# REPLICATE_ON_START=com.sap.sailing.server.impl.RacingEventServiceImpl
+# REPLICATE_ON_START=com.sap.sailing.server.impl.RacingEventServiceImpl,com.sap.sse.security.impl.SecurityServiceImpl
 
 # Host where the master Java instance is running
 # Make sure firewall configurations allow access
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/LaunchActivity.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/LaunchActivity.java
index 218633facf9..69bb5202614 100644
--- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/LaunchActivity.java
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/LaunchActivity.java
@@ -16,16 +16,16 @@ import com.sap.sailing.android.shared.logging.ExLog;
 import com.sap.sailing.android.shared.services.sending.MessageSendingService;
 import com.sap.sailing.android.tracking.app.R;
 import com.sap.sailing.android.tracking.app.utils.AppPreferences;
+import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
+import com.sap.sailing.domain.abstractlog.race.RaceLogEventFactory;
+import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier;
+import com.sap.sailing.domain.abstractlog.race.tracking.impl.SmartphoneUUIDIdentifierImpl;
 import com.sap.sailing.domain.base.Competitor;
 import com.sap.sailing.domain.base.Mark;
 import com.sap.sailing.domain.base.impl.CompetitorImpl;
 import com.sap.sailing.domain.base.impl.MarkImpl;
 import com.sap.sailing.domain.common.racelog.RaceLogServletConstants;
 import com.sap.sailing.domain.common.racelog.tracking.DeviceMappingConstants;
-import com.sap.sailing.domain.racelog.RaceLogEvent;
-import com.sap.sailing.domain.racelog.RaceLogEventFactory;
-import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier;
-import com.sap.sailing.domain.racelog.tracking.impl.SmartphoneUUIDIdentifierImpl;
 import com.sap.sailing.server.gateway.serialization.JsonSerializer;
 import com.sap.sailing.server.gateway.serialization.impl.CompetitorJsonSerializer;
 import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogEventSerializer;
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/AppPreferences.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/AppPreferences.java
index 3ec4e6af8b3..c97209c78f8 100644
--- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/AppPreferences.java
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/AppPreferences.java
@@ -6,13 +6,13 @@ import android.preference.PreferenceManager;
 
 import com.sap.sailing.android.shared.util.PrefUtils;
 import com.sap.sailing.android.tracking.app.R;
-import com.sap.sailing.domain.racelog.RaceLogEventAuthor;
-import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl;
+import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
+import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl;
 
 public class AppPreferences {
     protected final Context context;
     protected final SharedPreferences preferences;
-    public static final RaceLogEventAuthor raceLogEventAuthor = new RaceLogEventAuthorImpl("Tracking App", 0);
+    public static final AbstractLogEventAuthor raceLogEventAuthor = new LogEventAuthorImpl("Tracking App", 0);
     
     public AppPreferences(Context context) {
         this.context = context;
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java
index 8773ff561c9..03e230cd0e7 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java
@@ -11,11 +11,11 @@ import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
 import android.preference.PreferenceManager;
 import android.provider.Settings.Secure;
 
+import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
+import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl;
 import com.sap.sailing.domain.common.CourseDesignerMode;
 import com.sap.sailing.domain.common.racelog.Flags;
 import com.sap.sailing.domain.common.racelog.RacingProcedureType;
-import com.sap.sailing.domain.racelog.RaceLogEventAuthor;
-import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl;
 import com.sap.sailing.racecommittee.app.domain.coursedesign.BoatClassType;
 import com.sap.sailing.racecommittee.app.domain.coursedesign.CourseLayouts;
 import com.sap.sailing.racecommittee.app.domain.coursedesign.NumberOfRounds;
@@ -74,15 +74,15 @@ public class AppPreferences {
         return identifier.isEmpty() ? Secure.getString(context.getContentResolver(), Secure.ANDROID_ID) : identifier;
     }
 
-    public void setAuthor(RaceLogEventAuthor author) {
+    public void setAuthor(AbstractLogEventAuthor author) {
         preferences.edit().putString(HIDDEN_PREFERENCE_AUTHOR_NAME, author.getName()).commit();
         preferences.edit().putInt(HIDDEN_PREFERENCE_AUTHOR_PRIORITY, author.getPriority()).commit();
     }
 
-    public RaceLogEventAuthor getAuthor() {
+    public AbstractLogEventAuthor getAuthor() {
         String authorName = preferences.getString(HIDDEN_PREFERENCE_AUTHOR_NAME, "");
         int authorPriority = preferences.getInt(HIDDEN_PREFERENCE_AUTHOR_PRIORITY, 0);
-        return new RaceLogEventAuthorImpl(authorName, authorPriority);
+        return new LogEventAuthorImpl(authorName, authorPriority);
     }
 
     public BoatClassType getBoatClass() {
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OfflineDataManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OfflineDataManager.java
index 9b90fda7971..a95ec009cfa 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OfflineDataManager.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OfflineDataManager.java
@@ -14,6 +14,12 @@ import java.util.concurrent.Callable;
 import android.app.LoaderManager.LoaderCallbacks;
 import android.content.Context;
 
+import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
+import com.sap.sailing.domain.abstractlog.race.RaceLog;
+import com.sap.sailing.domain.abstractlog.race.RaceLogEventFactory;
+import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventFactoryImpl;
+import com.sap.sailing.domain.abstractlog.race.impl.RaceLogImpl;
+import com.sap.sailing.domain.abstractlog.race.state.impl.RaceStateImpl;
 import com.sap.sailing.domain.base.Competitor;
 import com.sap.sailing.domain.base.CourseArea;
 import com.sap.sailing.domain.base.CourseBase;
@@ -38,12 +44,6 @@ import com.sap.sailing.domain.base.racegroup.impl.RaceGroupImpl;
 import com.sap.sailing.domain.base.racegroup.impl.SeriesWithRowsImpl;
 import com.sap.sailing.domain.common.Color;
 import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
-import com.sap.sailing.domain.racelog.RaceLog;
-import com.sap.sailing.domain.racelog.RaceLogEventAuthor;
-import com.sap.sailing.domain.racelog.RaceLogEventFactory;
-import com.sap.sailing.domain.racelog.impl.RaceLogEventFactoryImpl;
-import com.sap.sailing.domain.racelog.impl.RaceLogImpl;
-import com.sap.sailing.domain.racelog.state.impl.RaceStateImpl;
 import com.sap.sailing.racecommittee.app.AppPreferences;
 import com.sap.sailing.racecommittee.app.data.clients.LoadClient;
 import com.sap.sailing.racecommittee.app.data.loaders.DataLoaderResult;
@@ -98,7 +98,7 @@ public class OfflineDataManager extends DataManager {
 
         RaceLogEventFactory factory = new RaceLogEventFactoryImpl();
         RaceLog log = new RaceLogImpl(UUID.randomUUID());
-        final RaceLogEventAuthor author = AppPreferences.on(context).getAuthor();
+        final AbstractLogEventAuthor author = AppPreferences.on(context).getAuthor();
         ConfigurationLoader configuration = PreferencesRegattaConfigurationLoader.loadFromPreferences(preferences);
         
         log.add(factory.createStartTimeEvent(new MillisecondsTimePoint(new Date().getTime() - 2000), author,
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/ManagedRacesDataParser.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/ManagedRacesDataParser.java
index 64a6856a5f3..41ad6204c88 100755
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/ManagedRacesDataParser.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/ManagedRacesDataParser.java
@@ -8,6 +8,10 @@ import org.json.simple.JSONArray;
 import org.json.simple.JSONObject;
 import org.json.simple.JSONValue;
 
+import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
+import com.sap.sailing.domain.abstractlog.race.RaceLog;
+import com.sap.sailing.domain.abstractlog.race.state.RaceState;
+import com.sap.sailing.domain.abstractlog.race.state.impl.RaceStateImpl;
 import com.sap.sailing.domain.base.Fleet;
 import com.sap.sailing.domain.base.SeriesBase;
 import com.sap.sailing.domain.base.configuration.ConfigurationLoader;
@@ -16,10 +20,6 @@ import com.sap.sailing.domain.base.racegroup.RaceCell;
 import com.sap.sailing.domain.base.racegroup.RaceGroup;
 import com.sap.sailing.domain.base.racegroup.RaceRow;
 import com.sap.sailing.domain.base.racegroup.SeriesWithRows;
-import com.sap.sailing.domain.racelog.RaceLog;
-import com.sap.sailing.domain.racelog.RaceLogEventAuthor;
-import com.sap.sailing.domain.racelog.state.RaceState;
-import com.sap.sailing.domain.racelog.state.impl.RaceStateImpl;
 import com.sap.sailing.racecommittee.app.domain.FleetIdentifier;
 import com.sap.sailing.racecommittee.app.domain.ManagedRace;
 import com.sap.sailing.racecommittee.app.domain.ManagedRaceIdentifier;
@@ -34,9 +34,9 @@ public class ManagedRacesDataParser implements DataParser deserializer;
     private final ConfigurationLoader globalConfigurationLoader;
-    private final RaceLogEventAuthor author;
+    private final AbstractLogEventAuthor author;
 
-    public ManagedRacesDataParser(RaceLogEventAuthor author, ConfigurationLoader globalConfiguration,
+    public ManagedRacesDataParser(AbstractLogEventAuthor author, ConfigurationLoader globalConfiguration,
             JsonDeserializer deserializer) {
         this.author = author;
         this.globalConfigurationLoader = globalConfiguration;
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/RaceLogsDataParser.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/RaceLogsDataParser.java
index 67bc4da30ad..a1d5cc18e2e 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/RaceLogsDataParser.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/RaceLogsDataParser.java
@@ -7,7 +7,7 @@ import java.util.Map;
 
 import org.json.simple.JSONValue;
 
-import com.sap.sailing.domain.racelog.RaceLogEvent;
+import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
 import com.sap.sailing.racecommittee.app.domain.ManagedRace;
 
 public class RaceLogsDataParser implements
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/ManagedRace.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/ManagedRace.java
index 3cd0483730f..c0e37642515 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/ManagedRace.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/ManagedRace.java
@@ -2,11 +2,11 @@ package com.sap.sailing.racecommittee.app.domain;
 
 import java.util.Collection;
 
+import com.sap.sailing.domain.abstractlog.race.RaceLog;
+import com.sap.sailing.domain.abstractlog.race.state.RaceState;
 import com.sap.sailing.domain.base.Competitor;
 import com.sap.sailing.domain.base.CourseBase;
 import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
-import com.sap.sailing.domain.racelog.RaceLog;
-import com.sap.sailing.domain.racelog.state.RaceState;
 import com.sap.sse.common.Named;
 import com.sap.sse.common.WithID;
 
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/ManagedRaceImpl.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/ManagedRaceImpl.java
index fb25107eb1f..33ac8eaa4fa 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/ManagedRaceImpl.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/ManagedRaceImpl.java
@@ -4,14 +4,14 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
 
+import com.sap.sailing.domain.abstractlog.race.RaceLog;
+import com.sap.sailing.domain.abstractlog.race.state.RaceState;
 import com.sap.sailing.domain.base.Competitor;
 import com.sap.sailing.domain.base.CourseBase;
 import com.sap.sailing.domain.base.Fleet;
 import com.sap.sailing.domain.base.SeriesBase;
 import com.sap.sailing.domain.base.racegroup.RaceGroup;
 import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
-import com.sap.sailing.domain.racelog.RaceLog;
-import com.sap.sailing.domain.racelog.state.RaceState;
 import com.sap.sailing.racecommittee.app.domain.ManagedRace;
 import com.sap.sailing.racecommittee.app.domain.ManagedRaceIdentifier;
 
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/racelog/impl/RaceLogEventsCallback.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/racelog/impl/RaceLogEventsCallback.java
index 24e72477ce2..2839a022d5c 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/racelog/impl/RaceLogEventsCallback.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/racelog/impl/RaceLogEventsCallback.java
@@ -20,9 +20,9 @@ import com.sap.sailing.android.shared.logging.ExLog;
 import com.sap.sailing.android.shared.services.sending.MessageSendingService;
 import com.sap.sailing.android.shared.services.sending.MessageSendingService.MessageSendingBinder;
 import com.sap.sailing.android.shared.services.sending.ServerReplyCallback;
+import com.sap.sailing.domain.abstractlog.race.RaceLog;
+import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
 import com.sap.sailing.domain.base.SharedDomainFactory;
-import com.sap.sailing.domain.racelog.RaceLog;
-import com.sap.sailing.domain.racelog.RaceLogEvent;
 import com.sap.sailing.racecommittee.app.data.DataManager;
 import com.sap.sailing.racecommittee.app.data.ReadonlyDataManager;
 import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/RaceStateEventSchedulerOnService.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/RaceStateEventSchedulerOnService.java
index 355b3ac65f7..29ac1d61ec8 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/RaceStateEventSchedulerOnService.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/RaceStateEventSchedulerOnService.java
@@ -2,9 +2,9 @@ package com.sap.sailing.racecommittee.app.services;
 
 import java.util.Collection;
 
-import com.sap.sailing.domain.racelog.state.RaceStateEvent;
-import com.sap.sailing.domain.racelog.state.RaceStateEventScheduler;
-import com.sap.sailing.domain.racelog.state.impl.RaceStateEvents;
+import com.sap.sailing.domain.abstractlog.race.state.RaceStateEvent;
+import com.sap.sailing.domain.abstractlog.race.state.RaceStateEventScheduler;
+import com.sap.sailing.domain.abstractlog.race.state.impl.RaceStateEvents;
 import com.sap.sailing.racecommittee.app.domain.ManagedRace;
 
 public class RaceStateEventSchedulerOnService implements RaceStateEventScheduler {
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/RaceStateService.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/RaceStateService.java
index 12e62a79a2e..346db254b4a 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/RaceStateService.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/RaceStateService.java
@@ -20,13 +20,13 @@ import android.os.IBinder;
 import android.support.v4.app.NotificationCompat;
 import android.util.Pair;
 
-import com.sap.sailing.domain.racelog.RaceLogEvent;
-import com.sap.sailing.domain.racelog.RaceLogEventVisitor;
-import com.sap.sailing.domain.racelog.impl.RaceLogChangedVisitor;
-import com.sap.sailing.domain.racelog.state.RaceState;
-import com.sap.sailing.domain.racelog.state.RaceStateEvent;
-import com.sap.sailing.domain.racelog.state.RaceStateEventScheduler;
-import com.sap.sailing.domain.racelog.state.impl.RaceStateEvents;
+import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
+import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor;
+import com.sap.sailing.domain.abstractlog.race.impl.RaceLogChangedVisitor;
+import com.sap.sailing.domain.abstractlog.race.state.RaceState;
+import com.sap.sailing.domain.abstractlog.race.state.RaceStateEvent;
+import com.sap.sailing.domain.abstractlog.race.state.RaceStateEventScheduler;
+import com.sap.sailing.domain.abstractlog.race.state.impl.RaceStateEvents;
 import com.sap.sailing.racecommittee.app.AppConstants;
 import com.sap.sailing.racecommittee.app.R;
 import com.sap.sailing.racecommittee.app.data.DataManager;
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventRestorer.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventRestorer.java
index db5e7fb1d76..d3f4893062c 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventRestorer.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventRestorer.java
@@ -10,7 +10,7 @@ import android.content.Intent;
 import com.sap.sailing.android.shared.logging.ExLog;
 import com.sap.sailing.android.shared.services.sending.MessagePersistenceManager.MessageRestorer;
 import com.sap.sailing.android.shared.services.sending.MessageSendingService;
-import com.sap.sailing.domain.racelog.RaceLogEvent;
+import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
 import com.sap.sailing.racecommittee.app.data.DataManager;
 import com.sap.sailing.racecommittee.app.data.DataStore;
 import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/RaceEventSender.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/RaceEventSender.java
index 3daf2a6755d..e441be43ea5 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/RaceEventSender.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/RaceEventSender.java
@@ -4,8 +4,8 @@ import org.json.simple.JSONObject;
 
 import android.app.Service;
 
-import com.sap.sailing.domain.racelog.RaceLogChangedListener;
-import com.sap.sailing.domain.racelog.RaceLogEvent;
+import com.sap.sailing.domain.abstractlog.race.RaceLogChangedListener;
+import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
 import com.sap.sailing.racecommittee.app.domain.ManagedRace;
 import com.sap.sailing.racecommittee.app.domain.racelog.impl.RaceLogEventsCallback;
 import com.sap.sailing.server.gateway.serialization.JsonSerializer;
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java
index 583c6cf6749..b195711edaa 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java
@@ -20,8 +20,8 @@ import android.widget.Toast;
 
 import com.sap.sailing.android.shared.logging.ExLog;
 import com.sap.sailing.android.shared.util.CollectionUtils;
+import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
 import com.sap.sailing.domain.base.CourseArea;
-import com.sap.sailing.domain.racelog.RaceLogEventAuthor;
 import com.sap.sailing.racecommittee.app.AppConstants;
 import com.sap.sailing.racecommittee.app.R;
 import com.sap.sailing.racecommittee.app.data.DataManager;
@@ -203,7 +203,7 @@ public class RacingActivity extends SessionActivity implements RaceInfoListener
 
     private void setupActionBar(CourseArea courseArea) {
         ActionBar actionBar = getActionBar();
-        RaceLogEventAuthor author = preferences.getAuthor();
+        AbstractLogEventAuthor author = preferences.getAuthor();
         String title = String.format(getString(R.string.racingview_header), courseArea.getName());
         title += " (" + author.getName() + ")";
 
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceFragment.java
index 9c64eaeed34..be738560e8c 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceFragment.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceFragment.java
@@ -5,7 +5,7 @@ import java.io.Serializable;
 import android.app.Activity;
 import android.os.Bundle;
 
-import com.sap.sailing.domain.racelog.state.RaceState;
+import com.sap.sailing.domain.abstractlog.race.state.RaceState;
 import com.sap.sailing.racecommittee.app.AppConstants;
 import com.sap.sailing.racecommittee.app.AppPreferences;
 import com.sap.sailing.racecommittee.app.data.OnlineDataManager;
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 94a34c7190b..7757d3e18ed 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
@@ -15,10 +15,10 @@ import android.widget.Button;
 import android.widget.TextView;
 
 import com.sap.sailing.android.shared.logging.ExLog;
+import com.sap.sailing.domain.abstractlog.race.state.RaceStateChangedListener;
+import com.sap.sailing.domain.abstractlog.race.state.ReadonlyRaceState;
+import com.sap.sailing.domain.abstractlog.race.state.impl.BaseRaceStateChangedListener;
 import com.sap.sailing.domain.base.CourseBase;
-import com.sap.sailing.domain.racelog.state.RaceStateChangedListener;
-import com.sap.sailing.domain.racelog.state.ReadonlyRaceState;
-import com.sap.sailing.domain.racelog.state.impl.BaseRaceStateChangedListener;
 import com.sap.sailing.domain.tracking.Wind;
 import com.sap.sailing.racecommittee.app.AppConstants;
 import com.sap.sailing.racecommittee.app.R;
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/AbortModeSelectionDialog.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/AbortModeSelectionDialog.java
index a2fc91807de..9dee02c4236 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/AbortModeSelectionDialog.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/AbortModeSelectionDialog.java
@@ -8,8 +8,8 @@ import android.view.ViewGroup;
 import android.widget.ImageButton;
 
 import com.sap.sailing.android.shared.logging.ExLog;
+import com.sap.sailing.domain.abstractlog.race.state.RaceState;
 import com.sap.sailing.domain.common.racelog.Flags;
-import com.sap.sailing.domain.racelog.state.RaceState;
 import com.sap.sailing.racecommittee.app.AppConstants;
 import com.sap.sailing.racecommittee.app.R;
 import com.sap.sailing.racecommittee.app.logging.LogEvent;
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/LoginDialog.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/LoginDialog.java
index 1c1d92fbed2..8a21e5c58c7 100755
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/LoginDialog.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/LoginDialog.java
@@ -6,8 +6,8 @@ import android.content.DialogInterface.OnClickListener;
 import android.os.Bundle;
 
 import com.sap.sailing.android.shared.logging.ExLog;
-import com.sap.sailing.domain.racelog.RaceLogEventAuthor;
-import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl;
+import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
+import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl;
 import com.sap.sailing.racecommittee.app.R;
 import com.sap.sailing.racecommittee.app.logging.LogEvent;
 
@@ -20,7 +20,7 @@ public class LoginDialog extends ActivityAttachedDialogFragment {
 
     private CharSequence[] loginTypeDescriptions;
     private LoginType selectedLoginType;
-    private RaceLogEventAuthor author;
+    private AbstractLogEventAuthor author;
     
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -37,7 +37,7 @@ public class LoginDialog extends ActivityAttachedDialogFragment {
         return selectedLoginType;
     }
     
-    public RaceLogEventAuthor getAuthor() {
+    public AbstractLogEventAuthor getAuthor() {
         return author;
     }
 
@@ -62,19 +62,19 @@ public class LoginDialog extends ActivityAttachedDialogFragment {
                         // see loginTypeDescriptions for the indices of the login types
                         case 0:
                             selectedLoginType = LoginType.OFFICER;
-                            author = new RaceLogEventAuthorImpl("Race Officer on Start Vessel", 0);
+                            author = new LogEventAuthorImpl("Race Officer on Start Vessel", 0);
                             break;
                         case 1:
                             selectedLoginType = LoginType.OFFICER;
-                            author = new RaceLogEventAuthorImpl("Race Officer on Finish Vessel", 1);
+                            author = new LogEventAuthorImpl("Race Officer on Finish Vessel", 1);
                             break;
                         case 2:
                             selectedLoginType = LoginType.OFFICER;
-                            author = new RaceLogEventAuthorImpl("Shore Control", 2);
+                            author = new LogEventAuthorImpl("Shore Control", 2);
                             break;
                         case 3:
                             selectedLoginType = LoginType.VIEWER;
-                            author = new RaceLogEventAuthorImpl("Viewer", 3);
+                            author = new LogEventAuthorImpl("Viewer", 3);
                             break;
                         default:
                             selectedLoginType = LoginType.NONE;
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/PositioningFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/PositioningFragment.java
index 9da6c4c707a..acd54695612 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/PositioningFragment.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/PositioningFragment.java
@@ -24,12 +24,12 @@ import android.widget.Toast;
 
 import com.mobeta.android.dslv.DragSortController;
 import com.mobeta.android.dslv.DragSortListView;
+import com.sap.sailing.domain.abstractlog.race.CompetitorResults;
+import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultsImpl;
 import com.sap.sailing.domain.base.Competitor;
 import com.sap.sailing.domain.base.CompetitorStore;
 import com.sap.sailing.domain.base.SharedDomainFactory;
 import com.sap.sailing.domain.common.MaxPointsReason;
-import com.sap.sailing.domain.racelog.CompetitorResults;
-import com.sap.sailing.domain.racelog.impl.CompetitorResultsImpl;
 import com.sap.sailing.racecommittee.app.R;
 import com.sap.sailing.racecommittee.app.data.DataManager;
 import com.sap.sailing.racecommittee.app.data.OnlineDataManager;
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/ProtestTimeDialogFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/ProtestTimeDialogFragment.java
index bfac38ba175..6cc55d7accd 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/ProtestTimeDialogFragment.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/ProtestTimeDialogFragment.java
@@ -18,8 +18,8 @@ import android.widget.ArrayAdapter;
 import android.widget.ListView;
 import android.widget.TimePicker;
 
+import com.sap.sailing.domain.abstractlog.race.analyzing.impl.FinishedTimeFinder;
 import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
-import com.sap.sailing.domain.racelog.analyzing.impl.FinishedTimeFinder;
 import com.sap.sailing.racecommittee.app.R;
 import com.sap.sailing.racecommittee.app.data.DataManager;
 import com.sap.sailing.racecommittee.app.data.ReadonlyDataManager;
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/RaceDialogFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/RaceDialogFragment.java
index 2f36a552abc..c93ca7ba091 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/RaceDialogFragment.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/RaceDialogFragment.java
@@ -5,7 +5,7 @@ import java.io.Serializable;
 import android.app.Activity;
 import android.os.Bundle;
 
-import com.sap.sailing.domain.racelog.state.RaceState;
+import com.sap.sailing.domain.abstractlog.race.state.RaceState;
 import com.sap.sailing.racecommittee.app.AppConstants;
 import com.sap.sailing.racecommittee.app.AppPreferences;
 import com.sap.sailing.racecommittee.app.data.OnlineDataManager;
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/RaceFinishedTimeDialog.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/RaceFinishedTimeDialog.java
index 0bca370d3da..b59a792e724 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/RaceFinishedTimeDialog.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/RaceFinishedTimeDialog.java
@@ -11,8 +11,8 @@ import android.widget.Button;
 import android.widget.TimePicker;
 import android.widget.Toast;
 
+import com.sap.sailing.domain.abstractlog.race.analyzing.impl.FinishingTimeFinder;
 import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
-import com.sap.sailing.domain.racelog.analyzing.impl.FinishingTimeFinder;
 import com.sap.sailing.racecommittee.app.R;
 import com.sap.sse.common.TimePoint;
 import com.sap.sse.common.impl.MillisecondsTimePoint;
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/RaceFinishingTimeDialog.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/RaceFinishingTimeDialog.java
index 82337836981..8a76f450e03 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/RaceFinishingTimeDialog.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/RaceFinishingTimeDialog.java
@@ -11,8 +11,8 @@ import android.widget.Button;
 import android.widget.TimePicker;
 import android.widget.Toast;
 
+import com.sap.sailing.domain.abstractlog.race.analyzing.impl.StartTimeFinder;
 import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
-import com.sap.sailing.domain.racelog.analyzing.impl.StartTimeFinder;
 import com.sap.sailing.racecommittee.app.R;
 import com.sap.sse.common.TimePoint;
 import com.sap.sse.common.impl.MillisecondsTimePoint;
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/coursedesign/ByMapCourseDesignDialog.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/coursedesign/ByMapCourseDesignDialog.java
index 78245babff3..25f30eddf06 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/coursedesign/ByMapCourseDesignDialog.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/coursedesign/ByMapCourseDesignDialog.java
@@ -21,20 +21,18 @@ import android.widget.ImageButton;
 import android.widget.Spinner;
 import android.widget.Toast;
 
-import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
 import com.google.android.gms.maps.CameraUpdateFactory;
 import com.google.android.gms.maps.GoogleMap;
 import com.google.android.gms.maps.MapView;
-import com.google.android.gms.maps.MapsInitializer;
 import com.google.android.gms.maps.model.BitmapDescriptor;
 import com.google.android.gms.maps.model.BitmapDescriptorFactory;
 import com.google.android.gms.maps.model.LatLng;
 import com.google.android.gms.maps.model.MarkerOptions;
+import com.sap.sailing.domain.abstractlog.race.analyzing.impl.LastWindFixFinder;
 import com.sap.sailing.domain.base.CourseBase;
 import com.sap.sailing.domain.base.impl.CourseDataImpl;
 import com.sap.sailing.domain.common.MarkType;
 import com.sap.sailing.domain.common.Position;
-import com.sap.sailing.domain.racelog.analyzing.impl.LastWindFixFinder;
 import com.sap.sailing.domain.tracking.Wind;
 import com.sap.sailing.racecommittee.app.AppConstants;
 import com.sap.sailing.racecommittee.app.AppPreferences;
@@ -87,11 +85,6 @@ public class ByMapCourseDesignDialog extends RaceDialogFragment {
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
         // Inflate the layout for this fragment
         View view = inflater.inflate(R.layout.race_choose_classic_course_design_view, container);
-        try {
-            MapsInitializer.initialize(getActivity());
-        } catch (GooglePlayServicesNotAvailableException e) {
-            // TODO handle this situation
-        }
 
         mMapView = (MapView) view.findViewById(R.id.mapView);
         mMapView.onCreate(mBundle);
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/prerequisite/PrerequisiteRaceDialog.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/prerequisite/PrerequisiteRaceDialog.java
index 565564c4c47..fbdbc75f246 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/prerequisite/PrerequisiteRaceDialog.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/prerequisite/PrerequisiteRaceDialog.java
@@ -3,7 +3,7 @@ package com.sap.sailing.racecommittee.app.ui.fragments.dialogs.prerequisite;
 import android.app.Activity;
 import android.os.Bundle;
 
-import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedurePrerequisite;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedurePrerequisite;
 import com.sap.sailing.racecommittee.app.domain.ManagedRace;
 import com.sap.sailing.android.shared.logging.ExLog;
 import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.RaceDialogFragment;
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/prerequisite/RaceChooseGateLaunchTimesDialog.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/prerequisite/RaceChooseGateLaunchTimesDialog.java
index 06a36102e7b..0f4da6e694b 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/prerequisite/RaceChooseGateLaunchTimesDialog.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/prerequisite/RaceChooseGateLaunchTimesDialog.java
@@ -9,10 +9,10 @@ import android.widget.Button;
 import android.widget.EditText;
 import android.widget.Toast;
 
-import com.sap.sailing.domain.racelog.RaceLogGateLineOpeningTimeEvent;
-import com.sap.sailing.domain.racelog.RaceLogGateLineOpeningTimeEvent.GateLineOpeningTimes;
-import com.sap.sailing.domain.racelog.state.racingprocedure.gate.GateStartRacingProcedure;
-import com.sap.sailing.domain.racelog.state.racingprocedure.gate.impl.GateLaunchTimePrerequisite;
+import com.sap.sailing.domain.abstractlog.race.RaceLogGateLineOpeningTimeEvent;
+import com.sap.sailing.domain.abstractlog.race.RaceLogGateLineOpeningTimeEvent.GateLineOpeningTimes;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.GateStartRacingProcedure;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.impl.GateLaunchTimePrerequisite;
 import com.sap.sailing.racecommittee.app.R;
 import com.sap.sse.common.impl.MillisecondsTimePoint;
 
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/prerequisite/RaceChoosePathFinderDialog.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/prerequisite/RaceChoosePathFinderDialog.java
index ccbfa330787..b9457ed2f60 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/prerequisite/RaceChoosePathFinderDialog.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/prerequisite/RaceChoosePathFinderDialog.java
@@ -11,8 +11,8 @@ import android.widget.Button;
 import android.widget.EditText;
 import android.widget.Toast;
 
-import com.sap.sailing.domain.racelog.state.racingprocedure.gate.GateStartRacingProcedure;
-import com.sap.sailing.domain.racelog.state.racingprocedure.gate.impl.PathfinderPrerequisite;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.GateStartRacingProcedure;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.impl.PathfinderPrerequisite;
 import com.sap.sailing.racecommittee.app.R;
 import com.sap.sailing.racecommittee.app.domain.ManagedRace;
 import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.RaceDialogFragment;
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/prerequisite/RaceChooseStartModeDialog.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/prerequisite/RaceChooseStartModeDialog.java
index f5c9bd1a071..569f6b92508 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/prerequisite/RaceChooseStartModeDialog.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/prerequisite/RaceChooseStartModeDialog.java
@@ -15,9 +15,9 @@ import android.widget.ArrayAdapter;
 import android.widget.GridView;
 import android.widget.ImageButton;
 
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.RRS26RacingProcedure;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.impl.StartmodePrerequisite;
 import com.sap.sailing.domain.common.racelog.Flags;
-import com.sap.sailing.domain.racelog.state.racingprocedure.rrs26.RRS26RacingProcedure;
-import com.sap.sailing.domain.racelog.state.racingprocedure.rrs26.impl.StartmodePrerequisite;
 import com.sap.sailing.racecommittee.app.R;
 import com.sap.sailing.racecommittee.app.ui.utils.FlagsBitmapCache;
 import com.sap.sse.common.impl.MillisecondsTimePoint;
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 dd7c177a7ba..a05b66ef0e5 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
@@ -17,8 +17,8 @@ import android.widget.ImageView;
 import android.widget.ListView;
 
 import com.sap.sailing.android.shared.logging.ExLog;
-import com.sap.sailing.domain.racelog.state.ReadonlyRaceState;
-import com.sap.sailing.domain.racelog.state.impl.BaseRaceStateChangedListener;
+import com.sap.sailing.domain.abstractlog.race.state.ReadonlyRaceState;
+import com.sap.sailing.domain.abstractlog.race.state.impl.BaseRaceStateChangedListener;
 import com.sap.sailing.racecommittee.app.R;
 import com.sap.sailing.racecommittee.app.RaceApplication;
 import com.sap.sailing.racecommittee.app.domain.ManagedRace;
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/BaseRaceInfoRaceFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/BaseRaceInfoRaceFragment.java
index bcef69334c8..ac6f3d1603d 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/BaseRaceInfoRaceFragment.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/BaseRaceInfoRaceFragment.java
@@ -5,12 +5,12 @@ import java.util.List;
 import android.app.Activity;
 import android.widget.TextView;
 
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.FlagPoleState;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedure;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ReadonlyRacingProcedure;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.BaseRacingProcedureChangedListener;
 import com.sap.sailing.domain.common.racelog.FlagPole;
 import com.sap.sailing.domain.common.racelog.Flags;
-import com.sap.sailing.domain.racelog.state.racingprocedure.FlagPoleState;
-import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedure;
-import com.sap.sailing.domain.racelog.state.racingprocedure.ReadonlyRacingProcedure;
-import com.sap.sailing.domain.racelog.state.racingprocedure.impl.BaseRacingProcedureChangedListener;
 import com.sap.sailing.racecommittee.app.R;
 import com.sap.sailing.android.shared.logging.ExLog;
 import com.sap.sailing.racecommittee.app.ui.fragments.RaceFragment;
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/SetStartTimeRaceFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/SetStartTimeRaceFragment.java
index 35d2c90d1bb..a5f58402dd5 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/SetStartTimeRaceFragment.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/SetStartTimeRaceFragment.java
@@ -22,12 +22,12 @@ import android.widget.TextView;
 import android.widget.TimePicker;
 
 import com.sap.sailing.android.shared.logging.ExLog;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedurePrerequisite;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.impl.GateLaunchTimePrerequisite;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.impl.PathfinderPrerequisite;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.impl.StartmodePrerequisite;
 import com.sap.sailing.domain.common.racelog.Flags;
 import com.sap.sailing.domain.common.racelog.RacingProcedureType;
-import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedurePrerequisite;
-import com.sap.sailing.domain.racelog.state.racingprocedure.gate.impl.GateLaunchTimePrerequisite;
-import com.sap.sailing.domain.racelog.state.racingprocedure.gate.impl.PathfinderPrerequisite;
-import com.sap.sailing.domain.racelog.state.racingprocedure.rrs26.impl.StartmodePrerequisite;
 import com.sap.sailing.racecommittee.app.AppConstants;
 import com.sap.sailing.racecommittee.app.R;
 import com.sap.sailing.racecommittee.app.domain.ManagedRace;
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finished/BaseFinishedRaceFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finished/BaseFinishedRaceFragment.java
index 45ffda4120d..9044ca679e7 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finished/BaseFinishedRaceFragment.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finished/BaseFinishedRaceFragment.java
@@ -11,10 +11,10 @@ import android.view.ViewGroup;
 import android.widget.ImageButton;
 import android.widget.TextView;
 
-import com.sap.sailing.domain.racelog.state.RaceStateChangedListener;
-import com.sap.sailing.domain.racelog.state.ReadonlyRaceState;
-import com.sap.sailing.domain.racelog.state.impl.BaseRaceStateChangedListener;
-import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedure;
+import com.sap.sailing.domain.abstractlog.race.state.RaceStateChangedListener;
+import com.sap.sailing.domain.abstractlog.race.state.ReadonlyRaceState;
+import com.sap.sailing.domain.abstractlog.race.state.impl.BaseRaceStateChangedListener;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedure;
 import com.sap.sailing.racecommittee.app.R;
 import com.sap.sailing.racecommittee.app.domain.ManagedRace;
 import com.sap.sailing.racecommittee.app.domain.impl.BoatClassSeriesFleet;
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finished/BasicFinishedRaceFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finished/BasicFinishedRaceFragment.java
index 8766b204c42..3ab9abe10a7 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finished/BasicFinishedRaceFragment.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finished/BasicFinishedRaceFragment.java
@@ -1,6 +1,6 @@
 package com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.finished;
 
-import com.sap.sailing.domain.racelog.state.racingprocedure.basic.BasicRacingProcedure;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.basic.BasicRacingProcedure;
 
 public class BasicFinishedRaceFragment extends BaseFinishedRaceFragment {
 
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finished/ESSFinishedRaceFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finished/ESSFinishedRaceFragment.java
index 20f1e4e2ac9..89ceda65798 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finished/ESSFinishedRaceFragment.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finished/ESSFinishedRaceFragment.java
@@ -5,7 +5,7 @@ import android.view.View;
 import android.view.View.OnClickListener;
 import android.widget.Button;
 
-import com.sap.sailing.domain.racelog.state.racingprocedure.ess.ESSRacingProcedure;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ess.ESSRacingProcedure;
 import com.sap.sailing.racecommittee.app.R;
 import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.PositioningFragment;
 import com.sap.sailing.racecommittee.app.utils.TimeUtils;
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finished/GateStartFinishedFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finished/GateStartFinishedFragment.java
index bdbc6dac0f3..a088ac210aa 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finished/GateStartFinishedFragment.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finished/GateStartFinishedFragment.java
@@ -1,6 +1,6 @@
 package com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.finished;
 
-import com.sap.sailing.domain.racelog.state.racingprocedure.gate.GateStartRacingProcedure;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.GateStartRacingProcedure;
 
 public class GateStartFinishedFragment extends BaseFinishedRaceFragment {
 
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finished/RRS26FinishedRaceFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finished/RRS26FinishedRaceFragment.java
index 23c710cabba..9848fbb6758 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finished/RRS26FinishedRaceFragment.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finished/RRS26FinishedRaceFragment.java
@@ -1,6 +1,6 @@
 package com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.finished;
 
-import com.sap.sailing.domain.racelog.state.racingprocedure.rrs26.RRS26RacingProcedure;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.RRS26RacingProcedure;
 
 public class RRS26FinishedRaceFragment extends BaseFinishedRaceFragment {
 
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finishing/BaseFinishingRaceFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finishing/BaseFinishingRaceFragment.java
index 02f71b2b8ed..70d765c4d39 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finishing/BaseFinishingRaceFragment.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finishing/BaseFinishingRaceFragment.java
@@ -9,8 +9,8 @@ import android.widget.Button;
 import android.widget.ImageButton;
 import android.widget.TextView;
 
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedure;
 import com.sap.sailing.domain.common.racelog.Flags;
-import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedure;
 import com.sap.sailing.racecommittee.app.AppConstants;
 import com.sap.sailing.racecommittee.app.R;
 import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.AbortModeSelectionDialog;
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finishing/BasicFinishingRaceFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finishing/BasicFinishingRaceFragment.java
index 308af30d367..884a10ad6a9 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finishing/BasicFinishingRaceFragment.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finishing/BasicFinishingRaceFragment.java
@@ -1,6 +1,6 @@
 package com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.finishing;
 
-import com.sap.sailing.domain.racelog.state.racingprocedure.basic.BasicRacingProcedure;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.basic.BasicRacingProcedure;
 
 public class BasicFinishingRaceFragment extends BaseFinishingRaceFragment {
 
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finishing/ESSFinishingRaceFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finishing/ESSFinishingRaceFragment.java
index 43aa5cc7698..3f32aa9e1bd 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finishing/ESSFinishingRaceFragment.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finishing/ESSFinishingRaceFragment.java
@@ -2,7 +2,7 @@ package com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.finishing;
 
 import android.os.Bundle;
 
-import com.sap.sailing.domain.racelog.state.racingprocedure.ess.ESSRacingProcedure;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ess.ESSRacingProcedure;
 import com.sap.sailing.racecommittee.app.R;
 import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.PositioningFragment;
 import com.sap.sailing.racecommittee.app.utils.TimeUtils;
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finishing/GateStartFinishingRaceFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finishing/GateStartFinishingRaceFragment.java
index bcc22a42d8a..cab3cf3dbb2 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finishing/GateStartFinishingRaceFragment.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finishing/GateStartFinishingRaceFragment.java
@@ -1,6 +1,6 @@
 package com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.finishing;
 
-import com.sap.sailing.domain.racelog.state.racingprocedure.gate.GateStartRacingProcedure;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.GateStartRacingProcedure;
 
 public class GateStartFinishingRaceFragment extends BaseFinishingRaceFragment {
 
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finishing/RRS26FinishingRaceFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finishing/RRS26FinishingRaceFragment.java
index ffc90f06c3f..a006f47d3e2 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finishing/RRS26FinishingRaceFragment.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/finishing/RRS26FinishingRaceFragment.java
@@ -1,6 +1,6 @@
 package com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.finishing;
 
-import com.sap.sailing.domain.racelog.state.racingprocedure.rrs26.RRS26RacingProcedure;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.RRS26RacingProcedure;
 
 public class RRS26FinishingRaceFragment extends BaseFinishingRaceFragment {
 
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/running/BaseRunningRaceFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/running/BaseRunningRaceFragment.java
index 4af6e51cf92..e72ebbbc9dd 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/running/BaseRunningRaceFragment.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/running/BaseRunningRaceFragment.java
@@ -11,7 +11,7 @@ import android.widget.ImageButton;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
-import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedure;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedure;
 import com.sap.sailing.racecommittee.app.R;
 import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.AbortTypeSelectionDialog;
 import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.RaceDialogFragment;
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/running/BasicRunningRaceFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/running/BasicRunningRaceFragment.java
index 30b6412097e..f342b27da2c 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/running/BasicRunningRaceFragment.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/running/BasicRunningRaceFragment.java
@@ -1,6 +1,6 @@
 package com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.running;
 
-import com.sap.sailing.domain.racelog.state.racingprocedure.basic.BasicRacingProcedure;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.basic.BasicRacingProcedure;
 
 public class BasicRunningRaceFragment extends BaseRunningRaceFragment {
 
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/running/ESSRunningRaceFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/running/ESSRunningRaceFragment.java
index ba29a38fca6..38caeb3157c 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/running/ESSRunningRaceFragment.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/running/ESSRunningRaceFragment.java
@@ -1,6 +1,6 @@
 package com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.running;
 
-import com.sap.sailing.domain.racelog.state.racingprocedure.ess.ESSRacingProcedure;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ess.ESSRacingProcedure;
 import com.sap.sse.common.impl.MillisecondsTimePoint;
 
 public class ESSRunningRaceFragment extends BaseRunningRaceFragment {
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/running/GateStartRunningRaceFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/running/GateStartRunningRaceFragment.java
index 01d7f6345ed..6ce9c36a31e 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/running/GateStartRunningRaceFragment.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/running/GateStartRunningRaceFragment.java
@@ -1,10 +1,10 @@
 package com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.running;
 
-import com.sap.sailing.domain.racelog.state.racingprocedure.ReadonlyRacingProcedure;
-import com.sap.sailing.domain.racelog.state.racingprocedure.gate.GateStartChangedListener;
-import com.sap.sailing.domain.racelog.state.racingprocedure.gate.GateStartRacingProcedure;
-import com.sap.sailing.domain.racelog.state.racingprocedure.gate.ReadonlyGateStartRacingProcedure;
-import com.sap.sailing.domain.racelog.state.racingprocedure.impl.BaseRacingProcedureChangedListener;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ReadonlyRacingProcedure;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.GateStartChangedListener;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.GateStartRacingProcedure;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.ReadonlyGateStartRacingProcedure;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.BaseRacingProcedureChangedListener;
 
 public class GateStartRunningRaceFragment extends BaseRunningRaceFragment {
 
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/running/RRS26RunningRaceFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/running/RRS26RunningRaceFragment.java
index d82fb658e73..21fbbe209bd 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/running/RRS26RunningRaceFragment.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/running/RRS26RunningRaceFragment.java
@@ -3,10 +3,10 @@ package com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.running;
 import android.view.View;
 import android.widget.Toast;
 
-import com.sap.sailing.domain.racelog.state.racingprocedure.impl.BaseRacingProcedureChangedListener;
-import com.sap.sailing.domain.racelog.state.racingprocedure.rrs26.RRS26ChangedListener;
-import com.sap.sailing.domain.racelog.state.racingprocedure.rrs26.RRS26RacingProcedure;
-import com.sap.sailing.domain.racelog.state.racingprocedure.rrs26.ReadonlyRRS26RacingProcedure;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.BaseRacingProcedureChangedListener;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.RRS26ChangedListener;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.RRS26RacingProcedure;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.ReadonlyRRS26RacingProcedure;
 import com.sap.sailing.racecommittee.app.R;
 
 public class RRS26RunningRaceFragment extends BaseRunningRaceFragment {
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/startphase/BaseStartphaseRaceFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/startphase/BaseStartphaseRaceFragment.java
index c034abf4a14..388a7f55fc6 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/startphase/BaseStartphaseRaceFragment.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/startphase/BaseStartphaseRaceFragment.java
@@ -12,8 +12,8 @@ import android.widget.LinearLayout;
 import android.widget.TextView;
 import android.widget.ToggleButton;
 
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedure;
 import com.sap.sailing.domain.common.racelog.Flags;
-import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedure;
 import com.sap.sailing.racecommittee.app.AppConstants;
 import com.sap.sailing.racecommittee.app.R;
 import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.AbortModeSelectionDialog;
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/startphase/BasicStartphaseRaceFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/startphase/BasicStartphaseRaceFragment.java
index 8e8b5eaba31..6ee39d70b5e 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/startphase/BasicStartphaseRaceFragment.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/startphase/BasicStartphaseRaceFragment.java
@@ -1,6 +1,6 @@
 package com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.startphase;
 
-import com.sap.sailing.domain.racelog.state.racingprocedure.basic.BasicRacingProcedure;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.basic.BasicRacingProcedure;
 
 
 public class BasicStartphaseRaceFragment extends BaseStartphaseRaceFragment {
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/startphase/ESSStartphaseRaceFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/startphase/ESSStartphaseRaceFragment.java
index f3cc9869dfd..c45cedce925 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/startphase/ESSStartphaseRaceFragment.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/startphase/ESSStartphaseRaceFragment.java
@@ -7,9 +7,9 @@ import android.widget.Button;
 import android.widget.CompoundButton;
 import android.widget.ToggleButton;
 
+import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationType;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ess.ESSRacingProcedure;
 import com.sap.sailing.domain.common.racelog.RacingProcedureType;
-import com.sap.sailing.domain.racelog.scoring.AdditionalScoringInformationType;
-import com.sap.sailing.domain.racelog.state.racingprocedure.ess.ESSRacingProcedure;
 import com.sap.sailing.racecommittee.app.R;
 import com.sap.sse.common.TimePoint;
 import com.sap.sse.common.impl.MillisecondsTimePoint;
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/startphase/GateStartStartphaseRaceFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/startphase/GateStartStartphaseRaceFragment.java
index df30c871555..bd21992fb51 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/startphase/GateStartStartphaseRaceFragment.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/startphase/GateStartStartphaseRaceFragment.java
@@ -7,10 +7,10 @@ import android.view.View.OnClickListener;
 import android.widget.Button;
 import android.widget.TextView;
 
-import com.sap.sailing.domain.racelog.state.racingprocedure.gate.GateStartChangedListener;
-import com.sap.sailing.domain.racelog.state.racingprocedure.gate.GateStartRacingProcedure;
-import com.sap.sailing.domain.racelog.state.racingprocedure.gate.ReadonlyGateStartRacingProcedure;
-import com.sap.sailing.domain.racelog.state.racingprocedure.impl.BaseRacingProcedureChangedListener;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.GateStartChangedListener;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.GateStartRacingProcedure;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.ReadonlyGateStartRacingProcedure;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.BaseRacingProcedureChangedListener;
 import com.sap.sailing.racecommittee.app.R;
 import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.RaceDialogFragment;
 import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.prerequisite.RaceChooseGateLaunchTimesDialog;
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/startphase/RRS26StartphaseRaceFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/startphase/RRS26StartphaseRaceFragment.java
index 4fb8c96d87a..94bcf5294f6 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/startphase/RRS26StartphaseRaceFragment.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/startphase/RRS26StartphaseRaceFragment.java
@@ -6,11 +6,11 @@ import android.view.View.OnClickListener;
 import android.widget.Button;
 import android.widget.ImageButton;
 
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.BaseRacingProcedureChangedListener;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.RRS26ChangedListener;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.RRS26RacingProcedure;
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.ReadonlyRRS26RacingProcedure;
 import com.sap.sailing.domain.common.racelog.RacingProcedureType;
-import com.sap.sailing.domain.racelog.state.racingprocedure.impl.BaseRacingProcedureChangedListener;
-import com.sap.sailing.domain.racelog.state.racingprocedure.rrs26.RRS26ChangedListener;
-import com.sap.sailing.domain.racelog.state.racingprocedure.rrs26.RRS26RacingProcedure;
-import com.sap.sailing.domain.racelog.state.racingprocedure.rrs26.ReadonlyRRS26RacingProcedure;
 import com.sap.sailing.racecommittee.app.R;
 import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.RaceDialogFragment;
 import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.prerequisite.RaceChooseStartModeDialog;
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/utils/FlagPoleStateRenderer.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/utils/FlagPoleStateRenderer.java
index 75ebe4ba62a..1183ee7906a 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/utils/FlagPoleStateRenderer.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/utils/FlagPoleStateRenderer.java
@@ -8,9 +8,9 @@ import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.Toast;
 
+import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.FlagPoleState;
 import com.sap.sailing.domain.common.racelog.FlagPole;
 import com.sap.sailing.domain.common.racelog.Flags;
-import com.sap.sailing.domain.racelog.state.racingprocedure.FlagPoleState;
 import com.sap.sailing.racecommittee.app.domain.ManagedRace;
 import com.sap.sailing.android.shared.logging.ExLog;
 import com.sap.sse.common.Util;
diff --git a/wiki/amazon-ec2.md b/wiki/amazon-ec2.md
index 90049c25aaf..52847825553 100644
--- a/wiki/amazon-ec2.md
+++ b/wiki/amazon-ec2.md
@@ -72,6 +72,7 @@ INSTALL_FROM_RELEASE=(name-of-release)
 USE_ENVIRONMENT=live-replica-server
 REPLICATE_MASTER_SERVLET_HOST=(IP of your master server)
 REPLICATE_MASTER_EXCHANGE_NAME=myspecificevent
+REPLICATE_ON_START=com.sap.sailing.server.impl.RacingEventServiceImpl,com.sap.sse.security.impl.SecurityServiceImpl
 SERVER_NAME=MYSPECIFICEVENT
 MONGODB_NAME=myspecificevent-replica
 EVENT_ID=<some-uuid-of-an-event-you-want-to-feature>
@@ -375,4 +376,4 @@ Follow these steps to upgrade the AMI:
 Elastic Load Balancer (ELB)Service that makes it possible to balance over services running on different instances.
 Network InterfacesVirtual network interfaces that are mapped to physical network interfaces on instances. 
 Placement GroupsEnables applications to get the full-bisection bandwidth and low-latency network performance required for tightly coupled, node-to-node communication. Placement Groups can only contain HVM instance and have other limitations described here: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using_cluster_computing.html
-
\ No newline at end of file
+
diff --git a/wiki/onboarding.md b/wiki/onboarding.md
index be1aa7a38c3..ce26b086fe3 100644
--- a/wiki/onboarding.md
+++ b/wiki/onboarding.md
@@ -60,7 +60,7 @@ First of all, make sure you've looked at http://www.amazon.de/Patterns-Elements-
   * Go to Windows->Preferences->Google->Errors/Warnings and set "Missing SDK" to "Ignore"
   * Import all Race Analysis projects from the `java/` subdirectory of the git main folder
   * Import all projects from the `mobile/` subdirectory of the git main folder; this in particular contains the race committee app projects
-  * Set the Eclipse target platform to race-analysis-p2-ide-local.target (located in com.sap.sailing.targetplatform/definitions)
+  * Set the Eclipse target platform to race-analysis-p2-remote.target (located in com.sap.sailing.targetplatform/definitions)
   * Wait until the target platform has been resolved completely
   * In the project com.sap.sailing.gwt.ui create a new subfolder "classes" in the folder WEB-INF
   * Rebuild all projects
@@ -122,4 +122,4 @@ To deploy an Android project (for example com.sap.sailing.racecommittee.app) to
 `
 
 
-See [RaceCommittee App](racecommittee-app) for more information regarding the mobile app.
\ No newline at end of file
+See [RaceCommittee App](racecommittee-app) for more information regarding the mobile app.
diff --git a/wiki/typical-development-scenarios.md b/wiki/typical-development-scenarios.md
index 3dfc74f7616..36940be2053 100644
--- a/wiki/typical-development-scenarios.md
+++ b/wiki/typical-development-scenarios.md
@@ -11,8 +11,11 @@ Add a New Library which can not be found in any SAP Repository
 *	In case the library is not OSGi-enabled someone has to create such a OSGi-enabled version (ask the technical lead of the project)
 *	Add the library to an appropriate target folder under plugins/ in the project com.sap.sailing.targetplatform.base (e.g. target-base)
 *	Add a corresponding entry to the corresponding feature.xml in the project com.sap.sailing.targetplatform.base
-*	Rebuild the base target platform by running the script `createLocalBaseP2repository.sh` (com.sap.sailing.targetplatform/scripts). The script needs to be adjusted to your local paths for your Eclipse and GIT workspace directories.
-*	Test the new overall target platform by settings the race-analysis-p2-ide-p2admin.target as target platform in the IDE
+*	Rebuild the base target platform by running the script `createLocalBaseP2repository.sh` (com.sap.sailing.targetplatform/scripts).
+*	Generate the target definition for this local repository by running the script `createLocalTargetDef.sh` (same folder as above)
+*	Test the new overall target platform
+	* by setting the race-analysis-p2-local.target as target platform in the IDE
+	* by running the local maven build via ``buildAndUpdateProduct.sh -v build`` (the ``-v`` switch builds and uses the local p2 repository)
 *	The admin of the central p2 repository (currently at sapsailing.com) must now replace the content of the central server /home/trac/p2-repositories/sailing with the content of the new local base p2 repository (com.sap.sailing.targetplatform/base/gen/p2), using the `uploadRepositoryToServer.sh` script
 *	Reload the target platform in the IDE
 
@@ -207,4 +210,4 @@ Experience has shown that sometimes the SAP HTTP proxy doesn't properly resolve
 
 Run this inside a tmux window to be sure that logging off does not interrupt the process. After the process completes, copy the resulting declination- file to your git workspace to `java/com.sap.sailing.declination/resources` and commit.
 
-There is also a script java/target/importdeclination that automates these steps.
\ No newline at end of file
+There is also a script java/target/importdeclination that automates these steps.