Merge branch 'bug5245'

This commit is contained in:
Axel Uhl committed 2020-04-16 13:45:20 +02:00
commit 8aa2de6248
36 files changed
+610 -119

No files matched your search

@@ -50,7 +50,7 @@ public class Activator implements BundleActivator {
final SwissTimingConnectivityParamsHandler paramsHandler = new SwissTimingConnectivityParamsHandler(
MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(mongoObjectFactory, domainObjectFactory),
MongoRegattaLogStoreFactory.INSTANCE.getMongoRegattaLogStore(mongoObjectFactory, domainObjectFactory),
domainFactory);
domainFactory, securityService);
properties.put(TypeBasedServiceFinder.TYPE, SwissTimingTrackingConnectivityParameters.TYPE);
context.registerService(RaceTrackingConnectivityParametersHandler.class, paramsHandler, properties);
for (SwissTimingArchiveConfiguration swissTimingArchive : SwissTimingAdapterPersistence.INSTANCE
@@ -101,17 +101,13 @@ public class SwissTimingAdapterPersistenceImpl implements SwissTimingAdapterPers
private SwissTimingArchiveConfiguration loadSwissTimingArchiveConfiguration(Document object) {
final String jsonUrl = object.getString(FieldNames.ST_ARCHIVE_JSON_URL.name());
String creatorName = object.getString(FieldNames.ST_ARCHIVE_CREATOR_NAME.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 SwissTimingArchiveConfiguration loadedSwissTimingArchiveConfiguration = swissTimingFactory.createSwissTimingArchiveConfiguration(
jsonUrl,
creatorName);
jsonUrl, creatorName);
if (needsUpdate) {
// recreating the config on the DB because the composite key changed
deleteSwissTimingArchiveConfiguration(
@@ -16,15 +16,19 @@ import com.sap.sailing.domain.swisstimingadapter.Competitor;
import com.sap.sailing.domain.swisstimingadapter.CrewMember;
import com.sap.sailing.domain.swisstimingadapter.DomainFactory;
import com.sap.sailing.domain.swisstimingadapter.StartList;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingConfiguration;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingFactory;
import com.sap.sailing.domain.swisstimingadapter.impl.CompetitorWithID;
import com.sap.sailing.domain.swisstimingadapter.impl.CompetitorWithoutID;
import com.sap.sailing.domain.swisstimingadapter.impl.CrewMemberImpl;
import com.sap.sailing.domain.swisstimingadapter.impl.StartListImpl;
import com.sap.sailing.domain.swisstimingadapter.impl.SwissTimingTrackingConnectivityParameters;
import com.sap.sailing.domain.swisstimingadapter.persistence.SwissTimingAdapterPersistence;
import com.sap.sailing.domain.tracking.RaceTrackingConnectivityParameters;
import com.sap.sailing.domain.tracking.impl.AbstractRaceTrackingConnectivityParametersHandler;
import com.sap.sse.common.TypeBasedServiceFinder;
import com.sap.sse.security.SecurityService;
import com.sap.sse.security.SessionUtils;
/**
* Handles mapping TracTrac connectivity parameters from and to a map with {@link String} keys. The
@@ -57,16 +61,20 @@ public class SwissTimingConnectivityParamsHandler extends AbstractRaceTrackingCo
private static final String UPDATE_URL = "updateURL";
private static final String UPDATE_USERNAME = "updateUsername";
private static final String UPDATE_PASSWORD = "updatePassword";
private static final String EVENT_NAME = "eventName";
private static final String MANAGE2SAIL_EVENT_URL = "manage2SailEventUrl";
private final RaceLogStore raceLogStore;
private final RegattaLogStore regattaLogStore;
private final DomainFactory domainFactory;
private final SwissTimingFactory swissTimingFactory;
private final SecurityService securityService;
public SwissTimingConnectivityParamsHandler(RaceLogStore raceLogStore, RegattaLogStore regattaLogStore, DomainFactory domainFactory) {
public SwissTimingConnectivityParamsHandler(RaceLogStore raceLogStore, RegattaLogStore regattaLogStore, DomainFactory domainFactory, SecurityService securityService) {
super();
this.raceLogStore = raceLogStore;
this.regattaLogStore = regattaLogStore;
this.domainFactory = domainFactory;
this.securityService = securityService;
this.swissTimingFactory = SwissTimingFactory.INSTANCE;
}
@@ -84,6 +92,8 @@ public class SwissTimingConnectivityParamsHandler extends AbstractRaceTrackingCo
result.put(UPDATE_URL, stParams.getUpdateURL());
result.put(UPDATE_USERNAME, stParams.getUpdateUsername());
result.put(UPDATE_PASSWORD, stParams.getUpdatePassword());
result.put(EVENT_NAME, stParams.getEventName());
result.put(MANAGE2SAIL_EVENT_URL, stParams.getManage2SailEventUrl());
addWindTrackingParameters(stParams, result);
return result;
}
@@ -184,7 +194,9 @@ public class SwissTimingConnectivityParamsHandler extends AbstractRaceTrackingCo
(boolean) map.get(USE_INTERNAL_MARK_PASSING_ALGORITHM), isTrackWind(map), isCorrectWindDirectionByMagneticDeclination(map),
(String) map.get(UPDATE_URL),
(String) map.get(UPDATE_USERNAME),
(String) map.get(UPDATE_PASSWORD));
(String) map.get(UPDATE_PASSWORD),
(String) map.get(EVENT_NAME),
(String) map.get(MANAGE2SAIL_EVENT_URL));
}
@Override
@@ -209,7 +221,15 @@ public class SwissTimingConnectivityParamsHandler extends AbstractRaceTrackingCo
stParams.getDelayToLiveInMillis(), swissTimingFactory, domainFactory, raceLogStore, regattaLogStore,
stParams.isUseInternalMarkPassingAlgorithm(), stParams.isTrackWind(),
stParams.isCorrectWindDirectionByMagneticDeclination(), stParams.getUpdateURL(),
stParams.getUpdateUsername(), stParams.getUpdatePassword());
stParams.getUpdateUsername(), stParams.getUpdatePassword(), stParams.getEventName(), stParams.getManage2SailEventUrl());
final String creatorName = SessionUtils.getPrincipal().toString();
if (result.getManage2SailEventUrl() != null) { // legacy records won't have this URL stored in their connectivity params
final SwissTimingConfiguration swissTimingConfiguration = SwissTimingFactory.INSTANCE
.createSwissTimingConfiguration(result.getEventName(), result.getManage2SailEventUrl(), result.getHostname(), result.getPort(), result.getUpdateURL(),
result.getUpdateUsername(), result.getUpdatePassword(), creatorName);
SwissTimingAdapterPersistence.INSTANCE.updateSwissTimingConfiguration(swissTimingConfiguration);
securityService.setDefaultOwnershipIfNotSet(swissTimingConfiguration.getIdentifier());
}
return result;
}
}
@@ -77,7 +77,7 @@ public interface DomainFactory {
RaceTrackingConnectivityParameters createTrackingConnectivityParameters(String hostname, int port, String raceID,
String raceName, String raceDescription, BoatClass boatClass, StartList startList,
long delayToLiveInMillis, SwissTimingFactory swissTimingFactory, DomainFactory domainFactory,
RaceLogStore raceLogStore, RegattaLogStore regattaLogStore, boolean useInternalMarkPassingAlgorithm, boolean trackWind, boolean correctWindDirectionByMagneticDeclination, String updateURL, String updateUsername, String updatePassword);
RaceLogStore raceLogStore, RegattaLogStore regattaLogStore, boolean useInternalMarkPassingAlgorithm, boolean trackWind, boolean correctWindDirectionByMagneticDeclination, String updateURL, String updateUsername, String updatePassword, String eventName, String manage2SailEventUrl);
ControlPoint getOrCreateControlPoint(String description, Iterable<Serializable> deviceIds, MarkType markType,
String shortNameOfGate);
@@ -29,7 +29,10 @@ public interface SwissTimingAdapter {
*/
RaceHandle addSwissTimingRace(TrackerManager trackerManager, RegattaIdentifier regattaToAddTo, String raceID,
String raceName, String raceDescription, BoatClass boatClass, String hostname, int port,
StartList startList, RaceLogStore logStore, RegattaLogStore regattaLogStore, long timeoutInMilliseconds, boolean useInternalMarkPassingAlgorithm, boolean trackWind, boolean correctWindDirectionByMagneticDeclination, String updateURL, String updateUsername, String updatePassword)
StartList startList, RaceLogStore logStore, RegattaLogStore regattaLogStore, long timeoutInMilliseconds,
boolean useInternalMarkPassingAlgorithm, boolean trackWind,
boolean correctWindDirectionByMagneticDeclination, String updateURL, String updateUsername,
String updatePassword, String eventName, String manage2SailEventUrl)
throws InterruptedException, UnknownHostException, IOException, ParseException, Exception;
StartList readStartListForRace(String raceId, RegattaResults regattaResults);
@@ -429,11 +429,11 @@ public class DomainFactoryImpl implements DomainFactory {
long delayToLiveInMillis, SwissTimingFactory swissTimingFactory, DomainFactory domainFactory,
RaceLogStore raceLogStore, RegattaLogStore regattaLogStore, boolean useInternalMarkPassingAlgorithm,
boolean trackWind, boolean correctWindDirectionByMagneticDeclination, String updateURL,
String updateUsername, String updatePassword) {
String updateUsername, String updatePassword, String eventName, String manage2SailEventUrl) {
return new SwissTimingTrackingConnectivityParameters(hostname, port, raceID, raceName, raceDescription,
boatClass, startList, delayToLiveInMillis, swissTimingFactory, domainFactory, raceLogStore,
regattaLogStore, useInternalMarkPassingAlgorithm, trackWind, correctWindDirectionByMagneticDeclination,
updateURL, updateUsername, updatePassword);
updateURL, updateUsername, updatePassword, eventName, manage2SailEventUrl);
}
@Override
@@ -70,12 +70,13 @@ public class SwissTimingAdapterImpl implements SwissTimingAdapter {
String raceName, String raceDescription, BoatClass boatClass, String hostname, int port,
StartList startList, RaceLogStore raceLogStore, RegattaLogStore regattaLogStore, long timeoutInMilliseconds,
boolean useInternalMarkPassingAlgorithm, boolean trackWind, boolean correctWindDirectionByMagneticDeclination,
String updateURL, String updateUsername, String updatePassword) throws Exception {
String updateURL, String updateUsername, String updatePassword, String eventName, String manage2SailEventUrl) throws Exception {
return trackerManager.addRace(regattaToAddTo,
swissTimingDomainFactory.createTrackingConnectivityParameters(hostname, port, raceID, raceName,
raceDescription, boatClass, startList, DEFAULT_SWISSTIMING_LIVE_DELAY_IN_MILLISECONDS,
swissTimingFactory, swissTimingDomainFactory, raceLogStore, regattaLogStore,
useInternalMarkPassingAlgorithm, trackWind, correctWindDirectionByMagneticDeclination, updateURL, updateUsername, updatePassword),
useInternalMarkPassingAlgorithm, trackWind, correctWindDirectionByMagneticDeclination,
updateURL, updateUsername, updatePassword, eventName, manage2SailEventUrl),
timeoutInMilliseconds);
}
@@ -37,12 +37,15 @@ public class SwissTimingTrackingConnectivityParameters extends AbstractRaceTrack
private final String updateURL;
private final String updateUsername;
private final String updatePassword;
private final String eventName;
private final String manage2SailEventUrl;
public SwissTimingTrackingConnectivityParameters(String hostname, int port, String raceID, String raceName,
String raceDescription, BoatClass boatClass, StartList startList, long delayToLiveInMillis,
SwissTimingFactory swissTimingFactory, DomainFactory domainFactory, RaceLogStore raceLogStore,
RegattaLogStore regattaLogStore, boolean useInternalMarkPassingAlgorithm, boolean trackWind,
boolean correctWindDirectionByMagneticDeclination, String updateURL, String updateUsername, String updatePassword) {
boolean correctWindDirectionByMagneticDeclination, String updateURL, String updateUsername,
String updatePassword, String eventName, String manage2SailEventUrl) {
super(trackWind, correctWindDirectionByMagneticDeclination);
this.hostname = hostname;
this.port = port;
@@ -60,6 +63,8 @@ public class SwissTimingTrackingConnectivityParameters extends AbstractRaceTrack
this.updateURL = updateURL;
this.updateUsername = updateUsername;
this.updatePassword = updatePassword;
this.eventName = eventName;
this.manage2SailEventUrl = manage2SailEventUrl;
}
@Override
@@ -137,6 +142,14 @@ public class SwissTimingTrackingConnectivityParameters extends AbstractRaceTrack
return useInternalMarkPassingAlgorithm;
}
public String getEventName() {
return eventName;
}
public String getManage2SailEventUrl() {
return manage2SailEventUrl;
}
@Override
public String toString() {
return getClass().getSimpleName()+" for "+hostname+":"+port+", raceName: "+raceName+", raceID: "+raceID+", boatClass: "+boatClass;
@@ -14,10 +14,14 @@ Require-Bundle: com.sap.sailing.domain.common,
com.sap.sse,
com.sap.sse.common,
com.sap.sailing.domain.shared.android,
com.sap.sailing.domain.persistence
com.sap.sailing.domain.persistence,
com.sap.sailing.domain.swisstimingadapter.persistence,
com.sap.sse.replication.interfaces,
com.sap.sse.security
Export-Package: com.sap.sailing.domain.swisstimingreplayadapter,
com.sap.sailing.domain.swisstimingreplayadapter.impl;x-friends:="com.sap.sailing.mongodb.test"
Import-Package: org.osgi.framework;version="1.7.0",
Import-Package: com.sap.sse.security,
org.osgi.framework;version="1.7.0",
org.osgi.util.tracker;version="1.5.1"
Bundle-Activator: com.sap.sailing.domain.swisstimingreplayadapter.impl.Activator
Automatic-Module-Name: com.sap.sailing.domain.swisstimingreplayadapter
@@ -35,6 +35,9 @@ public interface SwissTimingReplayService {
* @param link
* the URL without the implicit "http://" prefix, as obtained, e.g., from
* {@link SwissTimingReplayRace#getLink()}.
* @param swissTimingUrl
* the overview URL that lists the races that can be loaded; passed through in particular for
* re-establishing after master data import
* @param raceID
* the SwissTiming ID for the race
* @param useInternalMarkPassingAlgorithm
@@ -43,9 +46,10 @@ public interface SwissTimingReplayService {
* only required if {@code regattaToAddTo} is {@code null}; used for the retrieval/creation of a default
* regatta
*/
void loadRaceData(RegattaIdentifier regattaToAddTo, String link, String raceName, String raceID,
String boatClassName, TrackerManager trackerManager, TrackedRegattaRegistry trackedRegattaRegistry,
boolean useInternalMarkPassingAlgorithm, RaceLogStore raceLogStore, RegattaLogStore regattaLogStore)
void loadRaceData(RegattaIdentifier regattaToAddTo, String link, String swissTimingUrl, String raceName,
String raceID, String boatClassName, TrackerManager trackerManager,
TrackedRegattaRegistry trackedRegattaRegistry, boolean useInternalMarkPassingAlgorithm,
RaceLogStore raceLogStore, RegattaLogStore regattaLogStore)
throws MalformedURLException, FileNotFoundException, URISyntaxException, Exception;
/**
@@ -19,6 +19,8 @@ import com.sap.sailing.domain.swisstimingreplayadapter.SwissTimingReplayServiceF
import com.sap.sailing.domain.tracking.RaceTrackingConnectivityParametersHandler;
import com.sap.sse.MasterDataImportClassLoaderService;
import com.sap.sse.common.TypeBasedServiceFinder;
import com.sap.sse.replication.FullyInitializedReplicableTracker;
import com.sap.sse.security.SecurityService;
import com.sap.sse.util.ServiceTrackerFactory;
public class Activator implements BundleActivator {
@@ -40,11 +42,13 @@ public class Activator implements BundleActivator {
final ServiceTracker<DomainObjectFactory, DomainObjectFactory> domainObjectFactoryServiceTracker = ServiceTrackerFactory.createAndOpen(context, DomainObjectFactory.class);
final ServiceTracker<SwissTimingAdapterFactory, SwissTimingAdapterFactory> swissTimingAdapterFactoryServiceTracker = ServiceTrackerFactory.createAndOpen(context, SwissTimingAdapterFactory.class);
final ServiceTracker<RaceLogResolver, RaceLogResolver> raceLogResolverServiceTracker = ServiceTrackerFactory.createAndOpen(context, RaceLogResolver.class);
final FullyInitializedReplicableTracker<SecurityService> securityServiceTracker = FullyInitializedReplicableTracker.createAndOpen(context, SecurityService.class);
try {
final MongoObjectFactory mongoObjectFactory = mongoObjectFactoryServiceTracker.waitForService(0);
final DomainObjectFactory domainObjectFactory = domainObjectFactoryServiceTracker.waitForService(0);
final SwissTimingAdapterFactory swissTimingAdapterFactory = swissTimingAdapterFactoryServiceTracker.waitForService(0);
final RaceLogResolver raceLogResolver = raceLogResolverServiceTracker.waitForService(0);
final SecurityService securityService = securityServiceTracker.getInitializedService(0);
final Dictionary<String, Object> properties = new Hashtable<String, Object>();
final com.sap.sailing.domain.swisstimingadapter.DomainFactory domainFactory = swissTimingAdapterFactory
.getOrCreateSwissTimingAdapter(domainObjectFactory.getBaseDomainFactory())
@@ -52,7 +56,8 @@ public class Activator implements BundleActivator {
final SwissTimingReplayConnectivityParamsHandler paramsHandler = new SwissTimingReplayConnectivityParamsHandler(
MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(mongoObjectFactory, domainObjectFactory),
MongoRegattaLogStoreFactory.INSTANCE.getMongoRegattaLogStore(mongoObjectFactory, domainObjectFactory),
domainFactory, swissTimingReplayServiceFactory.createSwissTimingReplayService(domainFactory, raceLogResolver));
domainFactory, swissTimingReplayServiceFactory.createSwissTimingReplayService(domainFactory, raceLogResolver),
securityService);
properties.put(TypeBasedServiceFinder.TYPE, SwissTimingReplayConnectivityParameters.TYPE);
context.registerService(RaceTrackingConnectivityParametersHandler.class, paramsHandler, properties);
} catch (Exception e) {
@@ -32,6 +32,7 @@ public class SwissTimingReplayConnectivityParameters extends AbstractRaceTrackin
private final String raceName;
private final String raceID;
private final String link;
private final String swissTimingUrl;
private final transient SwissTimingReplayService replayService;
class SwissTimingReplayRaceTracker extends AbstractRaceTrackerImpl {
@@ -120,11 +121,12 @@ public class SwissTimingReplayConnectivityParameters extends AbstractRaceTrackin
}
}
public SwissTimingReplayConnectivityParameters(String link, String raceName, String raceID, String boatClassName,
boolean useInternalMarkPassingAlgorithm, DomainFactory domainFactory,
public SwissTimingReplayConnectivityParameters(String link, String swissTimingUrl, String raceName, String raceID,
String boatClassName, boolean useInternalMarkPassingAlgorithm, DomainFactory domainFactory,
SwissTimingReplayService replayService, RaceLogStore raceLogStore, RegattaLogStore regattaLogStore) {
super(/* trackWind: never track live wind with a SwissTiming Replay race */ false, /* correctWindDirectionByMagneticDeclination */ false);
this.link = link;
this.swissTimingUrl = swissTimingUrl;
this.raceName = raceName;
this.raceID = raceID;
this.boatClassName = boatClassName;
@@ -199,6 +201,10 @@ public class SwissTimingReplayConnectivityParameters extends AbstractRaceTrackin
return link;
}
public String getSwissTimingUrl() {
return swissTimingUrl;
}
@Override
public String toString() {
return getClass().getSimpleName()+" for "+raceName+"/"+raceID+", link: "+link+", boatClassName: "+boatClassName;
@@ -8,10 +8,15 @@ import java.util.Map;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.regattalog.RegattaLogStore;
import com.sap.sailing.domain.swisstimingadapter.DomainFactory;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingArchiveConfiguration;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingFactory;
import com.sap.sailing.domain.swisstimingadapter.persistence.SwissTimingAdapterPersistence;
import com.sap.sailing.domain.swisstimingreplayadapter.SwissTimingReplayService;
import com.sap.sailing.domain.tracking.RaceTrackingConnectivityParameters;
import com.sap.sailing.domain.tracking.impl.AbstractRaceTrackingConnectivityParametersHandler;
import com.sap.sse.common.TypeBasedServiceFinder;
import com.sap.sse.security.SecurityService;
import com.sap.sse.security.SessionUtils;
/**
* Handles mapping TracTrac connectivity parameters from and to a map with {@link String} keys. The
@@ -28,20 +33,23 @@ public class SwissTimingReplayConnectivityParamsHandler extends AbstractRaceTrac
private static final String RACE_ID = "raceId";
private static final String RACE_NAME = "raceName";
private static final String LINK = "link";
private static final String SWISS_TIMING_URL = "swissTimingUrl";
private static final String USE_INTERNAL_MARK_PASSING_ALGORITHM = "useInternalMarkPassingAlgorithm";
private static final String DELAY_TO_LIVE_IN_MILLIS = "delayToLiveInMillis";
private final RaceLogStore raceLogStore;
private final RegattaLogStore regattaLogStore;
private final DomainFactory domainFactory;
private final SwissTimingReplayService replayService;
private final SecurityService securityService;
public SwissTimingReplayConnectivityParamsHandler(RaceLogStore raceLogStore, RegattaLogStore regattaLogStore,
DomainFactory domainFactory, SwissTimingReplayService replayService) {
DomainFactory domainFactory, SwissTimingReplayService replayService, SecurityService securityService) {
super();
this.raceLogStore = raceLogStore;
this.regattaLogStore = regattaLogStore;
this.domainFactory = domainFactory;
this.replayService = replayService;
this.securityService = securityService;
}
@Override
@@ -49,6 +57,7 @@ public class SwissTimingReplayConnectivityParamsHandler extends AbstractRaceTrac
assert params instanceof SwissTimingReplayConnectivityParameters;
final SwissTimingReplayConnectivityParameters stParams = (SwissTimingReplayConnectivityParameters) params;
final Map<String, Object> result = getKey(params);
result.put(SWISS_TIMING_URL, stParams.getSwissTimingUrl());
result.put(DELAY_TO_LIVE_IN_MILLIS, stParams.getDelayToLiveInMillis());
result.put(USE_INTERNAL_MARK_PASSING_ALGORITHM, stParams.isUseInternalMarkPassingAlgorithm());
result.put(RACE_NAME, stParams.getRaceName());
@@ -60,10 +69,10 @@ public class SwissTimingReplayConnectivityParamsHandler extends AbstractRaceTrac
@Override
public RaceTrackingConnectivityParameters mapTo(Map<String, Object> map) throws MalformedURLException, URISyntaxException {
return new SwissTimingReplayConnectivityParameters((String) map.get(LINK), (String) map.get(RACE_NAME),
(String) map.get(RACE_ID), (String) map.get(BOAT_CLASS_NAME),
(boolean) map.get(USE_INTERNAL_MARK_PASSING_ALGORITHM), domainFactory, replayService, raceLogStore,
regattaLogStore);
return new SwissTimingReplayConnectivityParameters((String) map.get(LINK), (String) map.get(SWISS_TIMING_URL),
(String) map.get(RACE_NAME), (String) map.get(RACE_ID),
(String) map.get(BOAT_CLASS_NAME), (boolean) map.get(USE_INTERNAL_MARK_PASSING_ALGORITHM), domainFactory, replayService,
raceLogStore, regattaLogStore);
}
@Override
@@ -81,9 +90,16 @@ public class SwissTimingReplayConnectivityParamsHandler extends AbstractRaceTrac
assert params instanceof SwissTimingReplayConnectivityParameters;
final SwissTimingReplayConnectivityParameters stParams = (SwissTimingReplayConnectivityParameters) params;
SwissTimingReplayConnectivityParameters result = new SwissTimingReplayConnectivityParameters(stParams.getLink(),
stParams.getRaceName(), stParams.getRaceID(), stParams.getBoatClassName(),
stParams.isUseInternalMarkPassingAlgorithm(), domainFactory, replayService, raceLogStore,
regattaLogStore);
stParams.getSwissTimingUrl(), stParams.getRaceName(), stParams.getRaceID(),
stParams.getBoatClassName(), stParams.isUseInternalMarkPassingAlgorithm(), domainFactory, replayService,
raceLogStore, regattaLogStore);
final String creatorName = SessionUtils.getPrincipal().toString();
if (result.getSwissTimingUrl() != null) { // legacy records won't have this URL stored in their connectivity params
final SwissTimingArchiveConfiguration swissTimingArchiveConfiguration = SwissTimingFactory.INSTANCE
.createSwissTimingArchiveConfiguration(result.getSwissTimingUrl(), creatorName);
SwissTimingAdapterPersistence.INSTANCE.updateSwissTimingArchiveConfiguration(swissTimingArchiveConfiguration);
securityService.setDefaultOwnershipIfNotSet(swissTimingArchiveConfiguration.getIdentifier());
}
return result;
}
}
@@ -149,11 +149,13 @@ public class SwissTimingReplayServiceImpl implements SwissTimingReplayService {
}
@Override
public void loadRaceData(RegattaIdentifier regattaToAddTo, String link, String raceName, String raceID,
String boatClassName, TrackerManager trackerManager, TrackedRegattaRegistry trackedRegattaRegistry,
boolean useInternalMarkPassingAlgorithm, RaceLogStore raceLogStore, RegattaLogStore regattaLogStore)
public void loadRaceData(RegattaIdentifier regattaToAddTo, String link, String swissTimingUrl, String raceName,
String raceID, String boatClassName, TrackerManager trackerManager,
TrackedRegattaRegistry trackedRegattaRegistry, boolean useInternalMarkPassingAlgorithm,
RaceLogStore raceLogStore, RegattaLogStore regattaLogStore)
throws MalformedURLException, FileNotFoundException, URISyntaxException, Exception {
trackerManager.addRace(regattaToAddTo, new SwissTimingReplayConnectivityParameters(link, raceName, raceID,
boatClassName, useInternalMarkPassingAlgorithm, domainFactory, this, raceLogStore, regattaLogStore), /* timeout */ -1);
trackerManager
.addRace(regattaToAddTo, new SwissTimingReplayConnectivityParameters(link, swissTimingUrl, raceName,
raceID, boatClassName, useInternalMarkPassingAlgorithm, domainFactory, this, raceLogStore, regattaLogStore), /* timeout */ -1);
}
}
@@ -15,7 +15,10 @@ Require-Bundle: com.sap.sse.mongodb,
com.sap.sse,
org.mongodb.mongo-java-driver;bundle-version="3.6.4",
com.sap.sse.security.common,
com.sap.sse.replication.interfaces
com.sap.sse.replication.interfaces,
com.tractrac.clientmodule;bundle-version="3.13.1",
org.json.simple,
com.sap.sse.security
Export-Package: com.sap.sailing.domain.tractracadapter.persistence,
com.sap.sailing.domain.tractracadapter.persistence.impl;x-friends:="com.sap.sailing.mongodb.test"
Import-Package: com.sap.sse.security,
@@ -59,22 +59,20 @@ public class Activator implements BundleActivator {
final com.sap.sailing.domain.tractracadapter.DomainFactory domainFactory = tractracAdapterFactory
.getOrCreateTracTracAdapter(domainObjectFactory.getBaseDomainFactory())
.getTracTracDomainFactory();
final TracTracConnectivityParamsHandler paramsHandler = new TracTracConnectivityParamsHandler(
MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(mongoObjectFactory, domainObjectFactory),
MongoRegattaLogStoreFactory.INSTANCE.getMongoRegattaLogStore(mongoObjectFactory,
domainObjectFactory),
domainFactory);
com.sap.sailing.domain.tractracadapter.persistence.DomainObjectFactory tractracDomainObjectFactory = com.sap.sailing.domain.tractracadapter.persistence.PersistenceFactory.INSTANCE
.createDomainObjectFactory(mongoObjectFactory.getDatabase(), domainFactory);
com.sap.sailing.domain.tractracadapter.persistence.MongoObjectFactory tractracMongoObjectFactory = com.sap.sailing.domain.tractracadapter.persistence.PersistenceFactory.INSTANCE
.createMongoObjectFactory(mongoObjectFactory.getDatabase());
final TracTracConnectivityParamsHandler paramsHandler = new TracTracConnectivityParamsHandler(
MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(mongoObjectFactory, domainObjectFactory),
MongoRegattaLogStoreFactory.INSTANCE.getMongoRegattaLogStore(mongoObjectFactory,
domainObjectFactory),
domainFactory, tractracMongoObjectFactory, securityService);
for (TracTracConfiguration trackTrackConfig : tractracDomainObjectFactory.getTracTracConfigurations()) {
securityService.migrateOwnership(trackTrackConfig);
}
// we do not necessarily have tractrac configs, so ensure that migration is marked as done
// we do not necessarily have TracTrac configurations, so ensure that migration is marked as done
securityService.assumeOwnershipMigrated(SecuredDomainType.TRACTRAC_ACCOUNT.getName());
properties.put(TypeBasedServiceFinder.TYPE, RaceTrackingConnectivityParametersImpl.TYPE);
context.registerService(RaceTrackingConnectivityParametersHandler.class, paramsHandler, properties);
context.registerService(ClearStateTestSupport.class.getName(), new ClearStateTestSupport() {
@@ -1,11 +1,18 @@
package com.sap.sailing.domain.tractracadapter.persistence.impl;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.Map;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.regattalog.RegattaLogStore;
import com.sap.sailing.domain.tracking.RaceTracker;
@@ -13,10 +20,15 @@ import com.sap.sailing.domain.tracking.RaceTrackingConnectivityParameters;
import com.sap.sailing.domain.tracking.impl.AbstractRaceTrackingConnectivityParametersHandler;
import com.sap.sailing.domain.tractracadapter.DomainFactory;
import com.sap.sailing.domain.tractracadapter.impl.RaceTrackingConnectivityParametersImpl;
import com.sap.sailing.domain.tractracadapter.impl.TracTracConfigurationImpl;
import com.sap.sailing.domain.tractracadapter.impl.TracTracRaceTrackerImpl;
import com.sap.sailing.domain.tractracadapter.persistence.MongoObjectFactory;
import com.sap.sse.common.TypeBasedServiceFinder;
import com.sap.sse.common.impl.MillisecondsDurationImpl;
import com.sap.sse.common.impl.MillisecondsTimePoint;
import com.sap.sse.security.SecurityService;
import com.sap.sse.security.SessionUtils;
import com.sap.sse.util.HttpUrlConnectionHelper;
/**
* Handles mapping TracTrac connectivity parameters from and to a map with {@link String} keys. The
@@ -46,12 +58,18 @@ public class TracTracConnectivityParamsHandler extends AbstractRaceTrackingConne
private final RaceLogStore raceLogStore;
private final RegattaLogStore regattaLogStore;
private final DomainFactory domainFactory;
private final MongoObjectFactory tractracMongoObjectFactory;
private final SecurityService securityService;
public TracTracConnectivityParamsHandler(RaceLogStore raceLogStore, RegattaLogStore regattaLogStore, DomainFactory domainFactory) {
public TracTracConnectivityParamsHandler(RaceLogStore raceLogStore, RegattaLogStore regattaLogStore,
DomainFactory domainFactory, MongoObjectFactory tractracMongoObjectFactory,
SecurityService securityService) {
super();
this.raceLogStore = raceLogStore;
this.regattaLogStore = regattaLogStore;
this.domainFactory = domainFactory;
this.tractracMongoObjectFactory = tractracMongoObjectFactory;
this.securityService = securityService;
}
@Override
@@ -121,6 +139,24 @@ public class TracTracConnectivityParamsHandler extends AbstractRaceTrackingConne
ttParams.getRaceVisibility(), ttParams.isTrackWind(),
ttParams.isCorrectWindDirectionByMagneticDeclination(), ttParams.isPreferReplayIfAvailable(),
ttParams.getTimeoutInMillis(), ttParams.isUseOfficialEventsToUpdateRaceLog());
return result;
updatePersistentTracTracConfiguration(result);
return result;
}
private void updatePersistentTracTracConfiguration(RaceTrackingConnectivityParametersImpl params)
throws MalformedURLException, IOException, ParseException {
final String EVENT_MANAGER_HOSTNAME_PREFIX = "em.";
final URL paramsJsonUrl = new URL(params.getParamURL().getProtocol(),
params.getParamURL().getHost().startsWith(EVENT_MANAGER_HOSTNAME_PREFIX) ? params.getParamURL().getHost() : EVENT_MANAGER_HOSTNAME_PREFIX+params.getParamURL().getHost(),
"/events/"+params.getTractracRace().getEvent().getId().toString()+"/races/"+params.getTractracRace().getId().toString()+".json");
final URLConnection conn = HttpUrlConnectionHelper.redirectConnection(paramsJsonUrl);
final JSONObject paramsJson = (JSONObject) new JSONParser().parse(new InputStreamReader(conn.getInputStream()));
final String jsonURL = (String) paramsJson.get("eventJSON");
final String creatorName = SessionUtils.getPrincipal().toString();
final TracTracConfigurationImpl tracTracConfiguration = new TracTracConfigurationImpl(creatorName, params.getTractracRace().getEvent().getName(), jsonURL,
/* live URI */ null, /* stored URI */ null, // we mainly want to enable the user to list the event's races again in case they are removed; live/stored stuff comes from the tracking params
params.getCourseDesignUpdateURI()==null?null:params.getCourseDesignUpdateURI().toString(), params.getTracTracUsername(), params.getTracTracPassword());
tractracMongoObjectFactory.updateTracTracConfiguration(tracTracConfiguration);
securityService.setDefaultOwnershipIfNotSet(tracTracConfiguration.getIdentifier());
}
}
@@ -75,7 +75,7 @@ public class SailingServiceImplMock extends SailingServiceImpl {
public RaceHandle addSwissTimingRace(TrackerManager trackerManager,
RegattaIdentifier regattaToAddTo, String raceID, String raceName, String raceDescription,
BoatClass boatClass, String hostname, int port, StartList startList, RaceLogStore logStore,
RegattaLogStore regattaLogStore, long timeoutInMilliseconds, boolean useInternalMarkPassingAlgorithm, boolean trackWind, boolean correctWindDirectionByMagneticDeclination, String updateURL, String updateUsername, String updatePassword) throws InterruptedException,
RegattaLogStore regattaLogStore, long timeoutInMilliseconds, boolean useInternalMarkPassingAlgorithm, boolean trackWind, boolean correctWindDirectionByMagneticDeclination, String updateURL, String updateUsername, String updatePassword, String eventName, String manage2SailEventUrl) throws InterruptedException,
UnknownHostException, IOException, ParseException, Exception {
// TODO Auto-generated method stub
return null;
@@ -76,12 +76,9 @@ public class SwissTimingEventManagementPanel extends AbstractEventManagementPane
VerticalPanel verticalPanel = new VerticalPanel();
captionPanelConnections.setContentWidget(verticalPanel);
captionPanelConnections.setStyleName("bold");
connectionsTable = new SwissTimingConnectionTableWrapper(userService, sailingService, stringConstants,
errorReporter, true, tableResources, () -> {
});
errorReporter, true, tableResources, () -> {});
connectionsTable.refreshSwissTimingConnectionList();
// Add button panel
final AccessControlledButtonPanel buttonPanel = new AccessControlledButtonPanel(userService,
SecuredDomainType.TRACKED_RACE);
@@ -119,7 +116,6 @@ public class SwissTimingEventManagementPanel extends AbstractEventManagementPane
public void cancel() {
}
}, userService, errorReporter).show());
// Remove SwissTiming Connection
final Button removeButton = buttonPanel.addRemoveAction(stringMessages.remove(), () -> {
sailingService.deleteSwissTimingConfiguration(connectionsTable.getSelectionModel().getSelectedObject(),
@@ -136,7 +132,6 @@ public class SwissTimingEventManagementPanel extends AbstractEventManagementPane
}
});
});
// List Races in SwissTiming Connection
final Button listRacesButton = buttonPanel.addUnsecuredAction(stringMessages.listRaces(), () -> {
fillRaces(sailingService);
@@ -296,7 +291,6 @@ public class SwissTimingEventManagementPanel extends AbstractEventManagementPane
raceTable.addColumn(regattaNameColumn, stringConstants.regatta());
raceTable.addColumn(seriesNameColumn, stringConstants.series());
raceTable.addColumn(raceNameColumn, stringConstants.name());
//raceTable.addColumn(raceIdColumn, stringConstants.id());
raceTable.addColumn(raceStatusColumn, stringConstants.status());
raceTable.addColumn(boatClassColumn, stringConstants.boatClass());
raceTable.addColumn(genderColumn, stringConstants.gender());
@@ -323,14 +317,11 @@ public class SwissTimingEventManagementPanel extends AbstractEventManagementPane
});
}
private ListHandler<SwissTimingRaceRecordDTO> getRaceTableColumnSortHandler(List<SwissTimingRaceRecordDTO> raceRecords,
Column<SwissTimingRaceRecordDTO, ?> regattaNameColumn, Column<SwissTimingRaceRecordDTO, ?> seriesNameColumn,
Column<SwissTimingRaceRecordDTO, ?> nameColumn, Column<SwissTimingRaceRecordDTO, ?> trackingStartColumn,
Column<SwissTimingRaceRecordDTO, ?> raceIdColumn, Column<SwissTimingRaceRecordDTO, ?> boatClassColumn,
Column<SwissTimingRaceRecordDTO, ?> genderColumn, Column<SwissTimingRaceRecordDTO, ?> statusColumn) {
ListHandler<SwissTimingRaceRecordDTO> result = new ListHandler<SwissTimingRaceRecordDTO>(raceRecords);
result.setComparator(regattaNameColumn, new Comparator<SwissTimingRaceRecordDTO>() {
@Override
@@ -449,21 +440,20 @@ public class SwissTimingEventManagementPanel extends AbstractEventManagementPane
// Check if the assigned regatta makes sense
if (checkBoatClassOK(selectedRegatta, selectedRaces)) {
sailingService.trackWithSwissTiming(
/* regattaToAddTo */ regattaIdentifier,
selectedRaces, hostname, port, trackWind, correctWindByDeclination,
useInternalMarkPassingAlgorithm, updateURL, updateUsername, updatePassword, new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error trying to register races " + selectedRaces + " for tracking: "
+ caught.getMessage());
}
sailingService.trackWithSwissTiming(/* regattaToAddTo */ regattaIdentifier, selectedRaces, hostname, port,
trackWind, correctWindByDeclination, useInternalMarkPassingAlgorithm, updateURL, updateUsername,
updatePassword, selectedObject.getName(), selectedObject.getJsonUrl(), new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error trying to register races " + selectedRaces
+ " for tracking: " + caught.getMessage());
}
@Override
public void onSuccess(Void result) {
regattaRefresher.fillRegattas();
}
});
@Override
public void onSuccess(Void result) {
regattaRefresher.fillRegattas();
}
});
}
}
}
@@ -136,6 +136,7 @@ public class SwissTimingConnectionDialog extends DataEntryDialog<SwissTimingConf
final String result = SwissTimingEventIdUrlUtil.getUrlFromEventId(eventIdText);
if (result != null) {
manage2SailEventUrlJsonTextBox.setValue(result, /* fire events */ false);
validateAndUpdate();
}
}
@@ -26,10 +26,10 @@ public class TracTracConnectionEditDialog extends TracTracConnectionDialog {
private void setData(final TracTracConfigurationWithSecurityDTO dtotoEdit) {
name = dtotoEdit.getName();
creatorName = dtotoEdit.getCreatorName();
storedURITextBox.setText(dtotoEdit.getStoredDataURI());
liveURITextBox.setText(dtotoEdit.getLiveDataURI());
storedURITextBox.setText(dtotoEdit.getStoredDataURI()==null?"":dtotoEdit.getStoredDataURI());
liveURITextBox.setText(dtotoEdit.getLiveDataURI()==null?"":dtotoEdit.getLiveDataURI());
jsonURLTextBox.setText(dtotoEdit.getJsonUrl());
tracTracUpdateURITextBox.setText(dtotoEdit.getCourseDesignUpdateURI());
tracTracUpdateURITextBox.setText(dtotoEdit.getCourseDesignUpdateURI()==null?"":dtotoEdit.getCourseDesignUpdateURI());
tractracUsernameTextBox.setText(dtotoEdit.getTracTracUsername());
tractracPasswordTextBox.setText(dtotoEdit.getTracTracPassword());
super.getOkButton().setEnabled(!jsonURLTextBox.getText().isEmpty());
@@ -70,18 +70,17 @@ public class TracTracConnectionTableWrapper extends
final TextColumn<TracTracConfigurationWithSecurityDTO> tracTracAccountNameColumn = new AbstractSortableTextColumn<TracTracConfigurationWithSecurityDTO>(
dto -> dto.getName(), tracTracAccountColumnListHandler);
final TextColumn<TracTracConfigurationWithSecurityDTO> tracTracAccountLiveUriColumn = new AbstractSortableTextColumn<TracTracConfigurationWithSecurityDTO>(
dto -> dto.getLiveDataURI(), tracTracAccountColumnListHandler);
dto -> dto.getLiveDataURI()==null?"":dto.getLiveDataURI(), tracTracAccountColumnListHandler);
final TextColumn<TracTracConfigurationWithSecurityDTO> tracTracAccountStoredUriColumn = new AbstractSortableTextColumn<TracTracConfigurationWithSecurityDTO>(
dto -> dto.getStoredDataURI(), tracTracAccountColumnListHandler);
dto -> dto.getStoredDataURI()==null?"":dto.getStoredDataURI(), tracTracAccountColumnListHandler);
final TextColumn<TracTracConfigurationWithSecurityDTO> tracTracAccountJsonUrlColumn = new AbstractSortableTextColumn<TracTracConfigurationWithSecurityDTO>(
dto -> dto.getJsonUrl(), tracTracAccountColumnListHandler);
final TextColumn<TracTracConfigurationWithSecurityDTO> tracTracAccountTracTracServerUpdateUriColumn = new AbstractSortableTextColumn<TracTracConfigurationWithSecurityDTO>(
dto -> dto.getCourseDesignUpdateURI(), tracTracAccountColumnListHandler);
dto -> dto.getCourseDesignUpdateURI()==null?"":dto.getCourseDesignUpdateURI(), tracTracAccountColumnListHandler);
final TextColumn<TracTracConfigurationWithSecurityDTO> tracTracAccountUsernameColumn = new AbstractSortableTextColumn<TracTracConfigurationWithSecurityDTO>(
dto -> dto.getTracTracUsername(), tracTracAccountColumnListHandler);
final TextColumn<TracTracConfigurationWithSecurityDTO> tracTracAccountCreatorNameColumn = new AbstractSortableTextColumn<TracTracConfigurationWithSecurityDTO>(
dto -> dto.getCreatorName(), tracTracAccountColumnListHandler);
final HasPermissions type = SecuredDomainType.TRACTRAC_ACCOUNT;
final AccessControlledActionsColumn<TracTracConfigurationWithSecurityDTO, DefaultActionsImagesBarCell> actionColumn = create(
new DefaultActionsImagesBarCell(stringMessages), userService);
@@ -190,7 +190,7 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS
void trackWithSwissTiming(RegattaIdentifier regattaToAddTo, Iterable<SwissTimingRaceRecordDTO> rrs, String hostname,
int port, boolean trackWind, boolean correctWindByDeclination, boolean useInternalMarkPassingAlgorithm,
String updateURL, String updateUsername, String updatePassword) throws UnauthorizedException, Exception;
String updateURL, String updateUsername, String updatePassword, String eventName, String manage2SailEventUrl) throws UnauthorizedException, Exception;
void replaySwissTimingRace(RegattaIdentifier regattaIdentifier, Iterable<SwissTimingReplayRaceDTO> replayRaces,
boolean trackWind, boolean correctWindByDeclination, boolean useInternalMarkPassingAlgorithm)
@@ -189,9 +189,10 @@ public interface SailingServiceAsync extends FileStorageManagementGwtServiceAsyn
boolean useOfficialEventsToUpdateRaceLog, String tracTracUsername,
String tracTracPassword, AsyncCallback<Void> callback);
void trackWithSwissTiming(RegattaIdentifier regattaToAddTo, Iterable<SwissTimingRaceRecordDTO> rrs,
String hostname, int port, boolean trackWind, boolean correctWindByDeclination,
boolean useInternalMarkPassingAlgorithm, String updateURL, String updateUsername, String updatePassword, AsyncCallback<Void> asyncCallback);
void trackWithSwissTiming(RegattaIdentifier regattaToAddTo, Iterable<SwissTimingRaceRecordDTO> rrs, String hostname,
int port, boolean trackWind, boolean correctWindByDeclination, boolean useInternalMarkPassingAlgorithm,
String updateURL, String updateUsername, String updatePassword, String eventName,
String manage2SailEventUrl, AsyncCallback<Void> asyncCallback);
void replaySwissTimingRace(RegattaIdentifier regattaIdentifier, Iterable<SwissTimingReplayRaceDTO> replayRaces,
boolean trackWind, boolean correctWindByDeclination, boolean useInternalMarkPassingAlgorithm,
@@ -398,8 +398,6 @@ public class MasterDataImportPanel extends VerticalPanel {
exportTrackedRacesAndStartTrackingSwitch = new CheckBox(stringMessages.exportTrackedRacesAndStartTracking());
exportTrackedRacesAndStartTrackingSwitch.setTitle(stringMessages.exportTrackedRacesAndStartTrackingTooltip());
exportTrackedRacesAndStartTrackingSwitch.setValue(false);
//TODO: Remove after bug5245 is fixed.
exportTrackedRacesAndStartTrackingSwitch.setVisible(false);
contentPanel.add(exportTrackedRacesAndStartTrackingSwitch);
importLeaderboardGroupsButton = new Button(stringMessages.importSelectedLeaderboardGroups());
@@ -1503,9 +1503,10 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet
TracTracConfigurationWithSecurityDTO config = new TracTracConfigurationWithSecurityDTO(
ttConfig.getName(),
ttConfig.getJSONURL().toString(),
ttConfig.getLiveDataURI().toString(), ttConfig.getStoredDataURI().toString(),
ttConfig.getCourseDesignUpdateURI().toString(), ttConfig.getTracTracUsername().toString(),
ttConfig.getTracTracPassword().toString(), ttConfig.getCreatorName());
ttConfig.getLiveDataURI()==null?null:ttConfig.getLiveDataURI().toString(),
ttConfig.getStoredDataURI()==null?null:ttConfig.getStoredDataURI().toString(),
ttConfig.getCourseDesignUpdateURI()==null?null:ttConfig.getCourseDesignUpdateURI().toString(),
ttConfig.getTracTracUsername(), ttConfig.getTracTracPassword(), ttConfig.getCreatorName());
SecurityDTOUtil.addSecurityInformation(getSecurityService(), config, config.getIdentifier());
return config;
});
@@ -3429,10 +3430,12 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet
}
@Override
public void trackWithSwissTiming(RegattaIdentifier regattaToAddTo, Iterable<SwissTimingRaceRecordDTO> rrs, String hostname, int port,
boolean trackWind, final boolean correctWindByDeclination, boolean useInternalMarkPassingAlgorithm,
String updateURL, String updateUsername, String updatePassword) throws InterruptedException, ParseException, Exception {
logger.info("tracWithSwissTiming for regatta " + regattaToAddTo + " for race records " + rrs
public void trackWithSwissTiming(RegattaIdentifier regattaToAddTo, Iterable<SwissTimingRaceRecordDTO> rrs,
String hostname, int port, boolean trackWind, final boolean correctWindByDeclination,
boolean useInternalMarkPassingAlgorithm, String updateURL, String updateUsername, String updatePassword,
String eventName, String manage2SailEventUrl) throws InterruptedException, ParseException, Exception {
logger.info(
"tracWithSwissTiming for regatta " + regattaToAddTo + " for race records " + rrs
+ " with hostname " + hostname + " and port " + port);
Map<String, RegattaResults> cachedRegattaEntriesLists = new HashMap<String, RegattaResults>();
for (SwissTimingRaceRecordDTO rr : rrs) {
@@ -3457,7 +3460,7 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet
rr.raceId, rr.getName(), raceDescription, boatClass, hostname, port, startList,
getRaceLogStore(), getRegattaLogStore(),
RaceTracker.TIMEOUT_FOR_RECEIVING_RACE_DEFINITION_IN_MILLISECONDS, useInternalMarkPassingAlgorithm, trackWind,
correctWindByDeclination, updateURL, updateUsername, updatePassword);
correctWindByDeclination, updateURL, updateUsername, updatePassword, eventName, manage2SailEventUrl);
}
}
@@ -3472,7 +3475,7 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet
for (SwissTimingReplayRace replayRace : replayRaces) {
result.add(new SwissTimingReplayRaceDTO(replayRace.getFlightNumber(), replayRace.getRaceId(),
replayRace.getRsc(), replayRace.getName(), replayRace.getBoatClass(), replayRace.getStartTime(),
replayRace.getLink(), hasRememberedRegatta(replayRace.getRaceId())));
replayRace.getLink(), hasRememberedRegatta(replayRace.getRaceId()), swissTimingUrl));
}
return result;
}
@@ -3497,8 +3500,9 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet
} else {
boatClassName = null;
}
getSwissTimingReplayService().loadRaceData(regattaIdentifier, replayRaceDTO.link, replayRaceDTO.getName(),
replayRaceDTO.race_id, boatClassName, getService(), getService(), useInternalMarkPassingAlgorithm, getRaceLogStore(), getRegattaLogStore());
getSwissTimingReplayService().loadRaceData(regattaIdentifier, replayRaceDTO.link,
replayRaceDTO.swissTimingUrl, replayRaceDTO.getName(), replayRaceDTO.race_id, boatClassName, getService(),
getService(), useInternalMarkPassingAlgorithm, getRaceLogStore(), getRegattaLogStore());
} catch (Exception e) {
logger.log(Level.SEVERE, "Error trying to load SwissTimingReplay race " + replayRaceDTO, e);
}
@@ -10,10 +10,12 @@ public class SwissTimingReplayRaceDTO extends AbstractRaceRecordDTO {
public String boat_class;
public Date startTime;
public String link;
public String swissTimingUrl;
public SwissTimingReplayRaceDTO() {}
public SwissTimingReplayRaceDTO(String flight_number, String race_id, String rsc, String name, String boat_class, Date startTime, String link, boolean hasRememberedRegatta) {
public SwissTimingReplayRaceDTO(String flight_number, String race_id, String rsc, String name, String boat_class,
Date startTime, String link, boolean hasRememberedRegatta, String swissTimingUrl) {
super(name, hasRememberedRegatta);
this.flight_number = flight_number;
this.race_id = race_id;
@@ -21,6 +23,7 @@ public class SwissTimingReplayRaceDTO extends AbstractRaceRecordDTO {
this.boat_class = boat_class;
this.startTime = startTime;
this.link = link;
this.swissTimingUrl = swissTimingUrl;
}
@Override
@@ -1,6 +1,7 @@
package com.sap.sailing.mongodb.test;
import java.util.HashMap;
import static org.mockito.Mockito.mock;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
@@ -21,6 +22,7 @@ import com.sap.sailing.domain.swisstimingreplayadapter.impl.SwissTimingReplayCon
import com.sap.sailing.domain.tracking.RaceTrackingConnectivityParametersHandler;
import com.sap.sailing.domain.tractracadapter.TracTracAdapterFactory;
import com.sap.sailing.domain.tractracadapter.impl.RaceTrackingConnectivityParametersImpl;
import com.sap.sailing.domain.tractracadapter.persistence.impl.MongoObjectFactoryImpl;
import com.sap.sailing.domain.tractracadapter.persistence.impl.TracTracConnectivityParamsHandler;
import com.sap.sailing.server.impl.RacingEventServiceImpl;
import com.sap.sailing.server.interfaces.RacingEventService;
@@ -29,6 +31,7 @@ import com.sap.sailing.shared.persistence.device.impl.PlaceHolderDeviceIdentifie
import com.sap.sse.common.NoCorrespondingServiceRegisteredException;
import com.sap.sse.common.TypeBasedServiceFinder;
import com.sap.sse.common.TypeBasedServiceFinderFactory;
import com.sap.sse.security.SecurityService;
/**
* A simplified implementation of the {@link TypeBasedServiceFinder} interface that, when the device type
@@ -50,23 +53,25 @@ public class MockConnectivityParamsServiceFinderFactory implements TypeBasedServ
final MongoObjectFactory mongoObjectFactory = racingEventService.getMongoObjectFactory();
final DomainObjectFactory domainObjectFactory = racingEventService.getDomainObjectFactory();
final DomainFactory swissTimingDomainFactory = new SwissTimingAdapterFactoryImpl().getOrCreateSwissTimingAdapter(domainObjectFactory.getBaseDomainFactory()).getSwissTimingDomainFactory();
final SecurityService securityServiceMock = mock(SecurityService.class);
switch (type) {
case RaceTrackingConnectivityParametersImpl.TYPE:
return new TracTracConnectivityParamsHandler(
MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(mongoObjectFactory, domainObjectFactory),
MongoRegattaLogStoreFactory.INSTANCE.getMongoRegattaLogStore(mongoObjectFactory, domainObjectFactory),
TracTracAdapterFactory.INSTANCE.getOrCreateTracTracAdapter(domainObjectFactory.getBaseDomainFactory()).getTracTracDomainFactory());
TracTracAdapterFactory.INSTANCE.getOrCreateTracTracAdapter(domainObjectFactory.getBaseDomainFactory()).getTracTracDomainFactory(),
new MongoObjectFactoryImpl(mongoObjectFactory.getDatabase()), securityServiceMock);
case SwissTimingTrackingConnectivityParameters.TYPE:
return new com.sap.sailing.domain.swisstimingadapter.persistence.impl.SwissTimingConnectivityParamsHandler(
MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(mongoObjectFactory, domainObjectFactory),
MongoRegattaLogStoreFactory.INSTANCE.getMongoRegattaLogStore(mongoObjectFactory, domainObjectFactory),
swissTimingDomainFactory);
swissTimingDomainFactory, securityServiceMock);
case SwissTimingReplayConnectivityParameters.TYPE:
return new SwissTimingReplayConnectivityParamsHandler(
MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(mongoObjectFactory, domainObjectFactory),
MongoRegattaLogStoreFactory.INSTANCE.getMongoRegattaLogStore(mongoObjectFactory, domainObjectFactory),
swissTimingDomainFactory,
SwissTimingReplayServiceFactory.INSTANCE.createSwissTimingReplayService(swissTimingDomainFactory, racingEventService));
SwissTimingReplayServiceFactory.INSTANCE.createSwissTimingReplayService(swissTimingDomainFactory, racingEventService), securityServiceMock);
case RaceLogConnectivityParams.TYPE:
return new com.sap.sailing.domain.racelogtracking.impl.RaceLogConnectivityParamsHandler(racingEventService);
default:
@@ -40,6 +40,8 @@ public class SwissTimingConnectivityParamsLoadAndStoreTest extends AbstractConne
final String raceID = "Race ID 123";
final String raceName = "The Race";
final String raceDescription = null;
final String eventName = "World Cup Series | Enoshima, Japan";
final String manage2SailEventUrl = "http://manage2sail.com/api/public/links/event/1ab2e511-333f-4dff-a347-21d30bfd0062?accesstoken=bDAv8CwsTM94ujZ&mediaType=json&includeRaces=true";
final BoatClass boatClass = domainObjectFactory.getBaseDomainFactory().getOrCreateBoatClass("49er");
final CrewMemberImpl c1c1 = new CrewMemberImpl("c1c1", "GER", "Helm");
final CrewMemberImpl c1c2 = new CrewMemberImpl("c1c2", "POL", "Crew");
@@ -54,7 +56,7 @@ public class SwissTimingConnectivityParamsLoadAndStoreTest extends AbstractConne
hostname, port, raceID, raceName, raceDescription, boatClass, startList, delayToLiveInMillis,
SwissTimingFactory.INSTANCE, new SwissTimingAdapterFactoryImpl().getOrCreateSwissTimingAdapter(domainObjectFactory.getBaseDomainFactory()).getSwissTimingDomainFactory(),
/* raceLogStore */ null, /* regattaLogStore */ null, useInternalMarkPassingAlgorithm, trackWind, correctWindDirectionByMagneticDeclination,
/* updateURL */ null, /* updateUsername */ null, /* updatePassword */ null);
/* updateURL */ null, /* updateUsername */ null, /* updatePassword */ null, eventName, manage2SailEventUrl);
// store
mongoObjectFactory.addConnectivityParametersForRaceToRestore(stParams);
// load
@@ -78,6 +80,8 @@ public class SwissTimingConnectivityParamsLoadAndStoreTest extends AbstractConne
assertEquals(stParams.getTrackerID(), stParamsReadFromDB.getTrackerID());
assertEquals(stParams.isTrackWind(), stParamsReadFromDB.isTrackWind());
assertEquals(stParams.isCorrectWindDirectionByMagneticDeclination(), stParamsReadFromDB.isCorrectWindDirectionByMagneticDeclination());
assertEquals(stParams.getEventName(), stParamsReadFromDB.getEventName());
assertEquals(stParams.getManage2SailEventUrl(), stParamsReadFromDB.getManage2SailEventUrl());
// remove again
mongoObjectFactory.removeConnectivityParametersForRaceToRestore(stParams);
final Set<RaceTrackingConnectivityParameters> connectivityParametersForRacesToRestore2 = new HashSet<>();
@@ -95,6 +99,8 @@ public class SwissTimingConnectivityParamsLoadAndStoreTest extends AbstractConne
final String raceID = "Race ID 123";
final String raceName = "The Race";
final String raceDescription = null;
final String eventName = "World Cup Series | Enoshima, Japan";
final String manage2SailEventUrl = "http://manage2sail.com/api/public/links/event/1ab2e511-333f-4dff-a347-21d30bfd0062?accesstoken=bDAv8CwsTM94ujZ&mediaType=json&includeRaces=true";
final BoatClass boatClass = domainObjectFactory.getBaseDomainFactory().getOrCreateBoatClass("49er");
final CompetitorWithoutID c1 = new CompetitorWithoutID("b1", "GER", "C1");
final CompetitorWithoutID c2 = new CompetitorWithoutID("b2", "GER", "21");
@@ -105,7 +111,7 @@ public class SwissTimingConnectivityParamsLoadAndStoreTest extends AbstractConne
hostname, port, raceID, raceName, raceDescription, boatClass, startList, delayToLiveInMillis,
SwissTimingFactory.INSTANCE, new SwissTimingAdapterFactoryImpl().getOrCreateSwissTimingAdapter(domainObjectFactory.getBaseDomainFactory()).getSwissTimingDomainFactory(),
/* raceLogStore */ null, /* regattaLogStore */ null, useInternalMarkPassingAlgorithm, trackWind, correctWindDirectionByMagneticDeclination,
/* updateURL */ null, /* updateUsername */ null, /* updatePassword */ null);
/* updateURL */ null, /* updateUsername */ null, /* updatePassword */ null, eventName, manage2SailEventUrl);
// store
mongoObjectFactory.addConnectivityParametersForRaceToRestore(stParams);
// load
@@ -31,12 +31,13 @@ public class SwissTimingReplayConnectivityParamsLoadAndStoreTest extends Abstrac
final String raceID = "Race ID 123";
final String raceName = "The Race";
final String boatClassName = "49er";
final String swissTimingUrl = "https://static.sapsailing.com/OSG2016/OSG2016_static.json";
final boolean useInternalMarkPassingAlgorithm = false;
final SwissTimingAdapter swissTimingAdapter = new SwissTimingAdapterFactoryImpl().getOrCreateSwissTimingAdapter(domainObjectFactory.getBaseDomainFactory());
final SwissTimingReplayConnectivityParameters stParams = new SwissTimingReplayConnectivityParameters(
link, raceName, raceID, boatClassName, useInternalMarkPassingAlgorithm, swissTimingAdapter.getSwissTimingDomainFactory(),
new SwissTimingReplayServiceFactoryImpl().createSwissTimingReplayService(swissTimingAdapter.getSwissTimingDomainFactory(), racingEventService),
/* raceLogStore */ null, /* regattaLogStore */ null);
link, swissTimingUrl, raceName, raceID, boatClassName, useInternalMarkPassingAlgorithm,
swissTimingAdapter.getSwissTimingDomainFactory(),
new SwissTimingReplayServiceFactoryImpl().createSwissTimingReplayService(swissTimingAdapter.getSwissTimingDomainFactory(), racingEventService), /* raceLogStore */ null, /* regattaLogStore */ null);
// store
mongoObjectFactory.addConnectivityParametersForRaceToRestore(stParams);
// load
@@ -49,6 +50,7 @@ public class SwissTimingReplayConnectivityParamsLoadAndStoreTest extends Abstrac
assertTrue(paramsReadFromDB instanceof SwissTimingReplayConnectivityParameters);
SwissTimingReplayConnectivityParameters stParamsReadFromDB = (SwissTimingReplayConnectivityParameters) paramsReadFromDB;
assertEquals(link, stParamsReadFromDB.getLink());
assertEquals(swissTimingUrl, stParams.getSwissTimingUrl());
assertEquals(boatClassName, stParamsReadFromDB.getBoatClassName());
assertEquals(raceID, stParamsReadFromDB.getRaceID());
assertEquals(raceName, stParamsReadFromDB.getRaceName());
@@ -582,7 +582,7 @@ public class ImportMasterDataOperation extends
}
private void ensureOwnership(QualifiedObjectIdentifier identifier, SecurityService securityService) {
logger.info("Trying to adopting " + identifier + " from Masterdataimport to " + user.getName() +
logger.info("Trying to adopt " + identifier + " from Masterdataimport to " + user.getName() +
" and group " + (tenant==null?"null":tenant.getName())+" if orphaned");
securityService.setOwnershipIfNotSet(identifier, user, tenant);
}
@@ -31,10 +31,187 @@
<stringAttribute key="profilingTraceType-NETWORK_TRACE" value="KEY_APPLICATION_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_SESSION_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_ENABLEMENT%CTX_KEY%false%CTX_ENTRY%KEY_USER_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_REQUEST_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_RESOLVE_ALL_HOSTS%CTX_KEY%true%CTX_ENTRY%KEY_TENANT_FILTER%CTX_KEY%*%CTX_ENTRY%"/>
<stringAttribute key="profilingTraceType-PERFORMANCE_HOTSPOT_TRACE" value="KEY_IGNORE_SLEEPING_THREADS%CTX_KEY%false%CTX_ENTRY%KEY_APPLICATION_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_SESSION_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_ENABLEMENT%CTX_KEY%true%CTX_ENTRY%KEY_USER_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_REQUEST_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_TENANT_FILTER%CTX_KEY%*%CTX_ENTRY%"/>
<stringAttribute key="profilingTraceType-SYNCHRONIZATION_TRACE" value="KEY_APPLICATION_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_SESSION_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_ENABLEMENT%CTX_KEY%false%CTX_ENTRY%KEY_USER_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_REQUEST_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_TENANT_FILTER%CTX_KEY%*%CTX_ENTRY%"/>
<setAttribute key="selected_target_bundles">
<setEntry value="com.fasterxml.jackson.core.jackson-annotations@default:default"/>
<setEntry value="com.fasterxml.jackson.core.jackson-core@default:default"/>
<setEntry value="com.fasterxml.jackson.core.jackson-databind@default:default"/>
<setEntry value="com.rabbitmq.client@default:default"/>
<setEntry value="com.sun.activation.javax.activation@default:default"/>
<setEntry value="com.sun.istack.commons-runtime@default:default"/>
<setEntry value="com.sun.jersey.contribs.jersey-multipart@default:default"/>
<setEntry value="com.sun.jersey@default:default"/>
<setEntry value="com.sun.mail.javax.mail@default:default"/>
<setEntry value="com.sun.xml.bind.jaxb-impl@default:default"/>
<setEntry value="jackson-core-asl@default:default"/>
<setEntry value="jackson-jaxrs@default:default"/>
<setEntry value="jackson-mapper-asl@default:default"/>
<setEntry value="javax.servlet@default:default"/>
<setEntry value="javax.validation@default:default"/>
<setEntry value="javax.ws.rs@default:default"/>
<setEntry value="javax.xml.stream@default:default"/>
<setEntry value="javax.xml.ws@default:default"/>
<setEntry value="javax.xml@default:default"/>
<setEntry value="jaxb-api@default:default"/>
<setEntry value="jcl.over.slf4j@default:default"/>
<setEntry value="lz4-java@default:default"/>
<setEntry value="org.apache.commons.beanutils@default:default"/>
<setEntry value="org.apache.commons.codec@default:default"/>
<setEntry value="org.apache.commons.collections@default:default"/>
<setEntry value="org.apache.commons.fileupload@default:default"/>
<setEntry value="org.apache.commons.io@default:default"/>
<setEntry value="org.apache.commons.lang@default:default"/>
<setEntry value="org.apache.commons.math3@default:default"/>
<setEntry value="org.apache.commons.math@default:default"/>
<setEntry value="org.apache.felix.gogo.command@default:default"/>
<setEntry value="org.apache.felix.gogo.runtime@default:default"/>
<setEntry value="org.apache.felix.gogo.shell@default:default"/>
<setEntry value="org.apache.felix.shell.remote@0:true"/>
<setEntry value="org.apache.felix.shell@0:true"/>
<setEntry value="org.apache.httpcomponents.httpclient@default:default"/>
<setEntry value="org.apache.httpcomponents.httpcore@default:default"/>
<setEntry value="org.apache.poi.ooxml.schemas@default:default"/>
<setEntry value="org.apache.poi.ooxml@default:default"/>
<setEntry value="org.apache.poi@default:default"/>
<setEntry value="org.apache.servicemix.bundles.aws-java-sdk@default:default"/>
<setEntry value="org.apache.servicemix.bundles.ehcache@default:default"/>
<setEntry value="org.apache.servicemix.bundles.scribe@default:default"/>
<setEntry value="org.apache.servicemix.bundles.zxing@default:default"/>
<setEntry value="org.apache.shiro.core@default:default"/>
<setEntry value="org.apache.shiro.ehcache@default:default"/>
<setEntry value="org.apache.shiro.web@default:default"/>
<setEntry value="org.apache.xmlbeans@default:default"/>
<setEntry value="org.dom4j@default:default"/>
<setEntry value="org.eclipse.equinox.cm@default:default"/>
<setEntry value="org.eclipse.equinox.common@2:true"/>
<setEntry value="org.eclipse.equinox.console@default:default"/>
<setEntry value="org.eclipse.equinox.launcher@default:default"/>
<setEntry value="org.eclipse.equinox.simpleconfigurator@2:true"/>
<setEntry value="org.eclipse.jetty.client@default:default"/>
<setEntry value="org.eclipse.jetty.deploy@4:true"/>
<setEntry value="org.eclipse.jetty.http@4:true"/>
<setEntry value="org.eclipse.jetty.io@4:true"/>
<setEntry value="org.eclipse.jetty.jmx@4:true"/>
<setEntry value="org.eclipse.jetty.osgi.boot@3:true"/>
<setEntry value="org.eclipse.jetty.security@4:true"/>
<setEntry value="org.eclipse.jetty.server@4:true"/>
<setEntry value="org.eclipse.jetty.servlet@4:true"/>
<setEntry value="org.eclipse.jetty.util@4:true"/>
<setEntry value="org.eclipse.jetty.webapp@4:true"/>
<setEntry value="org.eclipse.jetty.websocket.api@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.client@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.common@default:default"/>
<setEntry value="org.eclipse.jetty.xml@4:true"/>
<setEntry value="org.eclipse.osgi.services@default:default"/>
<setEntry value="org.eclipse.osgi.util@default:default"/>
<setEntry value="org.eclipse.osgi@-1:true"/>
<setEntry value="org.hyperic.sigar@default:default"/>
<setEntry value="org.jdom@default:default"/>
<setEntry value="org.jvnet.mimepull@default:default"/>
<setEntry value="org.mongodb.mongo-java-driver@default:default"/>
<setEntry value="org.objectweb.asm@default:default"/>
<setEntry value="routeconverter@default:default"/>
<setEntry value="slf4j.api@default:default"/>
<setEntry value="slf4j.jdk14@default:false"/>
</setAttribute>
<setAttribute key="selected_workspace_bundles">
<setEntry value="com.google.gwt.servlet@default:default"/>
<setEntry value="com.googlecode.java-diff-utils@default:default"/>
<setEntry value="com.sap.sailing.barbados.resultimport@4:true"/>
<setEntry value="com.sap.sailing.competitorimport@default:default"/>
<setEntry value="com.sap.sailing.dashboards.gwt@6:true"/>
<setEntry value="com.sap.sailing.datamining.provider@default:default"/>
<setEntry value="com.sap.sailing.datamining.shared@default:default"/>
<setEntry value="com.sap.sailing.datamining@5:true"/>
<setEntry value="com.sap.sailing.declination@default:default"/>
<setEntry value="com.sap.sailing.domain.bravoadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.common@default:default"/>
<setEntry value="com.sap.sailing.domain.deckmanadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.expeditionadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.igtimiadapter.gateway@5:true"/>
<setEntry value="com.sap.sailing.domain.igtimiadapter.persistence@default:default"/>
<setEntry value="com.sap.sailing.domain.igtimiadapter@4:true"/>
<setEntry value="com.sap.sailing.domain.persistence@default:default"/>
<setEntry value="com.sap.sailing.domain.racelogtrackingadapter@4:true"/>
<setEntry value="com.sap.sailing.domain.shared.android@default:default"/>
<setEntry value="com.sap.sailing.domain.swisstimingadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.domain.swisstimingadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.swisstimingreplayadapter@4:true"/>
<setEntry value="com.sap.sailing.domain.tractracadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.domain.tractracadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.windfinderadapter@4:true"/>
<setEntry value="com.sap.sailing.domain@default:default"/>
<setEntry value="com.sap.sailing.ess40.resultimport@4:true"/>
<setEntry value="com.sap.sailing.expeditionconnector.common@default:default"/>
<setEntry value="com.sap.sailing.expeditionconnector.persistence@4:true"/>
<setEntry value="com.sap.sailing.expeditionconnector@default:default"/>
<setEntry value="com.sap.sailing.freg.resultimport@4:true"/>
<setEntry value="com.sap.sailing.geocoding@default:default"/>
<setEntry value="com.sap.sailing.grib@default:default"/>
<setEntry value="com.sap.sailing.gwt.ui@6:true"/>
<setEntry value="com.sap.sailing.kiworesultimport@4:true"/>
<setEntry value="com.sap.sailing.manage2sail.resultimport@4:true"/>
<setEntry value="com.sap.sailing.manage2sail@default:default"/>
<setEntry value="com.sap.sailing.monitoring@7:true"/>
<setEntry value="com.sap.sailing.news@4:true"/>
<setEntry value="com.sap.sailing.nmeaconnector@default:default"/>
<setEntry value="com.sap.sailing.polars.datamining.shared@default:default"/>
<setEntry value="com.sap.sailing.polars.datamining@5:true"/>
<setEntry value="com.sap.sailing.polars@5:true"/>
<setEntry value="com.sap.sailing.resultimport@4:true"/>
<setEntry value="com.sap.sailing.routeconverterjava11extension@default:false"/>
<setEntry value="com.sap.sailing.sailwave.resultimport@4:true"/>
<setEntry value="com.sap.sailing.server.gateway.serialization.shared.android@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization@default:default"/>
<setEntry value="com.sap.sailing.server.gateway@5:true"/>
<setEntry value="com.sap.sailing.server.interface@default:default"/>
<setEntry value="com.sap.sailing.server.trackfiles@default:default"/>
<setEntry value="com.sap.sailing.server@5:true"/>
<setEntry value="com.sap.sailing.shared.persistence@default:default"/>
<setEntry value="com.sap.sailing.shared.server.gateway@5:true"/>
<setEntry value="com.sap.sailing.shared.server@5:true"/>
<setEntry value="com.sap.sailing.simulator@default:default"/>
<setEntry value="com.sap.sailing.udpconnector@default:default"/>
<setEntry value="com.sap.sailing.velum.resultimport@4:true"/>
<setEntry value="com.sap.sailing.windestimation@5:true"/>
<setEntry value="com.sap.sailing.www@5:true"/>
<setEntry value="com.sap.sailing.xmlexport@5:true"/>
<setEntry value="com.sap.sailing.xrr.resultimport@4:true"/>
<setEntry value="com.sap.sailing.xrr.schema@default:default"/>
<setEntry value="com.sap.sailing.xrr.structureimport@default:default"/>
<setEntry value="com.sap.sailing.yachtscoring.resultimport@4:true"/>
<setEntry value="com.sap.sse.common@default:default"/>
<setEntry value="com.sap.sse.datamining.annotations@default:default"/>
<setEntry value="com.sap.sse.datamining.shared@default:default"/>
<setEntry value="com.sap.sse.datamining.ui@default:default"/>
<setEntry value="com.sap.sse.datamining@default:default"/>
<setEntry value="com.sap.sse.filestorage@4:true"/>
<setEntry value="com.sap.sse.gwt.adminconsole@default:default"/>
<setEntry value="com.sap.sse.gwt@default:default"/>
<setEntry value="com.sap.sse.jersey.jaxbdependencyfragment@default:false"/>
<setEntry value="com.sap.sse.jettyextensions@default:false"/>
<setEntry value="com.sap.sse.mail@5:true"/>
<setEntry value="com.sap.sse.mongodb@default:default"/>
<setEntry value="com.sap.sse.operationaltransformation@default:default"/>
<setEntry value="com.sap.sse.replication.interfaces@default:default"/>
<setEntry value="com.sap.sse.replication.persistence@default:default"/>
<setEntry value="com.sap.sse.replication@6:true"/>
<setEntry value="com.sap.sse.security.common@default:default"/>
<setEntry value="com.sap.sse.security.interface@default:default"/>
<setEntry value="com.sap.sse.security.persistence@default:default"/>
<setEntry value="com.sap.sse.security.ui@6:true"/>
<setEntry value="com.sap.sse.security.userstore.mongodb@4:true"/>
<setEntry value="com.sap.sse.security@default:default"/>
<setEntry value="com.sap.sse.shared.android@default:default"/>
<setEntry value="com.sap.sse.threadmanager@default:default"/>
<setEntry value="com.sap.sse@default:default"/>
<setEntry value="com.tractrac.clientmodule@default:default"/>
<setEntry value="net.sf.marineapi@default:default"/>
<setEntry value="org.json.simple@default:default"/>
<setEntry value="org.moxieapps.gwt.highcharts@default:default"/>
<setEntry value="org.mp4parser.isoparser@default:default"/>
</setAttribute>
<booleanAttribute key="show_selected_only" value="false"/>
<stringAttribute key="target_bundles" value="com.fasterxml.jackson.core.jackson-annotations@default:default,com.fasterxml.jackson.core.jackson-core@default:default,com.fasterxml.jackson.core.jackson-databind@default:default,com.rabbitmq.client@default:default,com.sun.activation.javax.activation@default:default,com.sun.istack.commons-runtime@default:default,com.sun.jersey.contribs.jersey-multipart@default:default,com.sun.jersey@default:default,com.sun.mail.javax.mail@default:default,com.sun.xml.bind.jaxb-impl@default:default,jackson-core-asl@default:default,jackson-jaxrs@default:default,jackson-mapper-asl@default:default,javax.servlet@default:default,javax.validation@default:default,javax.ws.rs@default:default,javax.xml.stream@default:default,javax.xml.ws@default:default,javax.xml@default:default,jaxb-api@default:default,jcl.over.slf4j@default:default,lz4-java@default:default,org.apache.commons.beanutils@default:default,org.apache.commons.codec@default:default,org.apache.commons.collections@default:default,org.apache.commons.fileupload@default:default,org.apache.commons.io@default:default,org.apache.commons.lang@default:default,org.apache.commons.math3@default:default,org.apache.commons.math@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.felix.shell.remote@0:true,org.apache.felix.shell@0:true,org.apache.httpcomponents.httpclient@default:default,org.apache.httpcomponents.httpcore@default:default,org.apache.poi.ooxml.schemas@default:default,org.apache.poi.ooxml@default:default,org.apache.poi@default:default,org.apache.servicemix.bundles.aws-java-sdk@default:default,org.apache.servicemix.bundles.ehcache@default:default,org.apache.servicemix.bundles.scribe@default:default,org.apache.servicemix.bundles.zxing@default:default,org.apache.shiro.core@default:default,org.apache.shiro.ehcache@default:default,org.apache.shiro.web@default:default,org.apache.xmlbeans@default:default,org.dom4j@default:default,org.eclipse.equinox.cm@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.console@default:default,org.eclipse.equinox.launcher@default:default,org.eclipse.equinox.simpleconfigurator@2:true,org.eclipse.jetty.client@default:default,org.eclipse.jetty.deploy@4:true,org.eclipse.jetty.http@4:true,org.eclipse.jetty.io@4:true,org.eclipse.jetty.jmx@4:true,org.eclipse.jetty.osgi.boot@3:true,org.eclipse.jetty.security@4:true,org.eclipse.jetty.server@4:true,org.eclipse.jetty.servlet@4:true,org.eclipse.jetty.util@4:true,org.eclipse.jetty.webapp@4:true,org.eclipse.jetty.websocket.api@default:default,org.eclipse.jetty.websocket.client@default:default,org.eclipse.jetty.websocket.common@default:default,org.eclipse.jetty.xml@4:true,org.eclipse.osgi.services@default:default,org.eclipse.osgi.util@default:default,org.eclipse.osgi@-1:true,org.hyperic.sigar@default:default,org.jdom@default:default,org.jvnet.mimepull@default:default,org.mongodb.mongo-java-driver@default:default,org.objectweb.asm@default:default,routeconverter@default:default,slf4j.api@default:default,slf4j.jdk14@default:false"/>
<booleanAttribute key="tracing" value="false"/>
<booleanAttribute key="useCustomFeatures" value="false"/>
<booleanAttribute key="useDefaultConfigArea" value="false"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.servlet@default:default,com.googlecode.java-diff-utils@default:default,com.sap.sailing.barbados.resultimport@4:true,com.sap.sailing.competitorimport@default:default,com.sap.sailing.dashboards.gwt@6:true,com.sap.sailing.datamining.provider@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@5:true,com.sap.sailing.declination@default:default,com.sap.sailing.domain.bravoadapter@5:true,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.deckmanadapter@5:true,com.sap.sailing.domain.expeditionadapter@5:true,com.sap.sailing.domain.igtimiadapter.gateway@5:true,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@4:true,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.racelogtrackingadapter@4:true,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@4:true,com.sap.sailing.domain.swisstimingadapter@5:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@4:true,com.sap.sailing.domain.tractracadapter@5:true,com.sap.sailing.domain.windfinderadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@4:true,com.sap.sailing.expeditionconnector.common@default:default,com.sap.sailing.expeditionconnector.persistence@4:true,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@4:true,com.sap.sailing.geocoding@default:default,com.sap.sailing.grib@default:default,com.sap.sailing.gwt.ui@6:true,com.sap.sailing.kiworesultimport@4:true,com.sap.sailing.manage2sail.resultimport@4:true,com.sap.sailing.manage2sail@default:default,com.sap.sailing.monitoring@7:true,com.sap.sailing.news@4:true,com.sap.sailing.nmeaconnector@default:default,com.sap.sailing.polars.datamining.shared@default:default,com.sap.sailing.polars.datamining@5:true,com.sap.sailing.polars@5:true,com.sap.sailing.resultimport@4:true,com.sap.sailing.routeconverterjava11extension@default:false,com.sap.sailing.sailwave.resultimport@4:true,com.sap.sailing.server.gateway.serialization.shared.android@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.interface@default:default,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@5:true,com.sap.sailing.shared.persistence@default:default,com.sap.sailing.shared.server.gateway@5:true,com.sap.sailing.shared.server@5:true,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@4:true,com.sap.sailing.windestimation@5:true,com.sap.sailing.www@5:true,com.sap.sailing.xmlexport@5:true,com.sap.sailing.xrr.resultimport@4:true,com.sap.sailing.xrr.schema@default:default,com.sap.sailing.xrr.structureimport@default:default,com.sap.sailing.yachtscoring.resultimport@4:true,com.sap.sse.common@default:default,com.sap.sse.datamining.annotations@default:default,com.sap.sse.datamining.shared@default:default,com.sap.sse.datamining.ui@default:default,com.sap.sse.datamining@default:default,com.sap.sse.filestorage@4:true,com.sap.sse.gwt.adminconsole@default:default,com.sap.sse.gwt@default:default,com.sap.sse.jersey.jaxbdependencyfragment@default:false,com.sap.sse.jettyextensions@default:false,com.sap.sse.mail@5:true,com.sap.sse.mongodb@default:default,com.sap.sse.operationaltransformation@default:default,com.sap.sse.replication.interfaces@default:default,com.sap.sse.replication.persistence@default:default,com.sap.sse.replication@6:true,com.sap.sse.security.common@default:default,com.sap.sse.security.interface@default:default,com.sap.sse.security.persistence@default:default,com.sap.sse.security.ui@6:true,com.sap.sse.security.userstore.mongodb@4:true,com.sap.sse.security@default:default,com.sap.sse.shared.android@default:default,com.sap.sse.threadmanager@default:default,com.sap.sse@default:default,com.tractrac.clientmodule@default:default,net.sf.marineapi@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default,org.mp4parser.isoparser@default:default"/>
</launchConfiguration>
@@ -10,6 +10,7 @@
<booleanAttribute key="default" value="true"/>
<booleanAttribute key="default_auto_start" value="true"/>
<intAttribute key="default_start_level" value="4"/>
<setAttribute key="deselected_workspace_bundles"/>
<booleanAttribute key="includeOptional" value="true"/>
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
@@ -22,11 +23,188 @@
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Djetty.port=8889 -Dreplication.exchangeName=sapsailinganalytics-replica -Declipse.ignoreApp=true -Dosgi.noShutdown=true&#13;&#10;-Dexpedition.udp.port=2011 -Xmx6000m -XX:+UseG1GC -Djetty.home=${project_loc:com.sap.sailing.server}/../target/configuration/jetty -Djava.util.logging.config.file=${project_loc:com.sap.sailing.server}/../target/configuration/logging_debug.properties -XX:+UseMembar -Dmongo.dbName=replica"/>
<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc}"/>
<stringAttribute key="pde.version" value="3.3"/>
<setAttribute key="selected_target_bundles">
<setEntry value="com.fasterxml.jackson.core.jackson-annotations@default:default"/>
<setEntry value="com.fasterxml.jackson.core.jackson-core@default:default"/>
<setEntry value="com.fasterxml.jackson.core.jackson-databind@default:default"/>
<setEntry value="com.rabbitmq.client@default:default"/>
<setEntry value="com.sun.activation.javax.activation@default:default"/>
<setEntry value="com.sun.istack.commons-runtime@default:default"/>
<setEntry value="com.sun.jersey.contribs.jersey-multipart@default:default"/>
<setEntry value="com.sun.jersey@default:default"/>
<setEntry value="com.sun.mail.javax.mail@default:default"/>
<setEntry value="com.sun.xml.bind.jaxb-impl@default:default"/>
<setEntry value="jackson-core-asl@default:default"/>
<setEntry value="jackson-jaxrs@default:default"/>
<setEntry value="jackson-mapper-asl@default:default"/>
<setEntry value="javax.servlet@default:default"/>
<setEntry value="javax.validation@default:default"/>
<setEntry value="javax.ws.rs@default:default"/>
<setEntry value="javax.xml.stream@default:default"/>
<setEntry value="javax.xml.ws@default:default"/>
<setEntry value="javax.xml@default:default"/>
<setEntry value="jaxb-api@default:default"/>
<setEntry value="jcl.over.slf4j@default:default"/>
<setEntry value="lz4-java@default:default"/>
<setEntry value="org.apache.commons.beanutils@default:default"/>
<setEntry value="org.apache.commons.codec@default:default"/>
<setEntry value="org.apache.commons.collections@default:default"/>
<setEntry value="org.apache.commons.fileupload@default:default"/>
<setEntry value="org.apache.commons.io@default:default"/>
<setEntry value="org.apache.commons.lang@default:default"/>
<setEntry value="org.apache.commons.math3@default:default"/>
<setEntry value="org.apache.commons.math@default:default"/>
<setEntry value="org.apache.felix.gogo.command@default:default"/>
<setEntry value="org.apache.felix.gogo.runtime@default:default"/>
<setEntry value="org.apache.felix.gogo.shell@default:default"/>
<setEntry value="org.apache.felix.shell.remote@0:true"/>
<setEntry value="org.apache.felix.shell@0:true"/>
<setEntry value="org.apache.httpcomponents.httpclient@default:default"/>
<setEntry value="org.apache.httpcomponents.httpcore@default:default"/>
<setEntry value="org.apache.poi.ooxml.schemas@default:default"/>
<setEntry value="org.apache.poi.ooxml@default:default"/>
<setEntry value="org.apache.poi@default:default"/>
<setEntry value="org.apache.servicemix.bundles.aws-java-sdk@default:default"/>
<setEntry value="org.apache.servicemix.bundles.ehcache@default:default"/>
<setEntry value="org.apache.servicemix.bundles.scribe@default:default"/>
<setEntry value="org.apache.servicemix.bundles.zxing@default:default"/>
<setEntry value="org.apache.shiro.core@default:default"/>
<setEntry value="org.apache.shiro.ehcache@default:default"/>
<setEntry value="org.apache.shiro.web@default:default"/>
<setEntry value="org.apache.xmlbeans@default:default"/>
<setEntry value="org.dom4j@default:default"/>
<setEntry value="org.eclipse.equinox.cm@default:default"/>
<setEntry value="org.eclipse.equinox.common@2:true"/>
<setEntry value="org.eclipse.equinox.console@default:default"/>
<setEntry value="org.eclipse.equinox.launcher@default:default"/>
<setEntry value="org.eclipse.equinox.simpleconfigurator@2:true"/>
<setEntry value="org.eclipse.jetty.client@default:default"/>
<setEntry value="org.eclipse.jetty.deploy@4:true"/>
<setEntry value="org.eclipse.jetty.http@4:true"/>
<setEntry value="org.eclipse.jetty.io@4:true"/>
<setEntry value="org.eclipse.jetty.jmx@4:true"/>
<setEntry value="org.eclipse.jetty.osgi.boot@3:true"/>
<setEntry value="org.eclipse.jetty.security@4:true"/>
<setEntry value="org.eclipse.jetty.server@4:true"/>
<setEntry value="org.eclipse.jetty.servlet@4:true"/>
<setEntry value="org.eclipse.jetty.util@4:true"/>
<setEntry value="org.eclipse.jetty.webapp@4:true"/>
<setEntry value="org.eclipse.jetty.websocket.api@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.client@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.common@default:default"/>
<setEntry value="org.eclipse.jetty.xml@4:true"/>
<setEntry value="org.eclipse.osgi.services@default:default"/>
<setEntry value="org.eclipse.osgi.util@default:default"/>
<setEntry value="org.eclipse.osgi@-1:true"/>
<setEntry value="org.hyperic.sigar@default:default"/>
<setEntry value="org.jdom@default:default"/>
<setEntry value="org.jvnet.mimepull@default:default"/>
<setEntry value="org.mongodb.mongo-java-driver@default:default"/>
<setEntry value="org.objectweb.asm@default:default"/>
<setEntry value="routeconverter@default:default"/>
<setEntry value="slf4j.api@default:default"/>
<setEntry value="slf4j.jdk14@default:false"/>
</setAttribute>
<setAttribute key="selected_workspace_bundles">
<setEntry value="com.google.gwt.servlet@default:default"/>
<setEntry value="com.googlecode.java-diff-utils@default:default"/>
<setEntry value="com.sap.sailing.barbados.resultimport@4:true"/>
<setEntry value="com.sap.sailing.competitorimport@default:default"/>
<setEntry value="com.sap.sailing.dashboards.gwt@6:true"/>
<setEntry value="com.sap.sailing.datamining.provider@default:default"/>
<setEntry value="com.sap.sailing.datamining.shared@default:default"/>
<setEntry value="com.sap.sailing.datamining@5:true"/>
<setEntry value="com.sap.sailing.declination@default:default"/>
<setEntry value="com.sap.sailing.domain.bravoadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.common@default:default"/>
<setEntry value="com.sap.sailing.domain.deckmanadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.expeditionadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.igtimiadapter.gateway@5:true"/>
<setEntry value="com.sap.sailing.domain.igtimiadapter.persistence@default:default"/>
<setEntry value="com.sap.sailing.domain.igtimiadapter@4:true"/>
<setEntry value="com.sap.sailing.domain.persistence@default:default"/>
<setEntry value="com.sap.sailing.domain.racelogtrackingadapter@4:true"/>
<setEntry value="com.sap.sailing.domain.shared.android@default:default"/>
<setEntry value="com.sap.sailing.domain.swisstimingadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.domain.swisstimingadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.swisstimingreplayadapter@4:true"/>
<setEntry value="com.sap.sailing.domain.tractracadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.domain.tractracadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.windfinderadapter@4:true"/>
<setEntry value="com.sap.sailing.domain@default:default"/>
<setEntry value="com.sap.sailing.ess40.resultimport@4:true"/>
<setEntry value="com.sap.sailing.expeditionconnector.common@default:default"/>
<setEntry value="com.sap.sailing.expeditionconnector.persistence@4:true"/>
<setEntry value="com.sap.sailing.expeditionconnector@default:default"/>
<setEntry value="com.sap.sailing.freg.resultimport@4:true"/>
<setEntry value="com.sap.sailing.geocoding@default:default"/>
<setEntry value="com.sap.sailing.grib@default:default"/>
<setEntry value="com.sap.sailing.gwt.ui@6:true"/>
<setEntry value="com.sap.sailing.kiworesultimport@4:true"/>
<setEntry value="com.sap.sailing.manage2sail.resultimport@4:true"/>
<setEntry value="com.sap.sailing.manage2sail@default:default"/>
<setEntry value="com.sap.sailing.monitoring@7:true"/>
<setEntry value="com.sap.sailing.news@4:true"/>
<setEntry value="com.sap.sailing.nmeaconnector@default:default"/>
<setEntry value="com.sap.sailing.polars.datamining.shared@default:default"/>
<setEntry value="com.sap.sailing.polars.datamining@5:true"/>
<setEntry value="com.sap.sailing.polars@5:true"/>
<setEntry value="com.sap.sailing.resultimport@4:true"/>
<setEntry value="com.sap.sailing.routeconverterjava11extension@default:false"/>
<setEntry value="com.sap.sailing.sailwave.resultimport@4:true"/>
<setEntry value="com.sap.sailing.server.gateway.serialization.shared.android@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization@default:default"/>
<setEntry value="com.sap.sailing.server.gateway@5:true"/>
<setEntry value="com.sap.sailing.server.interface@default:default"/>
<setEntry value="com.sap.sailing.server.trackfiles@default:default"/>
<setEntry value="com.sap.sailing.server@5:true"/>
<setEntry value="com.sap.sailing.shared.persistence@default:default"/>
<setEntry value="com.sap.sailing.shared.server.gateway@5:true"/>
<setEntry value="com.sap.sailing.shared.server@5:true"/>
<setEntry value="com.sap.sailing.simulator@default:default"/>
<setEntry value="com.sap.sailing.udpconnector@default:default"/>
<setEntry value="com.sap.sailing.velum.resultimport@4:true"/>
<setEntry value="com.sap.sailing.windestimation@5:true"/>
<setEntry value="com.sap.sailing.www@5:true"/>
<setEntry value="com.sap.sailing.xmlexport@5:true"/>
<setEntry value="com.sap.sailing.xrr.resultimport@4:true"/>
<setEntry value="com.sap.sailing.xrr.schema@default:default"/>
<setEntry value="com.sap.sailing.xrr.structureimport@default:default"/>
<setEntry value="com.sap.sailing.yachtscoring.resultimport@4:true"/>
<setEntry value="com.sap.sse.common@default:default"/>
<setEntry value="com.sap.sse.datamining.annotations@default:default"/>
<setEntry value="com.sap.sse.datamining.shared@default:default"/>
<setEntry value="com.sap.sse.datamining.ui@default:default"/>
<setEntry value="com.sap.sse.datamining@default:default"/>
<setEntry value="com.sap.sse.filestorage@4:true"/>
<setEntry value="com.sap.sse.gwt.adminconsole@default:default"/>
<setEntry value="com.sap.sse.gwt@default:default"/>
<setEntry value="com.sap.sse.jersey.jaxbdependencyfragment@default:false"/>
<setEntry value="com.sap.sse.jettyextensions@default:false"/>
<setEntry value="com.sap.sse.mail@5:true"/>
<setEntry value="com.sap.sse.mongodb@default:default"/>
<setEntry value="com.sap.sse.operationaltransformation@default:default"/>
<setEntry value="com.sap.sse.replication.interfaces@default:default"/>
<setEntry value="com.sap.sse.replication.persistence@default:default"/>
<setEntry value="com.sap.sse.replication@6:true"/>
<setEntry value="com.sap.sse.security.common@default:default"/>
<setEntry value="com.sap.sse.security.interface@default:default"/>
<setEntry value="com.sap.sse.security.persistence@default:default"/>
<setEntry value="com.sap.sse.security.ui@6:true"/>
<setEntry value="com.sap.sse.security.userstore.mongodb@4:true"/>
<setEntry value="com.sap.sse.security@default:default"/>
<setEntry value="com.sap.sse.shared.android@default:default"/>
<setEntry value="com.sap.sse.threadmanager@default:default"/>
<setEntry value="com.sap.sse@default:default"/>
<setEntry value="com.tractrac.clientmodule@default:default"/>
<setEntry value="net.sf.marineapi@default:default"/>
<setEntry value="org.json.simple@default:default"/>
<setEntry value="org.moxieapps.gwt.highcharts@default:default"/>
<setEntry value="org.mp4parser.isoparser@default:default"/>
</setAttribute>
<booleanAttribute key="show_selected_only" value="false"/>
<stringAttribute key="target_bundles" value="com.fasterxml.jackson.core.jackson-annotations@default:default,com.fasterxml.jackson.core.jackson-core@default:default,com.fasterxml.jackson.core.jackson-databind@default:default,com.rabbitmq.client@default:default,com.sun.activation.javax.activation@default:default,com.sun.istack.commons-runtime@default:default,com.sun.jersey.contribs.jersey-multipart@default:default,com.sun.jersey@default:default,com.sun.mail.javax.mail@default:default,com.sun.xml.bind.jaxb-impl@default:default,jackson-core-asl@default:default,jackson-jaxrs@default:default,jackson-mapper-asl@default:default,javax.servlet@default:default,javax.validation@default:default,javax.ws.rs@default:default,javax.xml.stream@default:default,javax.xml.ws@default:default,javax.xml@default:default,jaxb-api@default:default,jcl.over.slf4j@default:default,lz4-java@default:default,org.apache.commons.beanutils@default:default,org.apache.commons.codec@default:default,org.apache.commons.collections@default:default,org.apache.commons.fileupload@default:default,org.apache.commons.io@default:default,org.apache.commons.lang@default:default,org.apache.commons.math3@default:default,org.apache.commons.math@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.felix.shell.remote@0:true,org.apache.felix.shell@0:true,org.apache.httpcomponents.httpclient@default:default,org.apache.httpcomponents.httpcore@default:default,org.apache.poi.ooxml.schemas@default:default,org.apache.poi.ooxml@default:default,org.apache.poi@default:default,org.apache.servicemix.bundles.aws-java-sdk@default:default,org.apache.servicemix.bundles.ehcache@default:default,org.apache.servicemix.bundles.scribe@default:default,org.apache.servicemix.bundles.zxing@default:default,org.apache.shiro.core@default:default,org.apache.shiro.ehcache@default:default,org.apache.shiro.web@default:default,org.apache.xmlbeans@default:default,org.dom4j@default:default,org.eclipse.equinox.cm@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.console@default:default,org.eclipse.equinox.launcher@default:default,org.eclipse.equinox.simpleconfigurator@2:true,org.eclipse.jetty.client@default:default,org.eclipse.jetty.deploy@4:true,org.eclipse.jetty.http@4:true,org.eclipse.jetty.io@4:true,org.eclipse.jetty.jmx@4:true,org.eclipse.jetty.osgi.boot@3:true,org.eclipse.jetty.security@4:true,org.eclipse.jetty.server@4:true,org.eclipse.jetty.servlet@4:true,org.eclipse.jetty.util@4:true,org.eclipse.jetty.webapp@4:true,org.eclipse.jetty.websocket.api@default:default,org.eclipse.jetty.websocket.client@default:default,org.eclipse.jetty.websocket.common@default:default,org.eclipse.jetty.xml@4:true,org.eclipse.osgi.services@default:default,org.eclipse.osgi.util@default:default,org.eclipse.osgi@-1:true,org.hyperic.sigar@default:default,org.jdom@default:default,org.jvnet.mimepull@default:default,org.mongodb.mongo-java-driver@default:default,org.objectweb.asm@default:default,routeconverter@default:default,slf4j.api@default:default,slf4j.jdk14@default:false"/>
<booleanAttribute key="tracing" value="false"/>
<booleanAttribute key="useCustomFeatures" value="false"/>
<booleanAttribute key="useDefaultConfigArea" value="false"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.servlet@default:default,com.googlecode.java-diff-utils@default:default,com.sap.sailing.barbados.resultimport@4:true,com.sap.sailing.competitorimport@default:default,com.sap.sailing.dashboards.gwt@6:true,com.sap.sailing.datamining.provider@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@5:true,com.sap.sailing.declination@default:default,com.sap.sailing.domain.bravoadapter@5:true,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.deckmanadapter@5:true,com.sap.sailing.domain.expeditionadapter@5:true,com.sap.sailing.domain.igtimiadapter.gateway@5:true,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@4:true,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.racelogtrackingadapter@4:true,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@4:true,com.sap.sailing.domain.swisstimingadapter@5:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@4:true,com.sap.sailing.domain.tractracadapter@5:true,com.sap.sailing.domain.windfinderadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@4:true,com.sap.sailing.expeditionconnector.common@default:default,com.sap.sailing.expeditionconnector.persistence@4:true,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@4:true,com.sap.sailing.geocoding@default:default,com.sap.sailing.grib@default:default,com.sap.sailing.gwt.ui@6:true,com.sap.sailing.kiworesultimport@4:true,com.sap.sailing.manage2sail.resultimport@4:true,com.sap.sailing.manage2sail@default:default,com.sap.sailing.monitoring@7:true,com.sap.sailing.news@4:true,com.sap.sailing.nmeaconnector@default:default,com.sap.sailing.polars.datamining.shared@default:default,com.sap.sailing.polars.datamining@5:true,com.sap.sailing.polars@5:true,com.sap.sailing.resultimport@4:true,com.sap.sailing.routeconverterjava11extension@default:false,com.sap.sailing.sailwave.resultimport@4:true,com.sap.sailing.server.gateway.serialization.shared.android@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.interface@default:default,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@5:true,com.sap.sailing.shared.persistence@default:default,com.sap.sailing.shared.server.gateway@5:true,com.sap.sailing.shared.server@5:true,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@4:true,com.sap.sailing.windestimation@5:true,com.sap.sailing.www@5:true,com.sap.sailing.xmlexport@5:true,com.sap.sailing.xrr.resultimport@4:true,com.sap.sailing.xrr.schema@default:default,com.sap.sailing.xrr.structureimport@default:default,com.sap.sailing.yachtscoring.resultimport@4:true,com.sap.sse.common@default:default,com.sap.sse.datamining.annotations@default:default,com.sap.sse.datamining.shared@default:default,com.sap.sse.datamining.ui@default:default,com.sap.sse.datamining@default:default,com.sap.sse.filestorage@4:true,com.sap.sse.gwt.adminconsole@default:default,com.sap.sse.gwt@default:default,com.sap.sse.jersey.jaxbdependencyfragment@default:false,com.sap.sse.jettyextensions@default:false,com.sap.sse.mail@5:true,com.sap.sse.mongodb@default:default,com.sap.sse.operationaltransformation@default:default,com.sap.sse.replication.interfaces@default:default,com.sap.sse.replication.persistence@default:default,com.sap.sse.replication@6:true,com.sap.sse.security.common@default:default,com.sap.sse.security.interface@default:default,com.sap.sse.security.persistence@default:default,com.sap.sse.security.ui@6:true,com.sap.sse.security.userstore.mongodb@4:true,com.sap.sse.security@default:default,com.sap.sse.shared.android@default:default,com.sap.sse.threadmanager@default:default,com.sap.sse@default:default,com.tractrac.clientmodule@default:default,net.sf.marineapi@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default,org.mp4parser.isoparser@default:default"/>
<stringAttribute key="yk-options" value="&#13;&#10;additional-options2=onexit\=snapshot&#13;&#10;"/>
</launchConfiguration>
@@ -34,6 +34,13 @@
user name and password fields. See detailed explanation in the Master Data Import tab in
the Advanced section.
</li>
<li>The master data import (MDI) can now optionally also import the connectivity information needed
to restore the tracked races attached to the structures imported. If this checkbox is selected,
connection records will be added to the respective connector's tab, and the tracking of the
races will be started automatically upon completing the data import. With the connection records
added it will also be possible to load those races again on the importing side even if they
are temporarily removed again or should fail to load.
</li>
</ul>
<h2 class="articleSubheadline">March 2020</h2>
<ul class="bulletList">
@@ -513,9 +513,20 @@ public interface SecurityService extends ReplicableWithObjectInputStream<Replica
*/
void assumeOwnershipMigrated(String typeName);
void migrateOwnership(WithQualifiedObjectIdentifier object);
/**
*
* @param object
* @return {@code true} if the object required ownership migration
*/
boolean migrateOwnership(WithQualifiedObjectIdentifier object);
void migrateOwnership(QualifiedObjectIdentifier object, String displayName);
/**
*
* @param object
* @param displayName
* @return {@code true} if the object required ownership migration
*/
boolean migrateOwnership(QualifiedObjectIdentifier object, String displayName);
void migrateUser(User user);
@@ -1819,7 +1819,8 @@ public class SecurityServiceImpl implements ReplicableSecurityService, ClearStat
@Override
public void setDefaultOwnershipIfNotSet(QualifiedObjectIdentifier identifier) {
final OwnershipAnnotation preexistingOwnership = getOwnership(identifier);
if (preexistingOwnership == null) {
if (preexistingOwnership == null || (preexistingOwnership.getAnnotation() == null ||
(preexistingOwnership.getAnnotation().getTenantOwner() == null && preexistingOwnership.getAnnotation().getUserOwner() == null))) {
setDefaultOwnership(identifier, identifier.toString());
}
}
@@ -1849,7 +1850,8 @@ public class SecurityServiceImpl implements ReplicableSecurityService, ClearStat
@Override
public void setOwnershipIfNotSet(QualifiedObjectIdentifier identifier, User user, UserGroup tenantOwner) {
final OwnershipAnnotation preexistingOwnership = getOwnership(identifier);
if (preexistingOwnership == null) {
if (preexistingOwnership == null || (preexistingOwnership.getAnnotation() == null ||
(preexistingOwnership.getAnnotation().getTenantOwner() == null && preexistingOwnership.getAnnotation().getUserOwner() == null))) {
setOwnership(identifier, user, tenantOwner, identifier.toString());
}
}
@@ -2247,13 +2249,13 @@ public class SecurityServiceImpl implements ReplicableSecurityService, ClearStat
}
@Override
public void migrateOwnership(WithQualifiedObjectIdentifier identifier) {
migrateOwnership(identifier.getIdentifier(), identifier.getName());
public boolean migrateOwnership(WithQualifiedObjectIdentifier identifier) {
return migrateOwnership(identifier.getIdentifier(), identifier.getName());
}
@Override
public void migrateOwnership(final QualifiedObjectIdentifier identifier, final String displayName) {
this.migrateOwnership(identifier, null, /* setServerGroupAsOwner */ true, displayName);
public boolean migrateOwnership(final QualifiedObjectIdentifier identifier, final String displayName) {
return this.migrateOwnership(identifier, null, /* setServerGroupAsOwner */ true, displayName);
}
@Override