From dce75413c3cc5760e8482dc65bbf636e3be05bd7 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 15 Apr 2020 12:58:49 +0200 Subject: [PATCH 1/6] bug5245: first implementation of persistent connector configuration update for TracTrac --- .../META-INF/MANIFEST.MF | 4 +- .../persistence/impl/Activator.java | 14 +- .../TracTracConnectivityParamsHandler.java | 33 +++- .../TracTracConnectionEditDialog.java | 6 +- .../TracTracConnectionTableWrapper.java | 7 +- .../MasterDataImportPanel.java | 2 - .../gwt/ui/server/SailingServiceImpl.java | 7 +- ...onnectivityParamsServiceFinderFactory.java | 2 +- .../SailingServer (No Proxy).launch | 181 ++++++++++++++++- ...ingServer (No Proxy, Jetty on 8889).launch | 182 +++++++++++++++++- 10 files changed, 410 insertions(+), 28 deletions(-) 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..f84b6771255 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,9 @@ 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 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..97d286b583e 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); 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..151c0ce71d0 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,14 @@ 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.SessionUtils; +import com.sap.sse.util.HttpUrlConnectionHelper; /** * Handles mapping TracTrac connectivity parameters from and to a map with {@link String} keys. The @@ -46,12 +57,14 @@ public class TracTracConnectivityParamsHandler extends AbstractRaceTrackingConne private final RaceLogStore raceLogStore; private final RegattaLogStore regattaLogStore; private final DomainFactory domainFactory; + private final MongoObjectFactory tractracMongoObjectFactory; - public TracTracConnectivityParamsHandler(RaceLogStore raceLogStore, RegattaLogStore regattaLogStore, DomainFactory domainFactory) { + public TracTracConnectivityParamsHandler(RaceLogStore raceLogStore, RegattaLogStore regattaLogStore, DomainFactory domainFactory, MongoObjectFactory tractracMongoObjectFactory) { super(); this.raceLogStore = raceLogStore; this.regattaLogStore = regattaLogStore; this.domainFactory = domainFactory; + this.tractracMongoObjectFactory = tractracMongoObjectFactory; } @Override @@ -121,6 +134,22 @@ 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(); + tractracMongoObjectFactory.updateTracTracConfiguration(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())); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/tractrac/TracTracConnectionEditDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/tractrac/TracTracConnectionEditDialog.java index 16e260338a1..85437be7c93 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/tractrac/TracTracConnectionEditDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/tractrac/TracTracConnectionEditDialog.java @@ -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()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/tractrac/TracTracConnectionTableWrapper.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/tractrac/TracTracConnectionTableWrapper.java index 26781d39d13..c23440b8c28 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/tractrac/TracTracConnectionTableWrapper.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/tractrac/TracTracConnectionTableWrapper.java @@ -70,18 +70,17 @@ public class TracTracConnectionTableWrapper extends final TextColumn 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/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..06d3ecbdfa0 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; }); 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..8aeeacb96c7 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 @@ -55,7 +55,7 @@ public class MockConnectivityParamsServiceFinderFactory implements TypeBasedServ 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(), tractracMongoObjectFactory); case SwissTimingTrackingConnectivityParameters.TYPE: return new com.sap.sailing.domain.swisstimingadapter.persistence.impl.SwissTimingConnectivityParamsHandler( MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(mongoObjectFactory, domainObjectFactory), 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - From ced1e989f95812fad31b594eb2a33983c05233fe Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 15 Apr 2020 13:13:01 +0200 Subject: [PATCH 2/6] bug5245: fixed compile error in mocked service finder factory --- .../impl/SwissTimingConnectivityParamsHandler.java | 1 + .../impl/SwissTimingReplayConnectivityParamsHandler.java | 1 + .../test/MockConnectivityParamsServiceFinderFactory.java | 4 +++- 3 files changed, 5 insertions(+), 1 deletion(-) 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..e99e2e327f0 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 @@ -210,6 +210,7 @@ public class SwissTimingConnectivityParamsHandler extends AbstractRaceTrackingCo stParams.isUseInternalMarkPassingAlgorithm(), stParams.isTrackWind(), stParams.isCorrectWindDirectionByMagneticDeclination(), stParams.getUpdateURL(), stParams.getUpdateUsername(), stParams.getUpdatePassword()); + // TODO bug5245: update persistent connector configs return result; } } 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..ef78fd058aa 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 @@ -84,6 +84,7 @@ public class SwissTimingReplayConnectivityParamsHandler extends AbstractRaceTrac stParams.getRaceName(), stParams.getRaceID(), stParams.getBoatClassName(), stParams.isUseInternalMarkPassingAlgorithm(), domainFactory, replayService, raceLogStore, regattaLogStore); + // TODO bug5245: update persistent connector configs return result; } } 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 8aeeacb96c7..750921ba3b5 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 @@ -21,6 +21,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; @@ -55,7 +56,8 @@ public class MockConnectivityParamsServiceFinderFactory implements TypeBasedServ return new TracTracConnectivityParamsHandler( MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(mongoObjectFactory, domainObjectFactory), MongoRegattaLogStoreFactory.INSTANCE.getMongoRegattaLogStore(mongoObjectFactory, domainObjectFactory), - TracTracAdapterFactory.INSTANCE.getOrCreateTracTracAdapter(domainObjectFactory.getBaseDomainFactory()).getTracTracDomainFactory(), tractracMongoObjectFactory); + TracTracAdapterFactory.INSTANCE.getOrCreateTracTracAdapter(domainObjectFactory.getBaseDomainFactory()).getTracTracDomainFactory(), + new MongoObjectFactoryImpl(mongoObjectFactory.getDatabase())); case SwissTimingTrackingConnectivityParameters.TYPE: return new com.sap.sailing.domain.swisstimingadapter.persistence.impl.SwissTimingConnectivityParamsHandler( MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(mongoObjectFactory, domainObjectFactory), From 36109b3adef17cd50a635a8267af6d42e1497e1d Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 15 Apr 2020 15:30:14 +0200 Subject: [PATCH 3/6] bug5245: pass through the SwissTiming archived events list URL to enable adding after MDI; the ownerships for those connectivity parameters still need to be established, also for the already implemented TracTrac connectivity string that is taken over during master data import now. --- .../META-INF/MANIFEST.MF | 6 +++-- .../SwissTimingReplayService.java | 10 +++++--- ...issTimingReplayConnectivityParameters.java | 10 ++++++-- ...TimingReplayConnectivityParamsHandler.java | 25 +++++++++++++------ .../impl/SwissTimingReplayServiceImpl.java | 12 +++++---- .../gwt/ui/server/SailingServiceImpl.java | 7 +++--- .../ui/shared/SwissTimingReplayRaceDTO.java | 5 +++- ...layConnectivityParamsLoadAndStoreTest.java | 8 +++--- 8 files changed, 56 insertions(+), 27 deletions(-) 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..ed77c07e9fc 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,12 @@ 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 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/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 ef78fd058aa..b05b1197c8e 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,13 @@ 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.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.SessionUtils; /** * Handles mapping TracTrac connectivity parameters from and to a map with {@link String} keys. The @@ -28,6 +31,7 @@ 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; @@ -49,6 +53,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 +65,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,10 +86,14 @@ 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); - // TODO bug5245: update persistent connector configs + 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 + SwissTimingAdapterPersistence.INSTANCE.updateSwissTimingArchiveConfiguration(SwissTimingFactory.INSTANCE + .createSwissTimingArchiveConfiguration(result.getSwissTimingUrl(), creatorName)); + } 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.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 06d3ecbdfa0..77506002cbe 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 @@ -3473,7 +3473,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; } @@ -3498,8 +3498,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/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()); From 6ae59bcad929ea33fb6950e362d39292b45fffb0 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 15 Apr 2020 15:54:15 +0200 Subject: [PATCH 4/6] bug5245: add ownerships for MDI-imported tracking connection configurations if none exist yet --- .../SwissTimingAdapterPersistenceImpl.java | 6 +----- .../META-INF/MANIFEST.MF | 4 +++- .../impl/Activator.java | 7 ++++++- ...TimingReplayConnectivityParamsHandler.java | 18 +++++++++++++++--- .../META-INF/MANIFEST.MF | 3 ++- .../persistence/impl/Activator.java | 2 +- .../TracTracConnectivityParamsHandler.java | 19 ++++++++++++++++--- ...onnectivityParamsServiceFinderFactory.java | 7 +++++-- .../com/sap/sse/security/SecurityService.java | 15 +++++++++++++-- .../security/impl/SecurityServiceImpl.java | 8 ++++---- 10 files changed, 66 insertions(+), 23 deletions(-) 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.swisstimingreplayadapter/META-INF/MANIFEST.MF b/java/com.sap.sailing.domain.swisstimingreplayadapter/META-INF/MANIFEST.MF index ed77c07e9fc..6cbe7d805f0 100644 --- a/java/com.sap.sailing.domain.swisstimingreplayadapter/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.domain.swisstimingreplayadapter/META-INF/MANIFEST.MF @@ -15,7 +15,9 @@ Require-Bundle: com.sap.sailing.domain.common, com.sap.sse.common, com.sap.sailing.domain.shared.android, com.sap.sailing.domain.persistence, - com.sap.sailing.domain.swisstimingadapter.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: com.sap.sse.security, 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/SwissTimingReplayConnectivityParamsHandler.java b/java/com.sap.sailing.domain.swisstimingreplayadapter/src/com/sap/sailing/domain/swisstimingreplayadapter/impl/SwissTimingReplayConnectivityParamsHandler.java index b05b1197c8e..af683ee441a 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,13 +8,16 @@ 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; +import com.sap.sse.security.shared.OwnershipAnnotation; /** * Handles mapping TracTrac connectivity parameters from and to a map with {@link String} keys. The @@ -38,14 +41,16 @@ public class SwissTimingReplayConnectivityParamsHandler extends AbstractRaceTrac 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 @@ -91,8 +96,15 @@ public class SwissTimingReplayConnectivityParamsHandler extends AbstractRaceTrac raceLogStore, regattaLogStore); final String creatorName = SessionUtils.getPrincipal().toString(); if (result.getSwissTimingUrl() != null) { // legacy records won't have this URL stored in their connectivity params - SwissTimingAdapterPersistence.INSTANCE.updateSwissTimingArchiveConfiguration(SwissTimingFactory.INSTANCE - .createSwissTimingArchiveConfiguration(result.getSwissTimingUrl(), creatorName)); + final SwissTimingArchiveConfiguration swissTimingArchiveConfiguration = SwissTimingFactory.INSTANCE + .createSwissTimingArchiveConfiguration(result.getSwissTimingUrl(), creatorName); + SwissTimingAdapterPersistence.INSTANCE.updateSwissTimingArchiveConfiguration(swissTimingArchiveConfiguration); + final OwnershipAnnotation existingOwnership = securityService.getOwnership(swissTimingArchiveConfiguration.getIdentifier()); + if (existingOwnership == null || existingOwnership.getAnnotation() == null || + (existingOwnership.getAnnotation().getTenantOwner() == null && + existingOwnership.getAnnotation().getUserOwner() == null)) { + securityService.setDefaultOwnership(swissTimingArchiveConfiguration.getIdentifier(), swissTimingArchiveConfiguration.getName()); + } } return result; } 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 f84b6771255..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 @@ -17,7 +17,8 @@ Require-Bundle: com.sap.sse.mongodb, com.sap.sse.security.common, com.sap.sse.replication.interfaces, com.tractrac.clientmodule;bundle-version="3.13.1", - org.json.simple + 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 97d286b583e..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 @@ -67,7 +67,7 @@ public class Activator implements BundleActivator { MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(mongoObjectFactory, domainObjectFactory), MongoRegattaLogStoreFactory.INSTANCE.getMongoRegattaLogStore(mongoObjectFactory, domainObjectFactory), - domainFactory, tractracMongoObjectFactory); + domainFactory, tractracMongoObjectFactory, securityService); for (TracTracConfiguration trackTrackConfig : tractracDomainObjectFactory.getTracTracConfigurations()) { securityService.migrateOwnership(trackTrackConfig); } 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 151c0ce71d0..0d51be256ff 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 @@ -26,7 +26,9 @@ 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.security.shared.OwnershipAnnotation; import com.sap.sse.util.HttpUrlConnectionHelper; /** @@ -58,13 +60,17 @@ public class TracTracConnectivityParamsHandler extends AbstractRaceTrackingConne private final RegattaLogStore regattaLogStore; private final DomainFactory domainFactory; private final MongoObjectFactory tractracMongoObjectFactory; + private final SecurityService securityService; - public TracTracConnectivityParamsHandler(RaceLogStore raceLogStore, RegattaLogStore regattaLogStore, DomainFactory domainFactory, MongoObjectFactory tractracMongoObjectFactory) { + 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 @@ -148,8 +154,15 @@ public class TracTracConnectivityParamsHandler extends AbstractRaceTrackingConne final JSONObject paramsJson = (JSONObject) new JSONParser().parse(new InputStreamReader(conn.getInputStream())); final String jsonURL = (String) paramsJson.get("eventJSON"); final String creatorName = SessionUtils.getPrincipal().toString(); - tractracMongoObjectFactory.updateTracTracConfiguration(new TracTracConfigurationImpl(creatorName, params.getTractracRace().getEvent().getName(), jsonURL, + 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())); + params.getCourseDesignUpdateURI()==null?null:params.getCourseDesignUpdateURI().toString(), params.getTracTracUsername(), params.getTracTracPassword()); + tractracMongoObjectFactory.updateTracTracConfiguration(tracTracConfiguration); + final OwnershipAnnotation existingOwnership = securityService.getOwnership(tracTracConfiguration.getIdentifier()); + if (existingOwnership == null || existingOwnership.getAnnotation() == null || + (existingOwnership.getAnnotation().getTenantOwner() == null && + existingOwnership.getAnnotation().getUserOwner() == null)) { + securityService.setDefaultOwnership(tracTracConfiguration.getIdentifier(), tracTracConfiguration.getName()); + } } } 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 750921ba3b5..5094751b882 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; @@ -30,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 @@ -51,13 +53,14 @@ 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(), - new MongoObjectFactoryImpl(mongoObjectFactory.getDatabase())); + new MongoObjectFactoryImpl(mongoObjectFactory.getDatabase()), securityServiceMock); case SwissTimingTrackingConnectivityParameters.TYPE: return new com.sap.sailing.domain.swisstimingadapter.persistence.impl.SwissTimingConnectivityParamsHandler( MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(mongoObjectFactory, domainObjectFactory), @@ -68,7 +71,7 @@ public class MockConnectivityParamsServiceFinderFactory implements TypeBasedServ 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.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 Date: Wed, 15 Apr 2020 16:33:45 +0200 Subject: [PATCH 5/6] bug5245: now TracTrac, SwissTiming and SwissTiming Archive all have support for configuration update during MDI --- .../persistence/impl/Activator.java | 2 +- .../SwissTimingConnectivityParamsHandler.java | 27 +++++++++++-- .../swisstimingadapter/DomainFactory.java | 2 +- .../SwissTimingAdapter.java | 4 +- .../impl/DomainFactoryImpl.java | 4 +- .../impl/SwissTimingAdapterImpl.java | 5 ++- ...sTimingTrackingConnectivityParameters.java | 15 +++++++- ...TimingReplayConnectivityParamsHandler.java | 8 +--- .../TracTracConnectivityParamsHandler.java | 8 +--- .../gwt/ui/test/SailingServiceImplMock.java | 2 +- .../SwissTimingEventManagementPanel.java | 38 +++++++------------ .../SwissTimingConnectionDialog.java | 1 + .../sailing/gwt/ui/client/SailingService.java | 2 +- .../gwt/ui/client/SailingServiceAsync.java | 7 ++-- .../gwt/ui/server/SailingServiceImpl.java | 12 +++--- ...onnectivityParamsServiceFinderFactory.java | 2 +- ...ingConnectivityParamsLoadAndStoreTest.java | 10 ++++- .../ImportMasterDataOperation.java | 2 +- .../security/impl/SecurityServiceImpl.java | 6 ++- 19 files changed, 91 insertions(+), 66 deletions(-) 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/SwissTimingConnectivityParamsHandler.java b/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/SwissTimingConnectivityParamsHandler.java index e99e2e327f0..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,8 +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()); - // TODO bug5245: update persistent connector configs + 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..e6a8749e8e9 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 @@ -26,10 +26,12 @@ public interface SwissTimingAdapter { * is specified, a regatta lookup is performed with that identifier; if the regatta is found, it is used * to add the races to. Otherwise, a default regatta as described above will be created and used. * @param useInternalMarkPassingAlgorithm use our own instead of the SwissTiming-provided mark passing / split times + * @param eventName TODO + * @param manage2SailEventUrl TODO */ 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/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 af683ee441a..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 @@ -17,7 +17,6 @@ import com.sap.sailing.domain.tracking.impl.AbstractRaceTrackingConnectivityPara import com.sap.sse.common.TypeBasedServiceFinder; import com.sap.sse.security.SecurityService; import com.sap.sse.security.SessionUtils; -import com.sap.sse.security.shared.OwnershipAnnotation; /** * Handles mapping TracTrac connectivity parameters from and to a map with {@link String} keys. The @@ -99,12 +98,7 @@ public class SwissTimingReplayConnectivityParamsHandler extends AbstractRaceTrac final SwissTimingArchiveConfiguration swissTimingArchiveConfiguration = SwissTimingFactory.INSTANCE .createSwissTimingArchiveConfiguration(result.getSwissTimingUrl(), creatorName); SwissTimingAdapterPersistence.INSTANCE.updateSwissTimingArchiveConfiguration(swissTimingArchiveConfiguration); - final OwnershipAnnotation existingOwnership = securityService.getOwnership(swissTimingArchiveConfiguration.getIdentifier()); - if (existingOwnership == null || existingOwnership.getAnnotation() == null || - (existingOwnership.getAnnotation().getTenantOwner() == null && - existingOwnership.getAnnotation().getUserOwner() == null)) { - securityService.setDefaultOwnership(swissTimingArchiveConfiguration.getIdentifier(), swissTimingArchiveConfiguration.getName()); - } + securityService.setDefaultOwnershipIfNotSet(swissTimingArchiveConfiguration.getIdentifier()); } return result; } 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 0d51be256ff..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 @@ -28,7 +28,6 @@ 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.security.shared.OwnershipAnnotation; import com.sap.sse.util.HttpUrlConnectionHelper; /** @@ -158,11 +157,6 @@ public class TracTracConnectivityParamsHandler extends AbstractRaceTrackingConne /* 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); - final OwnershipAnnotation existingOwnership = securityService.getOwnership(tracTracConfiguration.getIdentifier()); - if (existingOwnership == null || existingOwnership.getAnnotation() == null || - (existingOwnership.getAnnotation().getTenantOwner() == null && - existingOwnership.getAnnotation().getUserOwner() == null)) { - securityService.setDefaultOwnership(tracTracConfiguration.getIdentifier(), tracTracConfiguration.getName()); - } + 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 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/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index 77506002cbe..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 @@ -3430,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) { @@ -3458,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); } } 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 5094751b882..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 @@ -65,7 +65,7 @@ public class MockConnectivityParamsServiceFinderFactory implements TypeBasedServ 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), 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.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.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java b/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java index bd0b856780b..45de0ca3156 100755 --- a/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java +++ b/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java @@ -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()); } } From e5f3a88d1ad0399dbc07fa434a08a2bdf295dfd3 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 16 Apr 2020 13:44:37 +0200 Subject: [PATCH 6/6] bug5245/bug5231: removed extra parameter TODOs; added release notes --- .../domain/swisstimingadapter/SwissTimingAdapter.java | 7 ++++--- java/com.sap.sailing.www/release_notes_admin.html | 7 +++++++ 2 files changed, 11 insertions(+), 3 deletions(-) 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 e6a8749e8e9..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 @@ -26,12 +26,13 @@ public interface SwissTimingAdapter { * is specified, a regatta lookup is performed with that identifier; if the regatta is found, it is used * to add the races to. Otherwise, a default regatta as described above will be created and used. * @param useInternalMarkPassingAlgorithm use our own instead of the SwissTiming-provided mark passing / split times - * @param eventName TODO - * @param manage2SailEventUrl TODO */ 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, String eventName, String manage2SailEventUrl) + 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.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