From 0879ca76004d2061aba9d2d6f3c9dd37031e2206 Mon Sep 17 00:00:00 2001 From: Fredrik Teschke Date: Tue, 28 Jan 2014 18:12:21 +0100 Subject: [PATCH] added DeviceTypeIdentifier and related files from cmd-android-tracking branch --- .../META-INF/MANIFEST.MF | 1 + .../persistence/DomainObjectFactory.java | 3 + .../persistence/MongoObjectFactory.java | 2 + .../DeviceIdentifierPersistenceHandler.java | 17 +++++ .../impl/DomainObjectFactoryImpl.java | 13 +++- .../impl/MongoObjectFactoryImpl.java | 11 +++ .../META-INF/MANIFEST.MF | 1 + .../domain/devices/DeviceIdentifier.java | 23 ++++++ .../devices/SmartphoneImeiIdentifier.java | 45 ++++++++++++ .../.classpath | 7 ++ .../.gitignore | 1 + .../.project | 28 ++++++++ .../.settings/org.eclipse.jdt.core.prefs | 8 +++ .../.settings/org.eclipse.pde.core.prefs | 4 ++ .../META-INF/MANIFEST.MF | 9 +++ .../build.properties | 4 ++ .../pom.xml | 12 ++++ .../.classpath | 7 ++ .../.project | 28 ++++++++ .../.settings/org.eclipse.jdt.core.prefs | 7 ++ .../.settings/org.eclipse.pde.core.prefs | 3 + .../META-INF/MANIFEST.MF | 14 ++++ .../build.properties | 4 ++ .../pom.xml | 12 ++++ .../mock/MockDeviceTypeServiceFinder.java | 26 +++++++ .../.classpath | 7 ++ .../.gitignore | 1 + .../.project | 28 ++++++++ .../.settings/org.eclipse.jdt.core.prefs | 8 +++ .../.settings/org.eclipse.pde.core.prefs | 4 ++ .../META-INF/MANIFEST.MF | 21 ++++++ .../build.properties | 4 ++ .../pom.xml | 12 ++++ .../DeviceNotMappedException.java | 18 +++++ .../smartphoneadapter/impl/Activator.java | 32 +++++++++ .../impl/SmartphoneImeiHandlerImpl.java | 29 ++++++++ .../META-INF/MANIFEST.MF | 1 + .../devices/DeviceTypeServiceFinder.java | 5 ++ ...ondingDeviceMapperRegisteredException.java | 20 ++++++ .../raceanalysis.product | 3 +- java/com.sap.sailing.feature/feature.xml | 7 ++ .../SailingServer (No Proxy).launch | 72 +++++++++---------- ...ingServer (No Proxy, Jetty on 8889).launch | 2 +- ...o Proxy, Jetty on 8889, Monitoring).launch | 2 +- .../SailingServer (No Proxy, No Tests).launch | 2 +- ...ver (No Proxy, Remote Debug SAP VM).launch | 2 +- .../SailingServer (Proxy).launch | 62 ++++++++-------- ...ailingServer (Proxy, Jetty on 8889).launch | 2 +- ...Server (Proxy, Remote Debug SAP VM).launch | 2 +- ...Proxy, SwissTiming Live Simulation).launch | 2 +- .../sailing/server/RacingEventService.java | 3 + .../sap/sailing/server/impl/Activator.java | 6 ++ .../impl/OsgiDeviceTypeServiceFinder.java | 48 +++++++++++++ .../server/impl/RacingEventServiceImpl.java | 9 +++ java/pom.xml | 3 + 55 files changed, 631 insertions(+), 76 deletions(-) create mode 100644 java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/devices/DeviceIdentifierPersistenceHandler.java create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/devices/DeviceIdentifier.java create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/devices/SmartphoneImeiIdentifier.java create mode 100644 java/com.sap.sailing.domain.smartphoneadapter.test/.classpath create mode 100644 java/com.sap.sailing.domain.smartphoneadapter.test/.gitignore create mode 100644 java/com.sap.sailing.domain.smartphoneadapter.test/.project create mode 100644 java/com.sap.sailing.domain.smartphoneadapter.test/.settings/org.eclipse.jdt.core.prefs create mode 100644 java/com.sap.sailing.domain.smartphoneadapter.test/.settings/org.eclipse.pde.core.prefs create mode 100644 java/com.sap.sailing.domain.smartphoneadapter.test/META-INF/MANIFEST.MF create mode 100644 java/com.sap.sailing.domain.smartphoneadapter.test/build.properties create mode 100644 java/com.sap.sailing.domain.smartphoneadapter.test/pom.xml create mode 100644 java/com.sap.sailing.domain.smartphoneadapter.testsupport/.classpath create mode 100644 java/com.sap.sailing.domain.smartphoneadapter.testsupport/.project create mode 100644 java/com.sap.sailing.domain.smartphoneadapter.testsupport/.settings/org.eclipse.jdt.core.prefs create mode 100644 java/com.sap.sailing.domain.smartphoneadapter.testsupport/.settings/org.eclipse.pde.core.prefs create mode 100644 java/com.sap.sailing.domain.smartphoneadapter.testsupport/META-INF/MANIFEST.MF create mode 100644 java/com.sap.sailing.domain.smartphoneadapter.testsupport/build.properties create mode 100644 java/com.sap.sailing.domain.smartphoneadapter.testsupport/pom.xml create mode 100644 java/com.sap.sailing.domain.smartphoneadapter.testsupport/src/com/sap/sailing/domain/test/mock/MockDeviceTypeServiceFinder.java create mode 100644 java/com.sap.sailing.domain.smartphoneadapter/.classpath create mode 100644 java/com.sap.sailing.domain.smartphoneadapter/.gitignore create mode 100644 java/com.sap.sailing.domain.smartphoneadapter/.project create mode 100644 java/com.sap.sailing.domain.smartphoneadapter/.settings/org.eclipse.jdt.core.prefs create mode 100644 java/com.sap.sailing.domain.smartphoneadapter/.settings/org.eclipse.pde.core.prefs create mode 100644 java/com.sap.sailing.domain.smartphoneadapter/META-INF/MANIFEST.MF create mode 100644 java/com.sap.sailing.domain.smartphoneadapter/build.properties create mode 100644 java/com.sap.sailing.domain.smartphoneadapter/pom.xml create mode 100644 java/com.sap.sailing.domain.smartphoneadapter/src/com/sap/sailing/domain/smartphoneadapter/DeviceNotMappedException.java create mode 100644 java/com.sap.sailing.domain.smartphoneadapter/src/com/sap/sailing/domain/smartphoneadapter/impl/Activator.java create mode 100644 java/com.sap.sailing.domain.smartphoneadapter/src/com/sap/sailing/domain/smartphoneadapter/impl/SmartphoneImeiHandlerImpl.java create mode 100644 java/com.sap.sailing.domain/src/com/sap/sailing/domain/devices/DeviceTypeServiceFinder.java create mode 100644 java/com.sap.sailing.domain/src/com/sap/sailing/domain/devices/NoCorrespondingDeviceMapperRegisteredException.java create mode 100644 java/com.sap.sailing.server/src/com/sap/sailing/server/impl/OsgiDeviceTypeServiceFinder.java diff --git a/java/com.sap.sailing.domain.persistence/META-INF/MANIFEST.MF b/java/com.sap.sailing.domain.persistence/META-INF/MANIFEST.MF index a6b892b6d84..b2d0e24a852 100755 --- a/java/com.sap.sailing.domain.persistence/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.domain.persistence/META-INF/MANIFEST.MF @@ -13,6 +13,7 @@ Require-Bundle: com.sap.sailing.mongodb, com.sap.sailing.domain.shared.android, com.sap.sailing.server.gateway.serialization;bundle-version="1.0.0" Export-Package: com.sap.sailing.domain.persistence, + com.sap.sailing.domain.persistence.devices, com.sap.sailing.domain.persistence.impl;x-friends:="com.sap.sailing.mongodb.test,com.sap.sailing.domain.swisstimingadapter.test,com.sap.sailing.domain.persistence.test", com.sap.sailing.domain.persistence.media Bundle-ActivationPolicy: lazy 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 721b2a7d4ec..3668753a8eb 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 @@ -15,6 +15,7 @@ import com.sap.sailing.domain.base.configuration.DeviceConfiguration; import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.WindSource; +import com.sap.sailing.domain.devices.DeviceTypeServiceFinder; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.LeaderboardGroup; import com.sap.sailing.domain.leaderboard.LeaderboardRegistry; @@ -102,4 +103,6 @@ public interface DomainObjectFactory { DomainFactory getBaseDomainFactory(); Iterable> loadAllDeviceConfigurations(); + + void setDeviceTypeServiceFinder(DeviceTypeServiceFinder finder); } diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/MongoObjectFactory.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/MongoObjectFactory.java index 174c4d98966..b65182097d0 100755 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/MongoObjectFactory.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/MongoObjectFactory.java @@ -12,6 +12,7 @@ import com.sap.sailing.domain.base.Series; import com.sap.sailing.domain.base.configuration.DeviceConfiguration; import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; import com.sap.sailing.domain.common.WindSource; +import com.sap.sailing.domain.devices.DeviceTypeServiceFinder; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.LeaderboardGroup; import com.sap.sailing.domain.tracking.TrackedRace; @@ -108,4 +109,5 @@ public interface MongoObjectFactory { void removeDeviceConfiguration(DeviceConfigurationMatcher matcher); + void setDeviceTypeServiceFinder(DeviceTypeServiceFinder finder); } diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/devices/DeviceIdentifierPersistenceHandler.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/devices/DeviceIdentifierPersistenceHandler.java new file mode 100644 index 00000000000..7dd12813e4b --- /dev/null +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/devices/DeviceIdentifierPersistenceHandler.java @@ -0,0 +1,17 @@ +package com.sap.sailing.domain.persistence.devices; + +import com.mongodb.DBObject; +import com.sap.sailing.domain.devices.DeviceIdentifier; + +public interface DeviceIdentifierPersistenceHandler { + /** + * Enrich the base object with the necessary data for this specific + * device identifier type. + * @param base + * @param deviceIdentifiers + * @return + */ + DBObject enrichDBObject(DBObject base, DeviceIdentifier deviceIdentifier) throws IllegalArgumentException; + + DeviceIdentifier loadFromDBObject(DBObject input); +} 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 95a990a9b28..f047d078054 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,12 +29,12 @@ import com.mongodb.util.JSON; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.ControlPoint; +import com.sap.sailing.domain.base.ControlPointWithTwoMarks; import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.DomainFactory; import com.sap.sailing.domain.base.Event; import com.sap.sailing.domain.base.Fleet; -import com.sap.sailing.domain.base.ControlPointWithTwoMarks; import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.RaceDefinition; @@ -81,6 +81,7 @@ import com.sap.sailing.domain.common.impl.WindSourceWithAdditionalID; 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.devices.DeviceTypeServiceFinder; import com.sap.sailing.domain.leaderboard.DelayedLeaderboardCorrections; import com.sap.sailing.domain.leaderboard.DelayedLeaderboardCorrections.LeaderboardCorrectionsResolvedListener; import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; @@ -141,6 +142,11 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { private RaceLogEventRestoreFactory raceLogEventFactory; private final DomainFactory baseDomainFactory; + + //use as follows: +// DeviceIdentifierPersistenceHandler handler = deviceTypeServiceFinder.findService( +// DeviceIdentifierPersistenceHandler.class, identifierType); + private static DeviceTypeServiceFinder deviceTypeServiceFinder; public DomainObjectFactoryImpl(DB db, DomainFactory baseDomainFactory) { super(); @@ -1449,4 +1455,9 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { } return configuration; } + + @Override + public void setDeviceTypeServiceFinder(DeviceTypeServiceFinder finder) { + deviceTypeServiceFinder = finder; + } } 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 4da744d4f1a..e4434635317 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 @@ -48,6 +48,7 @@ import com.sap.sailing.domain.common.WindSource; import com.sap.sailing.domain.common.impl.MillisecondsTimePoint; import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.common.impl.Util.Triple; +import com.sap.sailing.domain.devices.DeviceTypeServiceFinder; import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.LeaderboardGroup; @@ -86,6 +87,12 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { private static Logger logger = Logger.getLogger(MongoObjectFactoryImpl.class.getName()); private final DB database; private final CompetitorJsonSerializer competitorSerializer = CompetitorJsonSerializer.create(); + + //use as follows: +// DeviceIdentifierPersistenceHandler handler = +// deviceTypeServiceFinder.findService( +// DeviceIdentifierPersistenceHandler.class, identifierType); + private static DeviceTypeServiceFinder deviceTypeServiceFinder; public MongoObjectFactoryImpl(DB database) { super(); @@ -966,4 +973,8 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { configurationsCollections.remove(query); } + @Override + public void setDeviceTypeServiceFinder(DeviceTypeServiceFinder finder) { + deviceTypeServiceFinder = finder; + } } 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 d4dca443728..7ff7b68edbb 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 @@ -13,6 +13,7 @@ Export-Package: com.sap.sailing.domain.base, com.sap.sailing.domain.base.impl, com.sap.sailing.domain.base.racegroup, com.sap.sailing.domain.base.racegroup.impl, + com.sap.sailing.domain.devices, com.sap.sailing.domain.racelog, com.sap.sailing.domain.racelog.analyzing.impl, com.sap.sailing.domain.racelog.impl, diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/devices/DeviceIdentifier.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/devices/DeviceIdentifier.java new file mode 100644 index 00000000000..a0fbfc991be --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/devices/DeviceIdentifier.java @@ -0,0 +1,23 @@ +package com.sap.sailing.domain.devices; + +import com.sap.sailing.domain.base.IsManagedBySharedDomainFactory; + +public interface DeviceIdentifier extends IsManagedBySharedDomainFactory { + public static final String TYPE = "type"; + + /** + * This type identifier is used to determine what adapter shall be used to resolve this device identifier. For + * example, the smartphone adapter is used to resolve smartphone identifiers, while in future an Igtimi adapter + * might be used to resolve Igtimi identifiers. + * + * The string is used to look up OSGi services such as {@link com.sap.sailing.server.devices.DeviceMapper}s and + * {@link com.sap.sailing.domain.persistence.devices.DeviceIdentifierPersistenceHandler}s. + * + * The reason for this design choice is that in future, third parties could easily write their own adapter and only + * have to register new OSGi service, and not touch the SAP Sailing Analytics code. + * + * @return + */ + String getIdentifierType(); + +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/devices/SmartphoneImeiIdentifier.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/devices/SmartphoneImeiIdentifier.java new file mode 100644 index 00000000000..43d552f7e4a --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/devices/SmartphoneImeiIdentifier.java @@ -0,0 +1,45 @@ +package com.sap.sailing.domain.devices; + +import java.util.HashMap; +import java.util.Map; + +import com.sap.sailing.domain.base.SharedDomainFactory; + +public class SmartphoneImeiIdentifier implements DeviceIdentifier { + public static final String TYPE = "smartphoneImei"; + + private static final Map cache = new HashMap(); + + private final String imei; + + public SmartphoneImeiIdentifier(String imei) { + this.imei = imei; + } + + @Override + public DeviceIdentifier resolve(SharedDomainFactory domainFactory) { + // ignore the domainFactory + + DeviceIdentifier result = cache.get(imei); + if (result == null) { + cache.put(imei, this); + return this; + } + return result; + } + + public String getImei() { + return imei; + } + + @Override + public String getIdentifierType() { + return TYPE; + } + + @Override + public String toString() { + return "IMEI " + imei; + } + +} diff --git a/java/com.sap.sailing.domain.smartphoneadapter.test/.classpath b/java/com.sap.sailing.domain.smartphoneadapter.test/.classpath new file mode 100644 index 00000000000..e8ea977a694 --- /dev/null +++ b/java/com.sap.sailing.domain.smartphoneadapter.test/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/java/com.sap.sailing.domain.smartphoneadapter.test/.gitignore b/java/com.sap.sailing.domain.smartphoneadapter.test/.gitignore new file mode 100644 index 00000000000..ba077a4031a --- /dev/null +++ b/java/com.sap.sailing.domain.smartphoneadapter.test/.gitignore @@ -0,0 +1 @@ +bin diff --git a/java/com.sap.sailing.domain.smartphoneadapter.test/.project b/java/com.sap.sailing.domain.smartphoneadapter.test/.project new file mode 100644 index 00000000000..d54173a85ff --- /dev/null +++ b/java/com.sap.sailing.domain.smartphoneadapter.test/.project @@ -0,0 +1,28 @@ + + + com.sap.sailing.domain.smartphoneadapter.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.sailing.domain.smartphoneadapter.test/.settings/org.eclipse.jdt.core.prefs b/java/com.sap.sailing.domain.smartphoneadapter.test/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000000..eb01f948334 --- /dev/null +++ b/java/com.sap.sailing.domain.smartphoneadapter.test/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +#Thu Jan 19 09:52:18 CET 2012 +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.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.sailing.domain.smartphoneadapter.test/.settings/org.eclipse.pde.core.prefs b/java/com.sap.sailing.domain.smartphoneadapter.test/.settings/org.eclipse.pde.core.prefs new file mode 100644 index 00000000000..82689ad754c --- /dev/null +++ b/java/com.sap.sailing.domain.smartphoneadapter.test/.settings/org.eclipse.pde.core.prefs @@ -0,0 +1,4 @@ +#Thu Aug 25 17:11:24 CEST 2011 +eclipse.preferences.version=1 +pluginProject.extensions=false +resolve.requirebundle=false diff --git a/java/com.sap.sailing.domain.smartphoneadapter.test/META-INF/MANIFEST.MF b/java/com.sap.sailing.domain.smartphoneadapter.test/META-INF/MANIFEST.MF new file mode 100644 index 00000000000..f3449f7e285 --- /dev/null +++ b/java/com.sap.sailing.domain.smartphoneadapter.test/META-INF/MANIFEST.MF @@ -0,0 +1,9 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Smartphone Adapter Test +Bundle-SymbolicName: com.sap.sailing.domain.smartphoneadapter.test +Bundle-Version: 1.0.0.qualifier +Bundle-Vendor: SAP +Bundle-RequiredExecutionEnvironment: JavaSE-1.7 +Bundle-ClassPath: . +Require-Bundle: org.junit4;bundle-version="4.8.2" diff --git a/java/com.sap.sailing.domain.smartphoneadapter.test/build.properties b/java/com.sap.sailing.domain.smartphoneadapter.test/build.properties new file mode 100644 index 00000000000..6b53438d1ce --- /dev/null +++ b/java/com.sap.sailing.domain.smartphoneadapter.test/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + ., diff --git a/java/com.sap.sailing.domain.smartphoneadapter.test/pom.xml b/java/com.sap.sailing.domain.smartphoneadapter.test/pom.xml new file mode 100644 index 00000000000..0b91f13f1ea --- /dev/null +++ b/java/com.sap.sailing.domain.smartphoneadapter.test/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + root + com.sap.sailing + 1.0.0-SNAPSHOT + + com.sap.sailing.domain.smartphoneadapter.test + eclipse-test-plugin + diff --git a/java/com.sap.sailing.domain.smartphoneadapter.testsupport/.classpath b/java/com.sap.sailing.domain.smartphoneadapter.testsupport/.classpath new file mode 100644 index 00000000000..098194ca4b7 --- /dev/null +++ b/java/com.sap.sailing.domain.smartphoneadapter.testsupport/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/java/com.sap.sailing.domain.smartphoneadapter.testsupport/.project b/java/com.sap.sailing.domain.smartphoneadapter.testsupport/.project new file mode 100644 index 00000000000..b3147811401 --- /dev/null +++ b/java/com.sap.sailing.domain.smartphoneadapter.testsupport/.project @@ -0,0 +1,28 @@ + + + com.sap.sailing.domain.smartphoneadapter.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.sailing.domain.smartphoneadapter.testsupport/.settings/org.eclipse.jdt.core.prefs b/java/com.sap.sailing.domain.smartphoneadapter.testsupport/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000000..f42de363afa --- /dev/null +++ b/java/com.sap.sailing.domain.smartphoneadapter.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.7 +org.eclipse.jdt.core.compiler.compliance=1.7 +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.sailing.domain.smartphoneadapter.testsupport/.settings/org.eclipse.pde.core.prefs b/java/com.sap.sailing.domain.smartphoneadapter.testsupport/.settings/org.eclipse.pde.core.prefs new file mode 100644 index 00000000000..f29e940a005 --- /dev/null +++ b/java/com.sap.sailing.domain.smartphoneadapter.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.sailing.domain.smartphoneadapter.testsupport/META-INF/MANIFEST.MF b/java/com.sap.sailing.domain.smartphoneadapter.testsupport/META-INF/MANIFEST.MF new file mode 100644 index 00000000000..b3c6e68f58e --- /dev/null +++ b/java/com.sap.sailing.domain.smartphoneadapter.testsupport/META-INF/MANIFEST.MF @@ -0,0 +1,14 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Testsupport +Bundle-SymbolicName: com.sap.sailing.domain.smartphoneadapter.testsupport +Bundle-Version: 1.0.0.qualifier +Bundle-Vendor: SAP +Bundle-RequiredExecutionEnvironment: JavaSE-1.7 +Require-Bundle: com.sap.sailing.domain.shared.android, + com.sap.sailing.domain, + com.sap.sailing.domain.common, + com.mongodb.driver, + com.sap.sailing.domain.persistence, + com.sap.sailing.domain.smartphoneadapter +Export-Package: com.sap.sailing.domain.test.mock diff --git a/java/com.sap.sailing.domain.smartphoneadapter.testsupport/build.properties b/java/com.sap.sailing.domain.smartphoneadapter.testsupport/build.properties new file mode 100644 index 00000000000..34d2e4d2dad --- /dev/null +++ b/java/com.sap.sailing.domain.smartphoneadapter.testsupport/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/java/com.sap.sailing.domain.smartphoneadapter.testsupport/pom.xml b/java/com.sap.sailing.domain.smartphoneadapter.testsupport/pom.xml new file mode 100644 index 00000000000..c54e63d21ee --- /dev/null +++ b/java/com.sap.sailing.domain.smartphoneadapter.testsupport/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + root + com.sap.sailing + 1.0.0-SNAPSHOT + + com.sap.sailing.domain.smartphoneadapter.testsupport + eclipse-plugin + diff --git a/java/com.sap.sailing.domain.smartphoneadapter.testsupport/src/com/sap/sailing/domain/test/mock/MockDeviceTypeServiceFinder.java b/java/com.sap.sailing.domain.smartphoneadapter.testsupport/src/com/sap/sailing/domain/test/mock/MockDeviceTypeServiceFinder.java new file mode 100644 index 00000000000..f32c71b2f5b --- /dev/null +++ b/java/com.sap.sailing.domain.smartphoneadapter.testsupport/src/com/sap/sailing/domain/test/mock/MockDeviceTypeServiceFinder.java @@ -0,0 +1,26 @@ +package com.sap.sailing.domain.test.mock; + +import com.sap.sailing.domain.devices.DeviceTypeServiceFinder; +import com.sap.sailing.domain.devices.SmartphoneImeiIdentifier; +import com.sap.sailing.domain.smartphoneadapter.impl.SmartphoneImeiHandlerImpl; + +/** + * A simplified implementation of the {@link DeviceTypeServiceFinder} interface that, when the device type + * {@link SmartphoneImeiIdentifier#TYPE} is requested, returns a specific handler that was passed to this object's + * constructor. + * + * @author Fredrik Teschke + * + */ +public class MockDeviceTypeServiceFinder implements DeviceTypeServiceFinder { + private final SmartphoneImeiHandlerImpl handler = new SmartphoneImeiHandlerImpl(); + + @SuppressWarnings("unchecked") + @Override + public ServiceType findService(Class clazz, String deviceType) { + if (deviceType.equals(SmartphoneImeiIdentifier.TYPE)) { + return (ServiceType) handler; + } + return null; + } +} diff --git a/java/com.sap.sailing.domain.smartphoneadapter/.classpath b/java/com.sap.sailing.domain.smartphoneadapter/.classpath new file mode 100644 index 00000000000..e8ea977a694 --- /dev/null +++ b/java/com.sap.sailing.domain.smartphoneadapter/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/java/com.sap.sailing.domain.smartphoneadapter/.gitignore b/java/com.sap.sailing.domain.smartphoneadapter/.gitignore new file mode 100644 index 00000000000..ba077a4031a --- /dev/null +++ b/java/com.sap.sailing.domain.smartphoneadapter/.gitignore @@ -0,0 +1 @@ +bin diff --git a/java/com.sap.sailing.domain.smartphoneadapter/.project b/java/com.sap.sailing.domain.smartphoneadapter/.project new file mode 100644 index 00000000000..a28ffc6ddc7 --- /dev/null +++ b/java/com.sap.sailing.domain.smartphoneadapter/.project @@ -0,0 +1,28 @@ + + + com.sap.sailing.domain.smartphoneadapter + + + + + + 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.sailing.domain.smartphoneadapter/.settings/org.eclipse.jdt.core.prefs b/java/com.sap.sailing.domain.smartphoneadapter/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000000..9e859eb5b06 --- /dev/null +++ b/java/com.sap.sailing.domain.smartphoneadapter/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +#Thu Jan 19 09:51:40 CET 2012 +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.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.sailing.domain.smartphoneadapter/.settings/org.eclipse.pde.core.prefs b/java/com.sap.sailing.domain.smartphoneadapter/.settings/org.eclipse.pde.core.prefs new file mode 100644 index 00000000000..eb2d1c6a2b2 --- /dev/null +++ b/java/com.sap.sailing.domain.smartphoneadapter/.settings/org.eclipse.pde.core.prefs @@ -0,0 +1,4 @@ +#Thu Aug 25 16:46:04 CEST 2011 +eclipse.preferences.version=1 +pluginProject.extensions=false +resolve.requirebundle=false diff --git a/java/com.sap.sailing.domain.smartphoneadapter/META-INF/MANIFEST.MF b/java/com.sap.sailing.domain.smartphoneadapter/META-INF/MANIFEST.MF new file mode 100644 index 00000000000..03bd41cd6bd --- /dev/null +++ b/java/com.sap.sailing.domain.smartphoneadapter/META-INF/MANIFEST.MF @@ -0,0 +1,21 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Smartphone Tracking Adapter +Bundle-SymbolicName: com.sap.sailing.domain.smartphoneadapter +Bundle-Version: 1.0.0.qualifier +Bundle-Vendor: SAP +Bundle-RequiredExecutionEnvironment: JavaSE-1.7 +Bundle-ActivationPolicy: lazy +Require-Bundle: com.sap.sailing.domain, + com.sap.sailing.domain.persistence, + com.mongodb.driver;bundle-version="2.6.2", + com.sap.sailing.domain.common, + net.sf.marineapi;bundle-version="0.5.0", + javax.servlet;bundle-version="2.5.0", + com.sap.sailing.domain.shared.android +Import-Package: org.osgi.framework;version="1.6.0", + org.json.simple, + org.json.simple.parser +Export-Package: com.sap.sailing.domain.smartphoneadapter, + com.sap.sailing.domain.smartphoneadapter.impl;x-friends:="com.sap.sailing.domain.smartphoneadapter.testsupport" +Bundle-Activator: com.sap.sailing.domain.smartphoneadapter.impl.Activator diff --git a/java/com.sap.sailing.domain.smartphoneadapter/build.properties b/java/com.sap.sailing.domain.smartphoneadapter/build.properties new file mode 100644 index 00000000000..34d2e4d2dad --- /dev/null +++ b/java/com.sap.sailing.domain.smartphoneadapter/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/java/com.sap.sailing.domain.smartphoneadapter/pom.xml b/java/com.sap.sailing.domain.smartphoneadapter/pom.xml new file mode 100644 index 00000000000..abaadbbf9c0 --- /dev/null +++ b/java/com.sap.sailing.domain.smartphoneadapter/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + root + com.sap.sailing + 1.0.0-SNAPSHOT + + com.sap.sailing.domain.smartphoneadapter + eclipse-plugin + diff --git a/java/com.sap.sailing.domain.smartphoneadapter/src/com/sap/sailing/domain/smartphoneadapter/DeviceNotMappedException.java b/java/com.sap.sailing.domain.smartphoneadapter/src/com/sap/sailing/domain/smartphoneadapter/DeviceNotMappedException.java new file mode 100644 index 00000000000..26b2d388804 --- /dev/null +++ b/java/com.sap.sailing.domain.smartphoneadapter/src/com/sap/sailing/domain/smartphoneadapter/DeviceNotMappedException.java @@ -0,0 +1,18 @@ +package com.sap.sailing.domain.smartphoneadapter; + +import com.sap.sailing.domain.devices.DeviceIdentifier; + +public class DeviceNotMappedException extends Exception { + private static final long serialVersionUID = 7343339139579578931L; + + private final DeviceIdentifier device; + + public DeviceNotMappedException(DeviceIdentifier device) { + this.device = device; + } + + @Override + public String toString() { + return "Device is not mapped to race and competitor: " + device; + } +} diff --git a/java/com.sap.sailing.domain.smartphoneadapter/src/com/sap/sailing/domain/smartphoneadapter/impl/Activator.java b/java/com.sap.sailing.domain.smartphoneadapter/src/com/sap/sailing/domain/smartphoneadapter/impl/Activator.java new file mode 100644 index 00000000000..15d71927d40 --- /dev/null +++ b/java/com.sap.sailing.domain.smartphoneadapter/src/com/sap/sailing/domain/smartphoneadapter/impl/Activator.java @@ -0,0 +1,32 @@ +package com.sap.sailing.domain.smartphoneadapter.impl; + +import java.util.Dictionary; +import java.util.Hashtable; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; + +import com.sap.sailing.domain.devices.DeviceIdentifier; +import com.sap.sailing.domain.devices.SmartphoneImeiIdentifier; +import com.sap.sailing.domain.persistence.devices.DeviceIdentifierPersistenceHandler; + +/** + * Registers an instance of {@link SmartphoneImeiHandlerImpl} as both, a {@link RaceLogTrackingDeviceHandler} as well as a + * {@link DeviceIdentifierPersistenceHandler} for devices of type {@link SmartphoneImeiIdentifier#TYPE}. + * + * @author Fredrik Teschke + * + */ +public class Activator implements BundleActivator { + @Override + public void start(BundleContext context) throws Exception { + SmartphoneImeiHandlerImpl handler = new SmartphoneImeiHandlerImpl(); + Dictionary properties = new Hashtable(); + properties.put(DeviceIdentifier.TYPE, SmartphoneImeiIdentifier.TYPE); + context.registerService(DeviceIdentifierPersistenceHandler.class, handler, properties); + } + + @Override + public void stop(BundleContext context) throws Exception { + } +} diff --git a/java/com.sap.sailing.domain.smartphoneadapter/src/com/sap/sailing/domain/smartphoneadapter/impl/SmartphoneImeiHandlerImpl.java b/java/com.sap.sailing.domain.smartphoneadapter/src/com/sap/sailing/domain/smartphoneadapter/impl/SmartphoneImeiHandlerImpl.java new file mode 100644 index 00000000000..245879587a7 --- /dev/null +++ b/java/com.sap.sailing.domain.smartphoneadapter/src/com/sap/sailing/domain/smartphoneadapter/impl/SmartphoneImeiHandlerImpl.java @@ -0,0 +1,29 @@ +package com.sap.sailing.domain.smartphoneadapter.impl; + +import com.mongodb.DBObject; +import com.sap.sailing.domain.devices.DeviceIdentifier; +import com.sap.sailing.domain.devices.SmartphoneImeiIdentifier; +import com.sap.sailing.domain.persistence.devices.DeviceIdentifierPersistenceHandler; + +public class SmartphoneImeiHandlerImpl implements DeviceIdentifierPersistenceHandler { +// private static final Logger logger = Logger.getLogger(SmartphoneImeiHandlerImpl.class.getName()); + + public static final String FIELD_IMEI = "imei"; + + @Override + public DBObject enrichDBObject(DBObject base, DeviceIdentifier deviceIdentifier) throws IllegalArgumentException { + if (!(deviceIdentifier instanceof SmartphoneImeiIdentifier)) { + throw new IllegalArgumentException(String.format( + "Unexpected device identifier of type %s while trying to persist smartphone IMEI identifier", + deviceIdentifier.getClass().getName())); + } + SmartphoneImeiIdentifier imeiIdentifier = (SmartphoneImeiIdentifier) deviceIdentifier; + base.put(FIELD_IMEI, imeiIdentifier.getImei()); + return base; + } + + @Override + public SmartphoneImeiIdentifier loadFromDBObject(DBObject input) { + return new SmartphoneImeiIdentifier((String) input.get(FIELD_IMEI)); + } +} diff --git a/java/com.sap.sailing.domain/META-INF/MANIFEST.MF b/java/com.sap.sailing.domain/META-INF/MANIFEST.MF index 2d92ade4488..d58416d7b8e 100755 --- a/java/com.sap.sailing.domain/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.domain/META-INF/MANIFEST.MF @@ -10,6 +10,7 @@ Export-Package: com.sap.sailing.domain.base, com.sap.sailing.domain.base.impl, com.sap.sailing.domain.confidence, com.sap.sailing.domain.confidence.impl;x-friends:="com.sap.sailing.domain.test", + com.sap.sailing.domain.devices, com.sap.sailing.domain.leaderboard, com.sap.sailing.domain.leaderboard.caching, com.sap.sailing.domain.leaderboard.impl, diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/devices/DeviceTypeServiceFinder.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/devices/DeviceTypeServiceFinder.java new file mode 100644 index 00000000000..a01df164517 --- /dev/null +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/devices/DeviceTypeServiceFinder.java @@ -0,0 +1,5 @@ +package com.sap.sailing.domain.devices; + +public interface DeviceTypeServiceFinder { + ServiceType findService(Class clazz, String deviceType); +} diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/devices/NoCorrespondingDeviceMapperRegisteredException.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/devices/NoCorrespondingDeviceMapperRegisteredException.java new file mode 100644 index 00000000000..158b571b602 --- /dev/null +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/devices/NoCorrespondingDeviceMapperRegisteredException.java @@ -0,0 +1,20 @@ +package com.sap.sailing.domain.devices; + +public class NoCorrespondingDeviceMapperRegisteredException extends Exception { + private final String deviceType; + private static final long serialVersionUID = -358955216089477585L; + + public NoCorrespondingDeviceMapperRegisteredException(String message, String deviceType) { + super(message); + this.deviceType = deviceType; + } + + public String getDeviceType() { + return deviceType; + } + + @Override + public String toString() { + return super.toString() + "(Device Type: " + deviceType + ")"; + } +} diff --git a/java/com.sap.sailing.feature.p2build/raceanalysis.product b/java/com.sap.sailing.feature.p2build/raceanalysis.product index c2f37c5c3a5..e373e009780 100755 --- a/java/com.sap.sailing.feature.p2build/raceanalysis.product +++ b/java/com.sap.sailing.feature.p2build/raceanalysis.product @@ -1,7 +1,7 @@ - + @@ -33,6 +33,7 @@ + diff --git a/java/com.sap.sailing.feature/feature.xml b/java/com.sap.sailing.feature/feature.xml index d596429a6f6..74ea774ce0e 100755 --- a/java/com.sap.sailing.feature/feature.xml +++ b/java/com.sap.sailing.feature/feature.xml @@ -290,4 +290,11 @@ Computes leaderboard information for sailing races and offers RESTful APIs to al version="0.0.0" unpack="false"/> + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy).launch b/java/com.sap.sailing.server/SailingServer (No Proxy).launch index 1341859a305..23d8b0dac50 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy).launch @@ -1,36 +1,36 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch index e9ea427ee0b..a075a0cb143 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch @@ -26,6 +26,6 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Monitoring).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Monitoring).launch index 19babc3036c..01de16499f0 100644 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Monitoring).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Monitoring).launch @@ -26,6 +26,6 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, No Tests).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, No Tests).launch index f4be951a6a8..b81d87c7373 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, No Tests).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, No Tests).launch @@ -25,5 +25,5 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch index ff2445457e8..d175d4bc0aa 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch @@ -25,5 +25,5 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (Proxy).launch b/java/com.sap.sailing.server/SailingServer (Proxy).launch index d03f2c0bae9..4d60014e3cf 100755 --- a/java/com.sap.sailing.server/SailingServer (Proxy).launch +++ b/java/com.sap.sailing.server/SailingServer (Proxy).launch @@ -1,31 +1,31 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889).launch b/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889).launch index d017174feb0..639e707991f 100755 --- a/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889).launch +++ b/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889).launch @@ -26,6 +26,6 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (Proxy, Remote Debug SAP VM).launch b/java/com.sap.sailing.server/SailingServer (Proxy, Remote Debug SAP VM).launch index 2b2cb6340e4..72ebb4653da 100755 --- a/java/com.sap.sailing.server/SailingServer (Proxy, Remote Debug SAP VM).launch +++ b/java/com.sap.sailing.server/SailingServer (Proxy, Remote Debug SAP VM).launch @@ -26,5 +26,5 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (Proxy, SwissTiming Live Simulation).launch b/java/com.sap.sailing.server/SailingServer (Proxy, SwissTiming Live Simulation).launch index 00a85f3e5ca..3c7cdb3f000 100755 --- a/java/com.sap.sailing.server/SailingServer (Proxy, SwissTiming Live Simulation).launch +++ b/java/com.sap.sailing.server/SailingServer (Proxy, SwissTiming Live Simulation).launch @@ -25,5 +25,5 @@ - + diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java index 304e7a17023..d6cd72a8310 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java @@ -40,6 +40,7 @@ import com.sap.sailing.domain.common.dto.RaceColumnDTO; import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.domain.common.impl.Util.Triple; import com.sap.sailing.domain.common.media.MediaTrack; +import com.sap.sailing.domain.devices.DeviceTypeServiceFinder; import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.LeaderboardGroup; @@ -478,4 +479,6 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch DomainObjectFactory getDomainObjectFactory(); WindStore getWindStore(); + + void setDeviceTypeServiceFinder(DeviceTypeServiceFinder finder); } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/Activator.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/Activator.java index 21b23db2a1d..f3702b6adf8 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/Activator.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/Activator.java @@ -35,6 +35,12 @@ public class Activator implements BundleActivator { // register the racing service in the OSGi registry racingEventService.setBundleContext(context); context.registerService(RacingEventService.class.getName(), racingEventService, null); + + // At this point the OSGi resolver is used as device type service finder. + // In the case that we are not in an OSGi context (e.g. running a JUnit test instead), + // this code block is not run, and the test case can inject some other type of finder + // instead. + racingEventService.setDeviceTypeServiceFinder(new OsgiDeviceTypeServiceFinder(context)); logger.log(Level.INFO, "Started "+context.getBundle().getSymbolicName()+". Character encoding: "+ Charset.defaultCharset()); diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/OsgiDeviceTypeServiceFinder.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/OsgiDeviceTypeServiceFinder.java new file mode 100644 index 00000000000..2bf85d783f4 --- /dev/null +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/OsgiDeviceTypeServiceFinder.java @@ -0,0 +1,48 @@ +package com.sap.sailing.server.impl; + +import java.util.Collection; +import java.util.logging.Logger; + +import org.osgi.framework.BundleContext; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.framework.ServiceReference; + +import com.sap.sailing.domain.devices.DeviceIdentifier; +import com.sap.sailing.domain.devices.DeviceTypeServiceFinder; + +public class OsgiDeviceTypeServiceFinder implements DeviceTypeServiceFinder { + private static final Logger logger = Logger.getLogger(OsgiDeviceTypeServiceFinder.class.getName()); + + private final BundleContext context; + + public OsgiDeviceTypeServiceFinder(BundleContext context) { + this.context = context; + } + + @Override + public ServiceType findService(Class clazz, String deviceType) { + if (context == null) { + return null; + } + + ServiceType service = null; + + try { + String filter = String.format("(%s=%s)", DeviceIdentifier.TYPE, deviceType); + Collection> references = context.getServiceReferences(clazz, filter); + + // TODO we should probably cache this for performance reasons + for (ServiceReference reference : references) { + service = context.getService(reference); + if (service != null) { + break; + } + } + } catch (InvalidSyntaxException e) { + logger.severe("Invalid syntax for OSGi service filter (LDAP syntax)"); + e.printStackTrace(); + } + + return service; + } +} 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 ae035a6c6ee..8e791058cf1 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 @@ -71,6 +71,7 @@ import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.domain.common.impl.Util.Triple; import com.sap.sailing.domain.common.media.MediaTrack; import com.sap.sailing.domain.common.media.MediaTrack.MimeType; +import com.sap.sailing.domain.devices.DeviceTypeServiceFinder; import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.FlexibleRaceColumn; import com.sap.sailing.domain.leaderboard.Leaderboard; @@ -243,6 +244,8 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen private final WindStore windStore; + private DeviceTypeServiceFinder deviceTypeServiceFinder; + /** * If this service runs in the context of an OSGi environment, the activator should {@link #setBundleContext set the bundle context} on this * object so that service lookups become possible. @@ -2128,4 +2131,10 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen return result; } + @Override + public void setDeviceTypeServiceFinder(DeviceTypeServiceFinder finder) { + this.deviceTypeServiceFinder = finder; + mongoObjectFactory.setDeviceTypeServiceFinder(finder); + domainObjectFactory.setDeviceTypeServiceFinder(finder); + } } diff --git a/java/pom.xml b/java/pom.xml index b22e57eba9a..ee985eaef92 100755 --- a/java/pom.xml +++ b/java/pom.xml @@ -29,6 +29,9 @@ com.sap.sailing.domain.igtimiadapter com.sap.sailing.domain.igtimiadapter.persistence com.sap.sailing.domain.igtimiadapter.test + com.sap.sailing.domain.smartphoneadapter + com.sap.sailing.domain.smartphoneadapter.test + com.sap.sailing.domain.smartphoneadapter.testsupport com.sap.sailing.domain.swisstimingadapter com.sap.sailing.domain.swisstimingadapter.persistence com.sap.sailing.domain.swisstimingreplayadapter