bug5628: persistence for YB connectivity params and configurations

This commit is contained in:
Axel Uhl
2021-10-13 13:05:03 +02:00
parent 0b9a1f0af6
commit e543bc2976
54 changed files with 672 additions and 24 deletions
@@ -87,6 +87,7 @@ public class SecuredDomainType extends HasPermissionsImpl {
public static final HasPermissions SWISS_TIMING_ARCHIVE_ACCOUNT = new SecuredDomainType(
"SWISS_TIMING_ARCHIVE_ACCOUNT");
public static final HasPermissions TRACTRAC_ACCOUNT = new SecuredDomainType("TRACTRAC_ACCOUNT");
public static final HasPermissions YELLOWBRICK_ACCOUNT = new SecuredDomainType("YELLOWBRICK_ACCOUNT");
public static final HasPermissions WIND_ESTIMATION_MODELS = new SecuredDomainType("WIND_ESTIMATION_MODELS");
public static final HasPermissions MARK_PROPERTIES = new SecuredDomainType("MARK_PROPERTIES");
public static final HasPermissions MARK_TEMPLATE = new SecuredDomainType("MARK_TEMPLATE");
@@ -55,7 +55,7 @@ public interface TracTracConfiguration extends WithQualifiedObjectIdentifier {
return getTypeRelativeObjectIdentifier(getJSONURL(), getCreatorName());
}
public static TypeRelativeObjectIdentifier getTypeRelativeObjectIdentifier(String jsonUrl, String username) {
static TypeRelativeObjectIdentifier getTypeRelativeObjectIdentifier(String jsonUrl, String username) {
return username == null ? new TypeRelativeObjectIdentifier(jsonUrl)
: new TypeRelativeObjectIdentifier(jsonUrl, username);
}
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
</classpath>
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>com.sap.sailing.domain.yellowbrickadapter.persistence</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.ManifestBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.SchemaBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.pde.PluginNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>
@@ -0,0 +1,8 @@
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.release=disabled
org.eclipse.jdt.core.compiler.source=1.8
@@ -0,0 +1,3 @@
eclipse.preferences.version=1
pluginProject.extensions=false
resolve.requirebundle=false
@@ -0,0 +1,25 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Persistence
Bundle-SymbolicName: com.sap.sailing.domain.yellowbrickadapter.persistence
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: com.sap.sailing.domain.yellowbrickadapter.persistence.impl.Activator
Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Automatic-Module-Name: com.sap.sailing.domain.yellowbrickadapter.persistence
Import-Package: org.osgi.framework;version="1.3.0",
org.osgi.util.tracker;version="1.5.2"
Bundle-ActivationPolicy: lazy
Require-Bundle: org.mongodb.driver-sync;bundle-version="4.3.1",
org.mongodb.bson;bundle-version="4.3.1",
com.sap.sailing.domain,
com.sap.sailing.domain.yellowbrickadapter,
org.mongodb.driver-core;bundle-version="4.3.1",
com.sap.sse.common,
com.sap.sse.mongodb,
com.sap.sse,
com.sap.sse.replication.interfaces,
com.sap.sse.security,
com.sap.sailing.domain.persistence,
com.sap.sailing.domain.common
@@ -0,0 +1,4 @@
source.. = src/
output.. = bin/
bin.includes = META-INF/,\
.
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>root</artifactId>
<groupId>com.sap.sailing</groupId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>com.sap.sailing.domain.yellowbrickadapter.persistence</artifactId>
<packaging>eclipse-plugin</packaging>
</project>
@@ -0,0 +1,13 @@
package com.sap.sailing.domain.yellowbrickadapter.persistence;
import com.sap.sailing.domain.yellowbrickadapter.YellowBrickConfiguration;
/**
* Offers methods to load domain objects from a Mongo DB
*
* @author Axel Uhl (d043530)
*
*/
public interface DomainObjectFactory {
Iterable<YellowBrickConfiguration> getYellowBrickConfigurations();
}
@@ -0,0 +1,32 @@
package com.sap.sailing.domain.yellowbrickadapter.persistence;
import com.mongodb.DBObject;
import com.sap.sailing.domain.yellowbrickadapter.YellowBrickConfiguration;
import com.sap.sailing.domain.yellowbrickadapter.persistence.impl.MongoObjectFactoryImpl;
import com.sap.sse.mongodb.MongoDBService;
/**
* Offers methods to construct {@link DBObject MongoDB objects} from domain objects.
*
* @author Axel Uhl (d043530)
*
*/
public interface MongoObjectFactory {
MongoObjectFactory INSTANCE = new MongoObjectFactoryImpl(MongoDBService.INSTANCE.getDB());
/**
* Inserts/updates based on the {@link YellowBrickConfiguration#getCreatorName() creator name} and the
* {@link YellowBrickConfiguration#getRaceUrl() race URL}. Any config previously contained in the DB with equal
* creator name and race URL will be replaced / updated. Afterwards,
* {@link DomainObjectFactory#getYellowBrickConfigurations()} called for the same <code>database</code> will return
* an equal <code>tracTracConfiguration</code> in its results.
*/
void createYellowBrickConfiguration(YellowBrickConfiguration tracTracConfiguration);
void updateYellowBrickConfiguration(YellowBrickConfiguration tracTracConfiguration);
void deleteYellowBrickConfiguration(String creatorName, String raceUrl);
void clear();
}
@@ -0,0 +1,12 @@
package com.sap.sailing.domain.yellowbrickadapter.persistence;
import com.mongodb.client.MongoDatabase;
import com.sap.sailing.domain.yellowbrickadapter.persistence.impl.PersistenceFactoryImpl;
public interface PersistenceFactory {
PersistenceFactory INSTANCE = new PersistenceFactoryImpl();
DomainObjectFactory createDomainObjectFactory(MongoDatabase db);
MongoObjectFactory createMongoObjectFactory(MongoDatabase db);
}
@@ -0,0 +1,87 @@
package com.sap.sailing.domain.yellowbrickadapter.persistence.impl;
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.util.tracker.ServiceTracker;
import com.sap.sailing.domain.base.DomainFactory;
import com.sap.sailing.domain.common.security.SecuredDomainType;
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.persistence.MongoRegattaLogStoreFactory;
import com.sap.sailing.domain.tracking.RaceTrackingConnectivityParametersHandler;
import com.sap.sailing.domain.yellowbrickadapter.YellowBrickConfiguration;
import com.sap.sailing.domain.yellowbrickadapter.YellowBrickRaceTrackingConnectivityParams;
import com.sap.sailing.domain.yellowbrickadapter.persistence.PersistenceFactory;
import com.sap.sse.common.TypeBasedServiceFinder;
import com.sap.sse.mongodb.MongoDBService;
import com.sap.sse.replication.FullyInitializedReplicableTracker;
import com.sap.sse.security.SecurityService;
import com.sap.sse.util.ClearStateTestSupport;
import com.sap.sse.util.ServiceTrackerFactory;
public class Activator implements BundleActivator {
private static final Logger logger = Logger.getLogger(Activator.class.getName());
private static BundleContext context;
static BundleContext getContext() {
return context;
}
public void start(BundleContext bundleContext) throws Exception {
Activator.context = bundleContext;
for (CollectionNames name : CollectionNames.values()) {
MongoDBService.INSTANCE.registerExclusively(CollectionNames.class, name.name());
}
new Thread(() -> {
final ServiceTracker<MongoObjectFactory, MongoObjectFactory> mongoObjectFactoryServiceTracker = ServiceTrackerFactory
.createAndOpen(context, MongoObjectFactory.class);
final ServiceTracker<DomainObjectFactory, DomainObjectFactory> domainObjectFactoryServiceTracker = ServiceTrackerFactory
.createAndOpen(context, DomainObjectFactory.class);
final FullyInitializedReplicableTracker<SecurityService> securityServiceServiceTracker = FullyInitializedReplicableTracker.createAndOpen(context, SecurityService.class);
try {
final MongoObjectFactory mongoObjectFactory = mongoObjectFactoryServiceTracker.waitForService(0);
final DomainObjectFactory domainObjectFactory = domainObjectFactoryServiceTracker.waitForService(0);
final SecurityService securityService = securityServiceServiceTracker.getInitializedService(0);
final DomainFactory baseDomainFactory = domainObjectFactory.getBaseDomainFactory();
final Dictionary<String, Object> properties = new Hashtable<String, Object>();
final com.sap.sailing.domain.yellowbrickadapter.persistence.DomainObjectFactory yellowBrickDomainObjectFactory = PersistenceFactory.INSTANCE
.createDomainObjectFactory(mongoObjectFactory.getDatabase());
com.sap.sailing.domain.yellowbrickadapter.persistence.MongoObjectFactory yellowBrickMongoObjectFactory = com.sap.sailing.domain.yellowbrickadapter.persistence.PersistenceFactory.INSTANCE
.createMongoObjectFactory(mongoObjectFactory.getDatabase());
final YellowBrickConnectivityParamsHandler paramsHandler = new YellowBrickConnectivityParamsHandler(
MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(mongoObjectFactory, domainObjectFactory),
MongoRegattaLogStoreFactory.INSTANCE.getMongoRegattaLogStore(mongoObjectFactory,
domainObjectFactory),
baseDomainFactory, yellowBrickMongoObjectFactory, securityService);
for (YellowBrickConfiguration yellowBrickConfig : yellowBrickDomainObjectFactory.getYellowBrickConfigurations()) {
securityService.migrateOwnership(yellowBrickConfig);
}
// we do not necessarily have TracTrac configurations, so ensure that migration is marked as done
securityService.assumeOwnershipMigrated(SecuredDomainType.YELLOWBRICK_ACCOUNT.getName());
properties.put(TypeBasedServiceFinder.TYPE, YellowBrickRaceTrackingConnectivityParams.TYPE);
context.registerService(RaceTrackingConnectivityParametersHandler.class, paramsHandler, properties);
context.registerService(ClearStateTestSupport.class.getName(), new ClearStateTestSupport() {
@Override
public void clearState() throws Exception {
yellowBrickMongoObjectFactory.clear();
}
}, null);
} catch (Exception e) {
logger.log(Level.SEVERE,
"Exception trying to register TracTrac RaceTrackingConnectivityParametersHandler implementation",
e);
}
}, getClass().getName() + " registering connectivity handler").start();
}
public void stop(BundleContext bundleContext) throws Exception {
Activator.context = null;
}
}
@@ -0,0 +1,5 @@
package com.sap.sailing.domain.yellowbrickadapter.persistence.impl;
public enum CollectionNames {
YELLOWBRICK_CONFIGURATIONS
}
@@ -0,0 +1,63 @@
package com.sap.sailing.domain.yellowbrickadapter.persistence.impl;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.bson.Document;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.sap.sailing.domain.yellowbrickadapter.YellowBrickConfiguration;
import com.sap.sailing.domain.yellowbrickadapter.impl.YellowBrickConfigurationImpl;
import com.sap.sailing.domain.yellowbrickadapter.persistence.DomainObjectFactory;
public class DomainObjectFactoryImpl implements DomainObjectFactory {
private static final Logger logger = Logger.getLogger(DomainObjectFactoryImpl.class.getName());
private final MongoDatabase database;
public DomainObjectFactoryImpl(MongoDatabase db) {
super();
this.database = db;
}
@Override
public Iterable<YellowBrickConfiguration> getYellowBrickConfigurations() {
final List<YellowBrickConfiguration> result = new ArrayList<YellowBrickConfiguration>();
try {
MongoCollection<org.bson.Document> ybConfigs = database.getCollection(CollectionNames.YELLOWBRICK_CONFIGURATIONS.name());
for (Document o : ybConfigs.find()) {
YellowBrickConfiguration ybConfig = loadYellowBrickConfiguration(o);
result.add(ybConfig);
}
} catch (Exception e) {
// something went wrong during DB access; report, then use empty new wind track
logger.log(Level.SEVERE, "Error connecting to MongoDB, unable to load recorded YellowBrick configurations. Check MongoDB settings.", e);
}
return result;
}
private YellowBrickConfiguration loadYellowBrickConfiguration(Document object) {
Object usernameObject = object.get(FieldNames.YB_CONFIG_USERNAME.name());
Object passwordObject = object.get(FieldNames.YB_CONFIG_PASSWORD.name());
String username = usernameObject == null ? "" : (String) usernameObject;
String password = passwordObject == null ? "" : (String) passwordObject;
String creatorName = (String) object.get(FieldNames.YB_CONFIG_CREATOR_NAME.name());
String raceURL = (String) object.get(FieldNames.YB_CONFIG_RACE_URL.name());
final boolean needsUpdate = (creatorName == null);
if (needsUpdate) {
// No creator is set yet -> existing configurations are assumed to belong to the admin
creatorName = "admin";
}
final YellowBrickConfiguration loadedYellowBrickConfiguration = new YellowBrickConfigurationImpl(creatorName, raceURL, username, password, creatorName);
if (needsUpdate) {
// recreating the config on the DB because the composite key changed
new MongoObjectFactoryImpl(database).deleteYellowBrickConfiguration(null, raceURL);
new MongoObjectFactoryImpl(database).createYellowBrickConfiguration(loadedYellowBrickConfiguration);
}
return loadedYellowBrickConfiguration;
}
}
@@ -0,0 +1,6 @@
package com.sap.sailing.domain.yellowbrickadapter.persistence.impl;
public enum FieldNames {
// YellowBrick configuration parameters:
YB_CONFIG_CREATOR_NAME, YB_CONFIG_NAME, YB_CONFIG_RACE_URL, YB_CONFIG_USERNAME, YB_CONFIG_PASSWORD
}
@@ -0,0 +1,61 @@
package com.sap.sailing.domain.yellowbrickadapter.persistence.impl;
import org.bson.Document;
import com.mongodb.WriteConcern;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.ReplaceOptions;
import com.sap.sailing.domain.yellowbrickadapter.YellowBrickConfiguration;
import com.sap.sailing.domain.yellowbrickadapter.persistence.MongoObjectFactory;
public class MongoObjectFactoryImpl implements MongoObjectFactory {
private final MongoDatabase database;
public MongoObjectFactoryImpl(MongoDatabase database) {
super();
this.database = database;
}
@Override
public void clear() {
database.getCollection(CollectionNames.YELLOWBRICK_CONFIGURATIONS.name())
.withWriteConcern(WriteConcern.ACKNOWLEDGED).drop();
}
@Override
public void createYellowBrickConfiguration(YellowBrickConfiguration yellowBrickConfiguration) {
MongoCollection<Document> ttConfigCollection = database.getCollection(CollectionNames.YELLOWBRICK_CONFIGURATIONS.name());
final Document result = storeYellowBrickConfiguration(yellowBrickConfiguration);
ttConfigCollection.withWriteConcern(WriteConcern.ACKNOWLEDGED).insertOne(result);
}
@Override
public void updateYellowBrickConfiguration(YellowBrickConfiguration yellowBrickConfiguration) {
MongoCollection<Document> ttConfigCollection = database
.getCollection(CollectionNames.YELLOWBRICK_CONFIGURATIONS.name());
final Document result = storeYellowBrickConfiguration(yellowBrickConfiguration);
// Object with given name is updated or created if it does not exist yet
final Document updateQuery = new Document(FieldNames.YB_CONFIG_RACE_URL.name(), yellowBrickConfiguration.getRaceUrl());
updateQuery.put(FieldNames.YB_CONFIG_CREATOR_NAME.name(), yellowBrickConfiguration.getCreatorName());
ttConfigCollection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(updateQuery, result, new ReplaceOptions().upsert(true));
}
private Document storeYellowBrickConfiguration(YellowBrickConfiguration yellowBrickConfiguration) {
final Document result = new Document();
result.put(FieldNames.YB_CONFIG_CREATOR_NAME.name(), yellowBrickConfiguration.getCreatorName());
result.put(FieldNames.YB_CONFIG_NAME.name(), yellowBrickConfiguration.getName());
result.put(FieldNames.YB_CONFIG_RACE_URL.name(), yellowBrickConfiguration.getRaceUrl());
result.put(FieldNames.YB_CONFIG_USERNAME.name(), yellowBrickConfiguration.getUsername());
result.put(FieldNames.YB_CONFIG_PASSWORD.name(), yellowBrickConfiguration.getPassword());
return result;
}
@Override
public void deleteYellowBrickConfiguration(String creatorName, String raceUrl) {
MongoCollection<Document> ybConfigCollection = database.getCollection(CollectionNames.YELLOWBRICK_CONFIGURATIONS.name());
final Document deleteQuery = new Document(FieldNames.YB_CONFIG_RACE_URL.name(), raceUrl);
deleteQuery.put(FieldNames.YB_CONFIG_CREATOR_NAME.name(), creatorName);
ybConfigCollection.withWriteConcern(WriteConcern.ACKNOWLEDGED).deleteOne(deleteQuery);
}
}
@@ -0,0 +1,18 @@
package com.sap.sailing.domain.yellowbrickadapter.persistence.impl;
import com.mongodb.client.MongoDatabase;
import com.sap.sailing.domain.yellowbrickadapter.persistence.DomainObjectFactory;
import com.sap.sailing.domain.yellowbrickadapter.persistence.MongoObjectFactory;
import com.sap.sailing.domain.yellowbrickadapter.persistence.PersistenceFactory;
public class PersistenceFactoryImpl implements PersistenceFactory {
@Override
public DomainObjectFactory createDomainObjectFactory(MongoDatabase db) {
return new DomainObjectFactoryImpl(db);
}
@Override
public MongoObjectFactory createMongoObjectFactory(MongoDatabase db) {
return new MongoObjectFactoryImpl(db);
}
}
@@ -0,0 +1,102 @@
package com.sap.sailing.domain.yellowbrickadapter.persistence.impl;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.text.ParseException;
import java.util.HashMap;
import java.util.Map;
import com.sap.sailing.domain.base.DomainFactory;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.regattalog.RegattaLogStore;
import com.sap.sailing.domain.tracking.RaceTrackingConnectivityParameters;
import com.sap.sailing.domain.tracking.impl.AbstractRaceTrackingConnectivityParametersHandler;
import com.sap.sailing.domain.yellowbrickadapter.YellowBrickRaceTrackingConnectivityParams;
import com.sap.sailing.domain.yellowbrickadapter.impl.YellowBrickConfigurationImpl;
import com.sap.sailing.domain.yellowbrickadapter.persistence.MongoObjectFactory;
import com.sap.sse.common.TypeBasedServiceFinder;
import com.sap.sse.security.SecurityService;
import com.sap.sse.security.SessionUtils;
/**
* Handles mapping YellowBrick connectivity parameters from and to a map with {@link String} keys. The "race URL" is
* considered the {@link #getKey(RaceTrackingConnectivityParameters) key} for these objects.
* <p>
*
* @author Axel Uhl (d043530)
*
*/
public class YellowBrickConnectivityParamsHandler extends AbstractRaceTrackingConnectivityParametersHandler {
private static final String YELLOW_BRICK_USERNAME = "yellowBrickUsername";
private static final String YELLOW_BRICK_PASSWORD = "yellowBrickPassword";
private static final String RACE_URL = "raceURL";
private final RaceLogStore raceLogStore;
private final RegattaLogStore regattaLogStore;
private final DomainFactory baseDomainFactory;
private final MongoObjectFactory yellowBrickMongoObjectFactory;
private final SecurityService securityService;
public YellowBrickConnectivityParamsHandler(RaceLogStore raceLogStore, RegattaLogStore regattaLogStore,
DomainFactory baseDomainFactory, MongoObjectFactory yellowBrickMongoObjectFactory,
SecurityService securityService) {
super();
this.raceLogStore = raceLogStore;
this.regattaLogStore = regattaLogStore;
this.baseDomainFactory = baseDomainFactory;
this.yellowBrickMongoObjectFactory = yellowBrickMongoObjectFactory;
this.securityService = securityService;
}
@Override
public Map<String, Object> mapFrom(RaceTrackingConnectivityParameters params) throws MalformedURLException {
assert params instanceof YellowBrickRaceTrackingConnectivityParams;
final YellowBrickRaceTrackingConnectivityParams ybParams = (YellowBrickRaceTrackingConnectivityParams) params;
final Map<String, Object> result = getKey(params);
result.put(RACE_URL, ybParams.getRaceUrl()==null?null:ybParams.getRaceUrl().toString());
result.put(YELLOW_BRICK_USERNAME, ybParams.getUsername());
result.put(YELLOW_BRICK_PASSWORD, ybParams.getPassword());
addWindTrackingParameters(ybParams, result);
return result;
}
@Override
public RaceTrackingConnectivityParameters mapTo(Map<String, Object> map) throws Exception {
return new YellowBrickRaceTrackingConnectivityParams(map.get(RACE_URL).toString(),
map.get(YELLOW_BRICK_USERNAME) == null ? null : map.get(YELLOW_BRICK_USERNAME).toString(),
map.get(YELLOW_BRICK_PASSWORD) == null ? null : map.get(YELLOW_BRICK_PASSWORD).toString(),
isTrackWind(map), isCorrectWindDirectionByMagneticDeclination(map), raceLogStore, regattaLogStore,
baseDomainFactory);
}
@Override
public Map<String, Object> getKey(RaceTrackingConnectivityParameters params) throws MalformedURLException {
assert params instanceof YellowBrickRaceTrackingConnectivityParams;
final YellowBrickRaceTrackingConnectivityParams ybParams = (YellowBrickRaceTrackingConnectivityParams) params;
final Map<String, Object> result = new HashMap<>();
result.put(TypeBasedServiceFinder.TYPE, params.getTypeIdentifier());
result.put(RACE_URL, ybParams.getRaceUrl());
return result;
}
@Override
public RaceTrackingConnectivityParameters resolve(RaceTrackingConnectivityParameters params) throws Exception {
assert params instanceof YellowBrickRaceTrackingConnectivityParams;
final YellowBrickRaceTrackingConnectivityParams ybParams = (YellowBrickRaceTrackingConnectivityParams) params;
YellowBrickRaceTrackingConnectivityParams result = new YellowBrickRaceTrackingConnectivityParams(
ybParams.getRaceUrl(), ybParams.getUsername(), ybParams.getPassword(), ybParams.isTrackWind(),
ybParams.isCorrectWindDirectionByMagneticDeclination(), raceLogStore, regattaLogStore,
baseDomainFactory);
updatePersistentYellowBrickConfiguration(result);
return result;
}
private void updatePersistentYellowBrickConfiguration(YellowBrickRaceTrackingConnectivityParams params)
throws MalformedURLException, IOException, ParseException, URISyntaxException {
final String creatorName = SessionUtils.getPrincipal().toString();
final YellowBrickConfigurationImpl tracTracConfiguration = new YellowBrickConfigurationImpl(params.getRaceUrl(),
params.getRaceUrl(), params.getUsername(), params.getPassword(), creatorName);
yellowBrickMongoObjectFactory.updateYellowBrickConfiguration(tracTracConfiguration);
securityService.setDefaultOwnershipIfNotSet(tracTracConfiguration.getIdentifier());
}
}
@@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2
Bundle-Name: Yellowbrickadapter
Bundle-SymbolicName: com.sap.sailing.domain.yellowbrickadapter
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: com.sap.sailing.domain.yellowbrickadapter.Activator
Bundle-Activator: com.sap.sailing.domain.yellowbrickadapter.impl.Activator
Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Automatic-Module-Name: com.sap.sailing.domain.yellowbrickadapter
@@ -15,5 +15,8 @@ Require-Bundle: com.sap.sailing.domain,
com.sap.sse.common,
com.sap.sailing.server.trackfiles,
com.sap.sailing.server.interface,
com.sap.sse.replication
Export-Package: com.sap.sailing.domain.yellowbrickadapter
com.sap.sse.replication,
com.sap.sse,
com.sap.sse.security.common
Export-Package: com.sap.sailing.domain.yellowbrickadapter,
com.sap.sailing.domain.yellowbrickadapter.impl;x-friends:="com.sap.sailing.domain.yellowbrickadapter.persistence"
@@ -0,0 +1,39 @@
package com.sap.sailing.domain.yellowbrickadapter;
import com.sap.sailing.domain.common.security.SecuredDomainType;
import com.sap.sse.common.Named;
import com.sap.sse.security.shared.HasPermissions;
import com.sap.sse.security.shared.QualifiedObjectIdentifier;
import com.sap.sse.security.shared.TypeRelativeObjectIdentifier;
import com.sap.sse.security.shared.WithQualifiedObjectIdentifier;
/**
* Configuration parameters that can be used to connect to a YellowBrick event / race.
*
* @author Axel Uhl (D043530)
*
*/
public interface YellowBrickConfiguration extends Named, WithQualifiedObjectIdentifier {
String getRaceUrl();
String getUsername();
String getPassword();
String getCreatorName();
@Override
default QualifiedObjectIdentifier getIdentifier() {
return getPermissionType().getQualifiedObjectIdentifier(getTypeRelativeObjectIdentifier());
}
@Override
default HasPermissions getPermissionType() {
return SecuredDomainType.YELLOWBRICK_ACCOUNT;
}
default TypeRelativeObjectIdentifier getTypeRelativeObjectIdentifier() {
return getTypeRelativeObjectIdentifier(getRaceUrl(), getCreatorName());
}
static TypeRelativeObjectIdentifier getTypeRelativeObjectIdentifier(String raceUrl, String creatorName) {
return creatorName == null ? new TypeRelativeObjectIdentifier(raceUrl)
: new TypeRelativeObjectIdentifier(raceUrl, creatorName);
}
}
@@ -1,28 +1,43 @@
package com.sap.sailing.domain.yellowbrickadapter;
import com.sap.sailing.domain.base.DomainFactory;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.leaderboard.LeaderboardGroupResolver;
import com.sap.sailing.domain.racelog.RaceLogAndTrackedRaceResolver;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.regattalog.RegattaLogStore;
import com.sap.sailing.domain.tracking.RaceTracker;
import com.sap.sailing.domain.tracking.RaceTrackingHandler;
import com.sap.sailing.domain.tracking.TrackedRegattaRegistry;
import com.sap.sailing.domain.tracking.WindStore;
import com.sap.sailing.domain.tracking.impl.AbstractRaceTrackingConnectivityParameters;
import com.sap.sailing.domain.yellowbrickadapter.impl.YellowBrickRaceTrackerImpl;
import com.sap.sse.common.Duration;
public class YellowBrickRaceTrackingConnectivityParams extends AbstractRaceTrackingConnectivityParameters {
private static final long serialVersionUID = -81948107186932864L;
public static final String TYPE = "YELLOW_BRICK";
private static final Duration DEFAULT_DELAY_TO_LIVE = Duration.ONE_MINUTE;
private final String raceUrl;
private final String username;
private final String password;
private final String trackerId;
private final transient RaceLogStore raceLogStore;
private final transient RegattaLogStore regattaLogStore;
private final transient DomainFactory baseDomainFactory;
public YellowBrickRaceTrackingConnectivityParams(String raceUrl, String username, String password,
boolean trackWind, boolean correctWindDirectionByMagneticDeclination) {
boolean trackWind, boolean correctWindDirectionByMagneticDeclination, RaceLogStore raceLogStore,
RegattaLogStore regattaLogStore, DomainFactory baseDomainFactory) {
super(trackWind, correctWindDirectionByMagneticDeclination);
this.raceUrl = raceUrl;
this.username = username;
this.password = password;
this.trackerId = TYPE+"-"+raceUrl;
this.raceLogStore = raceLogStore;
this.regattaLogStore = regattaLogStore;
this.baseDomainFactory = baseDomainFactory;
}
@Override
@@ -37,26 +52,45 @@ public class YellowBrickRaceTrackingConnectivityParams extends AbstractRaceTrack
WindStore windStore, RaceLogAndTrackedRaceResolver raceLogResolver,
LeaderboardGroupResolver leaderboardGroupResolver, long timeoutInMilliseconds,
RaceTrackingHandler raceTrackingHandler) throws Exception {
// TODO Implement YellowBrickRaceTrackingConnectivityParams.createRaceTracker(...)
return null;
return new YellowBrickRaceTrackerImpl(this);
}
@Override
public Object getTrackerID() {
// TODO Implement YellowBrickRaceTrackingConnectivityParams.getTrackerID(...)
return null;
public String getTrackerID() {
return trackerId;
}
@Override
public long getDelayToLiveInMillis() {
// TODO Implement YellowBrickRaceTrackingConnectivityParams.getDelayToLiveInMillis(...)
return 0;
return DEFAULT_DELAY_TO_LIVE.asMillis();
}
@Override
public String getTypeIdentifier() {
// TODO Implement YellowBrickRaceTrackingConnectivityParams.getTypeIdentifier(...)
return null;
return TYPE;
}
public String getRaceUrl() {
return raceUrl;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public RaceLogStore getRaceLogStore() {
return raceLogStore;
}
public RegattaLogStore getRegattaLogStore() {
return regattaLogStore;
}
public DomainFactory getBaseDomainFactory() {
return baseDomainFactory;
}
}
@@ -3,5 +3,5 @@ package com.sap.sailing.domain.yellowbrickadapter;
import com.sap.sailing.domain.base.DomainFactory;
public interface YellowBrickTrackingAdapterFactory {
YellowBrickTrackingAdapter getYellowBrickTrackingAdapter(DomainFactory domainFactory);
YellowBrickTrackingAdapter getYellowBrickTrackingAdapter(DomainFactory baseDomainFactory);
}
@@ -1,11 +1,11 @@
package com.sap.sailing.domain.yellowbrickadapter;
package com.sap.sailing.domain.yellowbrickadapter.impl;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import com.sap.sailing.domain.yellowbrickadapter.impl.YellowBrickGPSFixImporter;
import com.sap.sailing.domain.yellowbrickadapter.impl.YellowBrickTrackingAdapterFactoryImpl;
import com.sap.sailing.domain.yellowbrickadapter.YellowBrickTrackingAdapterFactory;
import com.sap.sailing.server.trackfiles.common.GPSFixImporterRegistration;
import com.sap.sse.MasterDataImportClassLoaderService;
public class Activator implements BundleActivator {
private static BundleContext context;
@@ -18,6 +18,7 @@ public class Activator implements BundleActivator {
Activator.context = bundleContext;
GPSFixImporterRegistration.register(new YellowBrickGPSFixImporter(), context);
bundleContext.registerService(YellowBrickTrackingAdapterFactory.class, new YellowBrickTrackingAdapterFactoryImpl(), /* properties */ null);
bundleContext.registerService(MasterDataImportClassLoaderService.class, new MasterDataImportClassLoaderServiceImpl(), /* properties */ null);
}
public void stop(BundleContext bundleContext) throws Exception {
@@ -0,0 +1,10 @@
package com.sap.sailing.domain.yellowbrickadapter.impl;
import com.sap.sse.MasterDataImportClassLoaderService;
public class MasterDataImportClassLoaderServiceImpl implements MasterDataImportClassLoaderService {
@Override
public ClassLoader getClassLoader() {
return this.getClass().getClassLoader();
}
}
@@ -0,0 +1,40 @@
package com.sap.sailing.domain.yellowbrickadapter.impl;
import com.sap.sailing.domain.yellowbrickadapter.YellowBrickConfiguration;
import com.sap.sse.common.impl.NamedImpl;
public class YellowBrickConfigurationImpl extends NamedImpl implements YellowBrickConfiguration {
private static final long serialVersionUID = -2858994298835323825L;
private final String raceUrl;
private final String username;
private final String password;
private final String creatorName;
public YellowBrickConfigurationImpl(String name, String raceUrl, String username, String password, String creatorName) {
super(name);
this.raceUrl = raceUrl;
this.username = username;
this.password = password;
this.creatorName = creatorName;
}
@Override
public String getRaceUrl() {
return raceUrl;
}
@Override
public String getUsername() {
return username;
}
@Override
public String getPassword() {
return password;
}
@Override
public String getCreatorName() {
return creatorName;
}
}
@@ -6,7 +6,7 @@ import com.sap.sailing.domain.yellowbrickadapter.YellowBrickTrackingAdapterFacto
public class YellowBrickTrackingAdapterFactoryImpl implements YellowBrickTrackingAdapterFactory {
@Override
public YellowBrickTrackingAdapter getYellowBrickTrackingAdapter(DomainFactory domainFactory) {
return new YellowBrickTrackingAdapterImpl(domainFactory);
public YellowBrickTrackingAdapter getYellowBrickTrackingAdapter(DomainFactory baseDomainFactory) {
return new YellowBrickTrackingAdapterImpl(baseDomainFactory);
}
}
@@ -24,7 +24,8 @@ public class YellowBrickTrackingAdapterImpl implements YellowBrickTrackingAdapte
throws Exception {
service.addRace(regattaToAddTo,
new YellowBrickRaceTrackingConnectivityParams(yellowBrickRaceUrl, yellowBrickUsername,
yellowBrickPassword, trackWind, correctWindByDeclination),
yellowBrickPassword, trackWind, correctWindByDeclination, raceLogStore, regattaLogStore,
baseDomainFactory),
/* timeout */ TIMEOUT_FOR_RACE_LOADING.asMillis());
}
}
@@ -51,8 +51,6 @@ public interface RaceTrackingConnectivityParametersHandler {
/**
* Produces a {@link RaceTrackingConnectivityParameters} object from a de-serialized stump. This is needed because
* some of the fields in {@link RaceTrackingConnectivityParameters} are transient and need to be filled.
*
* TODO: bug5245 add ConnectionParameters to Connectors persistent and in-memory representation.
*/
RaceTrackingConnectivityParameters resolve(RaceTrackingConnectivityParameters params) throws Exception;
}
@@ -43,6 +43,7 @@
<plugin id="com.sap.sailing.domain.igtimiadapter.gateway" autoStart="true" startLevel="5" />
<plugin id="com.sap.sailing.domain.oceanraceadapter" autoStart="true" startLevel="5" />
<plugin id="com.sap.sailing.domain.yellowbrickadapter" autoStart="true" startLevel="5" />
<plugin id="com.sap.sailing.domain.yellowbrickadapter.persistence" autoStart="true" startLevel="4" />
<plugin id="com.sap.sailing.domain.racelogtrackingadapter" autoStart="true" startLevel="4" />
<plugin id="com.sap.sailing.domain.swisstimingadapter" autoStart="true" startLevel="5" />
<plugin id="com.sap.sailing.domain.swisstimingadapter.persistence" autoStart="true" startLevel="4" />
+7
View File
@@ -290,6 +290,13 @@ Computes leaderboard information for sailing races and offers RESTful APIs to al
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.domain.yellowbrickadapter.persistence"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.xrr.structureimport"
download-size="0"
@@ -239,6 +239,11 @@
<level>5</level>
<autoStart>true</autoStart>
</bundle>
<bundle>
<id>com.sap.sailing.domain.yellowbrickadapter.persistence</id>
<level>4</level>
<autoStart>true</autoStart>
</bundle>
<bundle>
<id>com.sap.sailing.dashboards.gwt</id>
<level>6</level>
@@ -201,6 +201,7 @@
<setEntry value="com.sap.sailing.domain.deckmanadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.oceanraceadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.xrr.structureimport@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization.shared.android@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization@default:default"/>
@@ -207,6 +207,7 @@
<setEntry value="com.sap.sailing.domain.deckmanadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.oceanraceadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.xrr.structureimport@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization.shared.android@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization@default:default"/>
@@ -203,6 +203,7 @@
<setEntry value="com.sap.sailing.domain.deckmanadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.oceanraceadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.xrr.structureimport@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization.shared.android@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization@default:default"/>
@@ -200,6 +200,7 @@
<setEntry value="com.sap.sailing.domain.deckmanadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.oceanraceadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.xrr.structureimport@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization.shared.android@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization@default:default"/>
@@ -203,6 +203,7 @@
<setEntry value="com.sap.sailing.domain.deckmanadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.oceanraceadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.xrr.structureimport@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization.shared.android@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization@default:default"/>
@@ -203,6 +203,7 @@
<setEntry value="com.sap.sailing.domain.deckmanadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.oceanraceadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.xrr.structureimport@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization.shared.android@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization@default:default"/>
@@ -203,6 +203,7 @@
<setEntry value="com.sap.sailing.domain.deckmanadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.oceanraceadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.xrr.structureimport@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization.shared.android@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization@default:default"/>
@@ -203,6 +203,7 @@
<setEntry value="com.sap.sailing.domain.deckmanadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.oceanraceadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.xrr.structureimport@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization.shared.android@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization@default:default"/>
@@ -198,6 +198,7 @@
<setEntry value="com.sap.sailing.domain.deckmanadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.oceanraceadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.xrr.structureimport@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization.shared.android@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization@default:default"/>
@@ -194,6 +194,7 @@
<setEntry value="com.sap.sailing.domain.deckmanadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.oceanraceadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.xrr.structureimport@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization.shared.android@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization@default:default"/>
@@ -200,6 +200,7 @@
<setEntry value="com.sap.sailing.domain.deckmanadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.oceanraceadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.xrr.structureimport@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization.shared.android@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization@default:default"/>
@@ -198,6 +198,7 @@
<setEntry value="com.sap.sailing.domain.deckmanadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.oceanraceadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.xrr.structureimport@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization.shared.android@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization@default:default"/>
@@ -200,6 +200,7 @@
<setEntry value="com.sap.sailing.domain.deckmanadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.oceanraceadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.xrr.structureimport@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization.shared.android@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization@default:default"/>
@@ -198,6 +198,7 @@
<setEntry value="com.sap.sailing.domain.deckmanadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.oceanraceadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.xrr.structureimport@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization.shared.android@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization@default:default"/>
@@ -198,6 +198,7 @@
<setEntry value="com.sap.sailing.domain.deckmanadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.oceanraceadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.xrr.structureimport@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization.shared.android@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization@default:default"/>
@@ -194,6 +194,7 @@
<setEntry value="com.sap.sailing.domain.deckmanadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.oceanraceadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.xrr.structureimport@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization.shared.android@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization@default:default"/>
@@ -203,6 +203,7 @@
<setEntry value="com.sap.sailing.domain.deckmanadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.oceanraceadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.xrr.structureimport@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization.shared.android@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization@default:default"/>
@@ -200,6 +200,7 @@
<setEntry value="com.sap.sailing.domain.deckmanadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.oceanraceadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.xrr.structureimport@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization.shared.android@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization@default:default"/>
@@ -200,6 +200,7 @@
<setEntry value="com.sap.sailing.domain.deckmanadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.oceanraceadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.xrr.structureimport@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization.shared.android@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization@default:default"/>
@@ -205,6 +205,7 @@
<setEntry value="com.sap.sailing.domain.deckmanadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.oceanraceadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.xrr.structureimport@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization.shared.android@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization@default:default"/>
@@ -198,6 +198,7 @@
<setEntry value="com.sap.sailing.domain.deckmanadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.oceanraceadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.xrr.structureimport@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization.shared.android@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization@default:default"/>
+1
View File
@@ -127,6 +127,7 @@
<module>com.sap.sailing.domain.deckmanadapter</module>
<module>com.sap.sailing.domain.oceanraceadapter</module>
<module>com.sap.sailing.domain.yellowbrickadapter</module>
<module>com.sap.sailing.domain.yellowbrickadapter.persistence</module>
<module>com.sap.sailing.domain.bravoadapter</module>
<module>com.sap.sailing.domain.expeditionadapter</module>
<module>com.sap.sailing.domain.tractracadapter</module>