diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/SharedDomainFactory.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/SharedDomainFactory.java index 03d08f83a2f..fe540d2ebbe 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/SharedDomainFactory.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/SharedDomainFactory.java @@ -1,8 +1,10 @@ package com.sap.sailing.domain.base; import java.io.Serializable; +import java.util.List; import java.util.UUID; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; import com.sap.sailing.domain.common.MarkType; import com.sap.sailing.domain.common.NauticalSide; @@ -81,6 +83,8 @@ public interface SharedDomainFactory { CourseArea getOrCreateCourseArea(Serializable courseAreaId, String name); CourseArea getExistingCourseAreaById(Serializable courseAreaId); + + DeviceConfigurationMatcher getOrCreateDeviceConfigurationMatcher(DeviceConfigurationMatcher.Type type, List clientIdentifiers); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/DeviceConfigurationMatcher.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/DeviceConfigurationMatcher.java index d504d5d2a3a..4bbcab44985 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/DeviceConfigurationMatcher.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/DeviceConfigurationMatcher.java @@ -2,7 +2,9 @@ package com.sap.sailing.domain.base.configuration; import java.io.Serializable; -public interface DeviceConfigurationMatcher extends Serializable { +import com.sap.sailing.domain.base.IsManagedBySharedDomainFactory; + +public interface DeviceConfigurationMatcher extends IsManagedBySharedDomainFactory, Serializable { final static int RANK_SINGLE = 1; final static int RANK_MULTI = 2; final static int RANK_ANY = 3; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherAny.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherAny.java index 51c9be5cd77..5d748b32365 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherAny.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherAny.java @@ -1,7 +1,10 @@ package com.sap.sailing.domain.base.configuration.impl; import java.io.Serializable; +import java.util.Collections; +import com.sap.sailing.domain.base.IsManagedBySharedDomainFactory; +import com.sap.sailing.domain.base.SharedDomainFactory; import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier; import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; @@ -30,4 +33,9 @@ public enum DeviceConfigurationMatcherAny implements DeviceConfigurationMatcher return DeviceConfigurationMatcherAny.class.getSimpleName(); } + @Override + public IsManagedBySharedDomainFactory resolve(SharedDomainFactory domainFactory) { + return domainFactory.getOrCreateDeviceConfigurationMatcher(getMatcherType(), Collections.emptyList()); + } + } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherMulti.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherMulti.java index 2f3b8e625b2..e1898af6b02 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherMulti.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherMulti.java @@ -5,6 +5,8 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import com.sap.sailing.domain.base.IsManagedBySharedDomainFactory; +import com.sap.sailing.domain.base.SharedDomainFactory; import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier; import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; @@ -47,5 +49,10 @@ public class DeviceConfigurationMatcherMulti implements DeviceConfigurationMatch public String toString() { return "DeviceConfigurationMatcherMulti [clientIdentifiers=" + clientIdentifiers + "]"; } + + @Override + public IsManagedBySharedDomainFactory resolve(SharedDomainFactory domainFactory) { + return domainFactory.getOrCreateDeviceConfigurationMatcher(getMatcherType(), clientIdentifiers); + } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherSingle.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherSingle.java index 14317582ef1..32df2da8a02 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherSingle.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherSingle.java @@ -1,7 +1,10 @@ package com.sap.sailing.domain.base.configuration.impl; import java.io.Serializable; +import java.util.Arrays; +import com.sap.sailing.domain.base.IsManagedBySharedDomainFactory; +import com.sap.sailing.domain.base.SharedDomainFactory; import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier; import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; @@ -43,4 +46,9 @@ public class DeviceConfigurationMatcherSingle implements DeviceConfigurationMatc return "DeviceConfigurationMatcherSingle [clientIdentifier=" + clientIdentifier + "]"; } + @Override + public IsManagedBySharedDomainFactory resolve(SharedDomainFactory domainFactory) { + return domainFactory.getOrCreateDeviceConfigurationMatcher(getMatcherType(), Arrays.asList(clientIdentifier)); + } + } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/DomainFactory.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/DomainFactory.java index 6d6ae18134e..1d134a5af02 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/DomainFactory.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/DomainFactory.java @@ -113,7 +113,5 @@ public interface DomainFactory extends SharedDomainFactory { * @param trackedRace must not be null */ void updateRaceDTOWithTrackedRaceData(TrackedRace trackedRace, RaceDTO raceDTO); - - DeviceConfigurationMatcher getOrCreateDeviceConfigurationMatcher(DeviceConfigurationMatcher.Type type, List clientIdentifiers); } diff --git a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/DeviceConfigurationReplicationTest.java b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/DeviceConfigurationReplicationTest.java new file mode 100644 index 00000000000..cb61afdfa1d --- /dev/null +++ b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/DeviceConfigurationReplicationTest.java @@ -0,0 +1,27 @@ +package com.sap.sailing.server.replication.test; + +import static org.junit.Assert.assertEquals; + +import java.util.Map; + +import org.junit.Test; + +import com.sap.sailing.domain.base.configuration.DeviceConfiguration; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; +import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationImpl; +import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcherAny; + +public class DeviceConfigurationReplicationTest extends AbstractServerReplicationTest { + + @Test + public void testEventReplication() throws InterruptedException { + DeviceConfigurationMatcher matcher = DeviceConfigurationMatcherAny.INSTANCE; + DeviceConfigurationImpl configuration = new DeviceConfigurationImpl(); + master.createOrUpdateDeviceConfiguration(matcher, configuration); + + Thread.sleep(1000); + Map configurationMap = replica.getAllDeviceConfigurations(); + assertEquals(1, configurationMap.size()); + assertEquals(matcher.getMatcherType(), configurationMap.keySet().iterator().next().getMatcherType()); + } +} diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java index 02389d4e3bd..b72c61ea323 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java @@ -131,10 +131,12 @@ import com.sap.sailing.server.operationaltransformation.AddRaceDefinition; import com.sap.sailing.server.operationaltransformation.AddSpecificRegatta; import com.sap.sailing.server.operationaltransformation.ConnectTrackedRaceToLeaderboardColumn; import com.sap.sailing.server.operationaltransformation.CreateEvent; +import com.sap.sailing.server.operationaltransformation.CreateOrUpdateDeviceConfiguration; import com.sap.sailing.server.operationaltransformation.CreateTrackedRace; import com.sap.sailing.server.operationaltransformation.RecordCompetitorGPSFix; import com.sap.sailing.server.operationaltransformation.RecordMarkGPSFix; import com.sap.sailing.server.operationaltransformation.RecordWindFix; +import com.sap.sailing.server.operationaltransformation.RemoveDeviceConfiguration; import com.sap.sailing.server.operationaltransformation.RemoveEvent; import com.sap.sailing.server.operationaltransformation.RemoveMediaTrackOperation; import com.sap.sailing.server.operationaltransformation.RemoveWindFix; @@ -2131,16 +2133,18 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen public void createOrUpdateDeviceConfiguration(DeviceConfigurationMatcher matcher, DeviceConfiguration configuration) { synchronized (configurationMap) { configurationMap.put(matcher, configuration); - mongoObjectFactory.storeDeviceConfiguration(matcher, configuration); } + mongoObjectFactory.storeDeviceConfiguration(matcher, configuration); + replicate(new CreateOrUpdateDeviceConfiguration(matcher, configuration)); } @Override public void removeDeviceConfiguration(DeviceConfigurationMatcher matcher) { synchronized (configurationMap) { configurationMap.remove(matcher); - mongoObjectFactory.removeDeviceConfiguration(matcher); } + mongoObjectFactory.removeDeviceConfiguration(matcher); + replicate(new RemoveDeviceConfiguration(matcher)); } @Override diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AbstractDeviceConfigurationOperation.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AbstractDeviceConfigurationOperation.java new file mode 100644 index 00000000000..5e1853c025f --- /dev/null +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AbstractDeviceConfigurationOperation.java @@ -0,0 +1,27 @@ +package com.sap.sailing.server.operationaltransformation; + +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; +import com.sap.sailing.server.RacingEventServiceOperation; + +public abstract class AbstractDeviceConfigurationOperation extends AbstractRacingEventServiceOperation { + + private static final long serialVersionUID = -4918619894046424881L; + + protected DeviceConfigurationMatcher matcher; + + public AbstractDeviceConfigurationOperation(DeviceConfigurationMatcher matcher) { + this.matcher = matcher; + } + + @Override + public RacingEventServiceOperation transformClientOp(RacingEventServiceOperation serverOp) { + return null; + } + + @Override + public RacingEventServiceOperation transformServerOp(RacingEventServiceOperation clientOp) { + return null; + } + + +} diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/CreateOrUpdateDeviceConfiguration.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/CreateOrUpdateDeviceConfiguration.java new file mode 100644 index 00000000000..69c7d3e966b --- /dev/null +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/CreateOrUpdateDeviceConfiguration.java @@ -0,0 +1,24 @@ +package com.sap.sailing.server.operationaltransformation; + +import com.sap.sailing.domain.base.configuration.DeviceConfiguration; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; +import com.sap.sailing.server.RacingEventService; + +public class CreateOrUpdateDeviceConfiguration extends AbstractDeviceConfigurationOperation { + + private static final long serialVersionUID = -3859272800957110301L; + + private DeviceConfiguration configuration; + + public CreateOrUpdateDeviceConfiguration(DeviceConfigurationMatcher matcher, DeviceConfiguration configuration) { + super(matcher); + this.configuration = configuration; + } + + @Override + public Void internalApplyTo(RacingEventService toState) throws Exception { + toState.createOrUpdateDeviceConfiguration(matcher, configuration); + return null; + } + +} diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/RemoveDeviceConfiguration.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/RemoveDeviceConfiguration.java new file mode 100644 index 00000000000..4f3a22b8db7 --- /dev/null +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/RemoveDeviceConfiguration.java @@ -0,0 +1,21 @@ +package com.sap.sailing.server.operationaltransformation; + +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; +import com.sap.sailing.server.RacingEventService; + +public class RemoveDeviceConfiguration extends AbstractDeviceConfigurationOperation { + + private static final long serialVersionUID = 4558840313811769137L; + + public RemoveDeviceConfiguration(DeviceConfigurationMatcher matcher) { + super(matcher); + } + + @Override + public Void internalApplyTo(RacingEventService toState) throws Exception { + toState.removeDeviceConfiguration(matcher); + return null; + } + + +} diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/DomainFactoryImpl.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/DomainFactoryImpl.java index 0104e18fb39..90cd0669611 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/DomainFactoryImpl.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/DomainFactoryImpl.java @@ -4,11 +4,13 @@ import java.io.Serializable; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import android.annotation.SuppressLint; + import com.sap.sailing.domain.base.Boat; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; @@ -20,6 +22,8 @@ import com.sap.sailing.domain.base.Nationality; import com.sap.sailing.domain.base.SharedDomainFactory; import com.sap.sailing.domain.base.Team; import com.sap.sailing.domain.base.Waypoint; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher.Type; import com.sap.sailing.domain.base.impl.BoatClassImpl; import com.sap.sailing.domain.base.impl.CompetitorImpl; import com.sap.sailing.domain.base.impl.CourseAreaImpl; @@ -167,4 +171,9 @@ public enum DomainFactoryImpl implements SharedDomainFactory { return courseAreaCache.get(courseAreaId); } + @Override + public DeviceConfigurationMatcher getOrCreateDeviceConfigurationMatcher(Type type, List clientIdentifiers) { + throw new UnsupportedOperationException("Not yet implemented"); + } + }