diff --git a/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/Activator.java b/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/Activator.java index 2415a94b7e3..ec3f69dd75f 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/Activator.java +++ b/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/Activator.java @@ -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 diff --git a/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/SwissTimingAdapterPersistenceImpl.java b/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/SwissTimingAdapterPersistenceImpl.java index 681a81ee35d..a1fd8bc5746 100644 --- a/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/SwissTimingAdapterPersistenceImpl.java +++ b/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/SwissTimingAdapterPersistenceImpl.java @@ -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( diff --git a/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/SwissTimingConnectivityParamsHandler.java b/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/SwissTimingConnectivityParamsHandler.java index ca4ff43115d..d84e2b26b1e 100644 --- a/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/SwissTimingConnectivityParamsHandler.java +++ b/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/SwissTimingConnectivityParamsHandler.java @@ -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; } } diff --git a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/DomainFactory.java b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/DomainFactory.java index 2510764ad86..85dbc373119 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/DomainFactory.java +++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/DomainFactory.java @@ -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 deviceIds, MarkType markType, String shortNameOfGate); diff --git a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/SwissTimingAdapter.java b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/SwissTimingAdapter.java index bcb05fe84c4..1851b882945 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/SwissTimingAdapter.java +++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/SwissTimingAdapter.java @@ -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); diff --git a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java index 12706237559..20229dd6b72 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java +++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java @@ -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 diff --git a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingAdapterImpl.java b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingAdapterImpl.java index a7978a8d466..9ad31a1ba29 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingAdapterImpl.java +++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingAdapterImpl.java @@ -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); } diff --git a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingTrackingConnectivityParameters.java b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingTrackingConnectivityParameters.java index 0e2591621a4..f6475adc85c 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingTrackingConnectivityParameters.java +++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingTrackingConnectivityParameters.java @@ -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; diff --git a/java/com.sap.sailing.domain.swisstimingreplayadapter/META-INF/MANIFEST.MF b/java/com.sap.sailing.domain.swisstimingreplayadapter/META-INF/MANIFEST.MF index a5f4172562c..6cbe7d805f0 100644 --- a/java/com.sap.sailing.domain.swisstimingreplayadapter/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.domain.swisstimingreplayadapter/META-INF/MANIFEST.MF @@ -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 diff --git a/java/com.sap.sailing.domain.swisstimingreplayadapter/src/com/sap/sailing/domain/swisstimingreplayadapter/SwissTimingReplayService.java b/java/com.sap.sailing.domain.swisstimingreplayadapter/src/com/sap/sailing/domain/swisstimingreplayadapter/SwissTimingReplayService.java index c893dfdbccc..ab9c45b1a98 100755 --- a/java/com.sap.sailing.domain.swisstimingreplayadapter/src/com/sap/sailing/domain/swisstimingreplayadapter/SwissTimingReplayService.java +++ b/java/com.sap.sailing.domain.swisstimingreplayadapter/src/com/sap/sailing/domain/swisstimingreplayadapter/SwissTimingReplayService.java @@ -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; /** diff --git a/java/com.sap.sailing.domain.swisstimingreplayadapter/src/com/sap/sailing/domain/swisstimingreplayadapter/impl/Activator.java b/java/com.sap.sailing.domain.swisstimingreplayadapter/src/com/sap/sailing/domain/swisstimingreplayadapter/impl/Activator.java index c715ad205b1..22b83e88570 100755 --- a/java/com.sap.sailing.domain.swisstimingreplayadapter/src/com/sap/sailing/domain/swisstimingreplayadapter/impl/Activator.java +++ b/java/com.sap.sailing.domain.swisstimingreplayadapter/src/com/sap/sailing/domain/swisstimingreplayadapter/impl/Activator.java @@ -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 domainObjectFactoryServiceTracker = ServiceTrackerFactory.createAndOpen(context, DomainObjectFactory.class); final ServiceTracker swissTimingAdapterFactoryServiceTracker = ServiceTrackerFactory.createAndOpen(context, SwissTimingAdapterFactory.class); final ServiceTracker raceLogResolverServiceTracker = ServiceTrackerFactory.createAndOpen(context, RaceLogResolver.class); + final FullyInitializedReplicableTracker 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 properties = new Hashtable(); 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) { diff --git a/java/com.sap.sailing.domain.swisstimingreplayadapter/src/com/sap/sailing/domain/swisstimingreplayadapter/impl/SwissTimingReplayConnectivityParameters.java b/java/com.sap.sailing.domain.swisstimingreplayadapter/src/com/sap/sailing/domain/swisstimingreplayadapter/impl/SwissTimingReplayConnectivityParameters.java index 83ebcc0f9d7..c8e2d23d938 100644 --- a/java/com.sap.sailing.domain.swisstimingreplayadapter/src/com/sap/sailing/domain/swisstimingreplayadapter/impl/SwissTimingReplayConnectivityParameters.java +++ b/java/com.sap.sailing.domain.swisstimingreplayadapter/src/com/sap/sailing/domain/swisstimingreplayadapter/impl/SwissTimingReplayConnectivityParameters.java @@ -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; diff --git a/java/com.sap.sailing.domain.swisstimingreplayadapter/src/com/sap/sailing/domain/swisstimingreplayadapter/impl/SwissTimingReplayConnectivityParamsHandler.java b/java/com.sap.sailing.domain.swisstimingreplayadapter/src/com/sap/sailing/domain/swisstimingreplayadapter/impl/SwissTimingReplayConnectivityParamsHandler.java index 71ff663c684..8ffc2a03750 100644 --- a/java/com.sap.sailing.domain.swisstimingreplayadapter/src/com/sap/sailing/domain/swisstimingreplayadapter/impl/SwissTimingReplayConnectivityParamsHandler.java +++ b/java/com.sap.sailing.domain.swisstimingreplayadapter/src/com/sap/sailing/domain/swisstimingreplayadapter/impl/SwissTimingReplayConnectivityParamsHandler.java @@ -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 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 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; } } diff --git a/java/com.sap.sailing.domain.swisstimingreplayadapter/src/com/sap/sailing/domain/swisstimingreplayadapter/impl/SwissTimingReplayServiceImpl.java b/java/com.sap.sailing.domain.swisstimingreplayadapter/src/com/sap/sailing/domain/swisstimingreplayadapter/impl/SwissTimingReplayServiceImpl.java index 5863c666e57..99835454ae1 100644 --- a/java/com.sap.sailing.domain.swisstimingreplayadapter/src/com/sap/sailing/domain/swisstimingreplayadapter/impl/SwissTimingReplayServiceImpl.java +++ b/java/com.sap.sailing.domain.swisstimingreplayadapter/src/com/sap/sailing/domain/swisstimingreplayadapter/impl/SwissTimingReplayServiceImpl.java @@ -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); } } diff --git a/java/com.sap.sailing.domain.tractracadapter.persistence/META-INF/MANIFEST.MF b/java/com.sap.sailing.domain.tractracadapter.persistence/META-INF/MANIFEST.MF index f2beafb77da..51c1f3a7fad 100644 --- a/java/com.sap.sailing.domain.tractracadapter.persistence/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.domain.tractracadapter.persistence/META-INF/MANIFEST.MF @@ -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, diff --git a/java/com.sap.sailing.domain.tractracadapter.persistence/src/com/sap/sailing/domain/tractracadapter/persistence/impl/Activator.java b/java/com.sap.sailing.domain.tractracadapter.persistence/src/com/sap/sailing/domain/tractracadapter/persistence/impl/Activator.java index ccdc276be77..9bf2f267bb5 100755 --- a/java/com.sap.sailing.domain.tractracadapter.persistence/src/com/sap/sailing/domain/tractracadapter/persistence/impl/Activator.java +++ b/java/com.sap.sailing.domain.tractracadapter.persistence/src/com/sap/sailing/domain/tractracadapter/persistence/impl/Activator.java @@ -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() { diff --git a/java/com.sap.sailing.domain.tractracadapter.persistence/src/com/sap/sailing/domain/tractracadapter/persistence/impl/TracTracConnectivityParamsHandler.java b/java/com.sap.sailing.domain.tractracadapter.persistence/src/com/sap/sailing/domain/tractracadapter/persistence/impl/TracTracConnectivityParamsHandler.java index b5d94226cfa..1e28e51757e 100644 --- a/java/com.sap.sailing.domain.tractracadapter.persistence/src/com/sap/sailing/domain/tractracadapter/persistence/impl/TracTracConnectivityParamsHandler.java +++ b/java/com.sap.sailing.domain.tractracadapter.persistence/src/com/sap/sailing/domain/tractracadapter/persistence/impl/TracTracConnectivityParamsHandler.java @@ -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()); } } diff --git a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/SailingServiceImplMock.java b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/SailingServiceImplMock.java index 2ccbb422fe2..22296f411da 100755 --- a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/SailingServiceImplMock.java +++ b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/SailingServiceImplMock.java @@ -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; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java index 4a16e3ba427..24d18463d52 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java @@ -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 getRaceTableColumnSortHandler(List raceRecords, Column regattaNameColumn, Column seriesNameColumn, Column nameColumn, Column trackingStartColumn, Column raceIdColumn, Column boatClassColumn, Column genderColumn, Column statusColumn) { - ListHandler result = new ListHandler(raceRecords); result.setComparator(regattaNameColumn, new Comparator() { @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() { - @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() { + @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(); + } + }); } } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/swisstiming/SwissTimingConnectionDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/swisstiming/SwissTimingConnectionDialog.java index 7aa7ac48625..6f0c85bc888 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/swisstiming/SwissTimingConnectionDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/swisstiming/SwissTimingConnectionDialog.java @@ -136,6 +136,7 @@ public class SwissTimingConnectionDialog extends DataEntryDialog tracTracAccountNameColumn = new AbstractSortableTextColumn( dto -> dto.getName(), tracTracAccountColumnListHandler); final TextColumn tracTracAccountLiveUriColumn = new AbstractSortableTextColumn( - dto -> dto.getLiveDataURI(), tracTracAccountColumnListHandler); + dto -> dto.getLiveDataURI()==null?"":dto.getLiveDataURI(), tracTracAccountColumnListHandler); final TextColumn tracTracAccountStoredUriColumn = new AbstractSortableTextColumn( - dto -> dto.getStoredDataURI(), tracTracAccountColumnListHandler); + dto -> dto.getStoredDataURI()==null?"":dto.getStoredDataURI(), tracTracAccountColumnListHandler); final TextColumn tracTracAccountJsonUrlColumn = new AbstractSortableTextColumn( dto -> dto.getJsonUrl(), tracTracAccountColumnListHandler); final TextColumn tracTracAccountTracTracServerUpdateUriColumn = new AbstractSortableTextColumn( - dto -> dto.getCourseDesignUpdateURI(), tracTracAccountColumnListHandler); + dto -> dto.getCourseDesignUpdateURI()==null?"":dto.getCourseDesignUpdateURI(), tracTracAccountColumnListHandler); final TextColumn tracTracAccountUsernameColumn = new AbstractSortableTextColumn( dto -> dto.getTracTracUsername(), tracTracAccountColumnListHandler); final TextColumn tracTracAccountCreatorNameColumn = new AbstractSortableTextColumn( dto -> dto.getCreatorName(), tracTracAccountColumnListHandler); - final HasPermissions type = SecuredDomainType.TRACTRAC_ACCOUNT; final AccessControlledActionsColumn actionColumn = create( new DefaultActionsImagesBarCell(stringMessages), userService); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java index 487859d979a..5ed6037747d 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java @@ -190,7 +190,7 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS void trackWithSwissTiming(RegattaIdentifier regattaToAddTo, Iterable 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 replayRaces, boolean trackWind, boolean correctWindByDeclination, boolean useInternalMarkPassingAlgorithm) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java index 49235aab31b..7ce714d94b3 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java @@ -189,9 +189,10 @@ public interface SailingServiceAsync extends FileStorageManagementGwtServiceAsyn boolean useOfficialEventsToUpdateRaceLog, String tracTracUsername, String tracTracPassword, AsyncCallback callback); - void trackWithSwissTiming(RegattaIdentifier regattaToAddTo, Iterable rrs, - String hostname, int port, boolean trackWind, boolean correctWindByDeclination, - boolean useInternalMarkPassingAlgorithm, String updateURL, String updateUsername, String updatePassword, AsyncCallback asyncCallback); + void trackWithSwissTiming(RegattaIdentifier regattaToAddTo, Iterable rrs, String hostname, + int port, boolean trackWind, boolean correctWindByDeclination, boolean useInternalMarkPassingAlgorithm, + String updateURL, String updateUsername, String updatePassword, String eventName, + String manage2SailEventUrl, AsyncCallback asyncCallback); void replaySwissTimingRace(RegattaIdentifier regattaIdentifier, Iterable replayRaces, boolean trackWind, boolean correctWindByDeclination, boolean useInternalMarkPassingAlgorithm, diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/masterdataimport/MasterDataImportPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/masterdataimport/MasterDataImportPanel.java index 25b20c5836d..ad532c3b520 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/masterdataimport/MasterDataImportPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/masterdataimport/MasterDataImportPanel.java @@ -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()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index 12c1981a319..d7ce0d26a00 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -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 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 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 cachedRegattaEntriesLists = new HashMap(); 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); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/SwissTimingReplayRaceDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/SwissTimingReplayRaceDTO.java index 81b2d2f95db..d3efd9b1836 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/SwissTimingReplayRaceDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/SwissTimingReplayRaceDTO.java @@ -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 diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/MockConnectivityParamsServiceFinderFactory.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/MockConnectivityParamsServiceFinderFactory.java index 47c5a8e6a54..b216640341e 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/MockConnectivityParamsServiceFinderFactory.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/MockConnectivityParamsServiceFinderFactory.java @@ -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: diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/SwissTimingConnectivityParamsLoadAndStoreTest.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/SwissTimingConnectivityParamsLoadAndStoreTest.java index bb521d61c82..9b216d414a6 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/SwissTimingConnectivityParamsLoadAndStoreTest.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/SwissTimingConnectivityParamsLoadAndStoreTest.java @@ -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 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 diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/SwissTimingReplayConnectivityParamsLoadAndStoreTest.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/SwissTimingReplayConnectivityParamsLoadAndStoreTest.java index e4a2d3f36ac..878395331b9 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/SwissTimingReplayConnectivityParamsLoadAndStoreTest.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/SwissTimingReplayConnectivityParamsLoadAndStoreTest.java @@ -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()); diff --git a/java/com.sap.sailing.server.interface/src/com/sap/sailing/server/operationaltransformation/ImportMasterDataOperation.java b/java/com.sap.sailing.server.interface/src/com/sap/sailing/server/operationaltransformation/ImportMasterDataOperation.java index 0bfac4393e3..db445076359 100755 --- a/java/com.sap.sailing.server.interface/src/com/sap/sailing/server/operationaltransformation/ImportMasterDataOperation.java +++ b/java/com.sap.sailing.server.interface/src/com/sap/sailing/server/operationaltransformation/ImportMasterDataOperation.java @@ -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); } diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy).launch b/java/com.sap.sailing.server/SailingServer (No Proxy).launch index 6c8d1a14bc2..87d107d7a50 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy).launch @@ -31,10 +31,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch index 6356bb97cba..c0c7419a8d7 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch @@ -10,6 +10,7 @@ + @@ -22,11 +23,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - diff --git a/java/com.sap.sailing.www/release_notes_admin.html b/java/com.sap.sailing.www/release_notes_admin.html index 4a037a665ee..8b91da461df 100755 --- a/java/com.sap.sailing.www/release_notes_admin.html +++ b/java/com.sap.sailing.www/release_notes_admin.html @@ -34,6 +34,13 @@ user name and password fields. See detailed explanation in the Master Data Import tab in the Advanced section. +
  • 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. +
  • March 2020

      diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/SecurityService.java b/java/com.sap.sse.security/src/com/sap/sse/security/SecurityService.java index 76bfa98c8b6..d37cf25182d 100644 --- a/java/com.sap.sse.security/src/com/sap/sse/security/SecurityService.java +++ b/java/com.sap.sse.security/src/com/sap/sse/security/SecurityService.java @@ -513,9 +513,20 @@ public interface SecurityService extends ReplicableWithObjectInputStream