diff --git a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/SwissTimingArchiveConfiguration.java b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/SwissTimingArchiveConfiguration.java index 591d8874dea..61f0a342c7f 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/SwissTimingArchiveConfiguration.java +++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/SwissTimingArchiveConfiguration.java @@ -10,6 +10,8 @@ public interface SwissTimingArchiveConfiguration extends WithQualifiedObjectIden String getJsonURL(); + String getCreatorName(); + @Override default String getName() { return getJsonURL(); @@ -26,10 +28,11 @@ public interface SwissTimingArchiveConfiguration extends WithQualifiedObjectIden } default TypeRelativeObjectIdentifier getTypeRelativeObjectIdentifier() { - return getTypeRelativeObjectIdentifier(getJsonURL()); + return getTypeRelativeObjectIdentifier(getJsonURL(), getCreatorName()); } - public static TypeRelativeObjectIdentifier getTypeRelativeObjectIdentifier(String jsonUrl) { - return new TypeRelativeObjectIdentifier(jsonUrl); + public static TypeRelativeObjectIdentifier getTypeRelativeObjectIdentifier(String jsonUrl, String username) { + return username == null ? new TypeRelativeObjectIdentifier(jsonUrl) + : new TypeRelativeObjectIdentifier(jsonUrl, username); } } diff --git a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/SwissTimingFactory.java b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/SwissTimingFactory.java index d6b5182fb1b..f389f8f4db7 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/SwissTimingFactory.java +++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/SwissTimingFactory.java @@ -69,6 +69,6 @@ public interface SwissTimingFactory { SailMasterMessage createMessage(String message); - SwissTimingArchiveConfiguration createSwissTimingArchiveConfiguration(String string); + SwissTimingArchiveConfiguration createSwissTimingArchiveConfiguration(String jsonUrl, String creatorName); } diff --git a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingArchiveConfigurationImpl.java b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingArchiveConfigurationImpl.java index 61b1e1176c3..4be331f2014 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingArchiveConfigurationImpl.java +++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingArchiveConfigurationImpl.java @@ -5,14 +5,21 @@ import com.sap.sailing.domain.swisstimingadapter.SwissTimingArchiveConfiguration public class SwissTimingArchiveConfigurationImpl implements SwissTimingArchiveConfiguration { private static final long serialVersionUID = 1L; private final String jsonUrl; + private final String creatorName; - public SwissTimingArchiveConfigurationImpl(String jsonUrl) { + public SwissTimingArchiveConfigurationImpl(String jsonUrl, String creatorName) { super(); this.jsonUrl = jsonUrl; + this.creatorName = creatorName; } @Override public String getJsonURL() { return jsonUrl; } + + @Override + public String getCreatorName() { + return creatorName; + } } diff --git a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingFactoryImpl.java b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingFactoryImpl.java index 599c00483ad..c2b5fefeb21 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingFactoryImpl.java +++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingFactoryImpl.java @@ -125,7 +125,7 @@ public class SwissTimingFactoryImpl implements SwissTimingFactory { } @Override - public SwissTimingArchiveConfiguration createSwissTimingArchiveConfiguration(String jsonUrl) { - return new SwissTimingArchiveConfigurationImpl(jsonUrl); + public SwissTimingArchiveConfiguration createSwissTimingArchiveConfiguration(String jsonUrl, String creatorName) { + return new SwissTimingArchiveConfigurationImpl(jsonUrl, creatorName); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingReplayConnectorPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingReplayConnectorPanel.java index a647f3c973d..916709e4ec4 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingReplayConnectorPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingReplayConnectorPanel.java @@ -38,7 +38,7 @@ import com.sap.sailing.gwt.ui.client.RegattaRefresher; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.shared.RegattaDTO; -import com.sap.sailing.gwt.ui.shared.SwissTimingArchiveConfigurationDTO; +import com.sap.sailing.gwt.ui.shared.SwissTimingArchiveConfigurationWithSecurityDTO; import com.sap.sailing.gwt.ui.shared.SwissTimingReplayRaceDTO; import com.sap.sse.common.util.NaturalComparator; import com.sap.sse.gwt.adminconsole.AdminConsoleTableResources; @@ -61,7 +61,7 @@ public class SwissTimingReplayConnectorPanel extends AbstractEventManagementPane private final LabeledAbstractFilterablePanel filterablePanelEvents; private final ListDataProvider raceList; private final CellTable raceTable; - private final Map previousConfigurations; + private final Map previousConfigurations; private final ListBox previousConfigurationsComboBox; private final TextBox jsonUrlBox; private final Grid grid; @@ -79,7 +79,7 @@ public class SwissTimingReplayConnectorPanel extends AbstractEventManagementPane updateJsonUrlFromSelectedPreviousConfiguration(); } }); - previousConfigurations = new HashMap(); + previousConfigurations = new HashMap(); getConnectionHistory(); jsonUrlBox = new TextBox(); @@ -296,7 +296,7 @@ public class SwissTimingReplayConnectorPanel extends AbstractEventManagementPane } private void getConnectionHistory() { - sailingService.getPreviousSwissTimingArchiveConfigurations(new AsyncCallback>() { + sailingService.getPreviousSwissTimingArchiveConfigurations(new AsyncCallback>() { @Override public void onFailure(Throwable caught) { errorReporter.reportError("Remote Procedure Call getPreviousConfigurations() - Failure: " @@ -304,11 +304,11 @@ public class SwissTimingReplayConnectorPanel extends AbstractEventManagementPane } @Override - public void onSuccess(List result) { + public void onSuccess(List result) { previousConfigurationsComboBox.clear(); previousConfigurations.clear(); Collections.sort(result, (c1, c2) -> c1.getJsonUrl().compareTo(c2.getJsonUrl())); - for (SwissTimingArchiveConfigurationDTO configEntry : result) { + for (SwissTimingArchiveConfigurationWithSecurityDTO configEntry : result) { String name = configEntry.getJsonUrl(); previousConfigurations.put(name, configEntry); previousConfigurationsComboBox.addItem(name); @@ -335,8 +335,10 @@ public class SwissTimingReplayConnectorPanel extends AbstractEventManagementPane raceList.getList().addAll(availableSwissTimingRaces); filterablePanelEvents.getTextBox().setText(null); filterablePanelEvents.updateAll(races); + final SwissTimingArchiveConfigurationWithSecurityDTO stConfig = new SwissTimingArchiveConfigurationWithSecurityDTO( + swissTimingJsonUrl, null); // store a successful configuration in the database for later retrieval - sailingService.storeSwissTimingArchiveConfiguration(swissTimingJsonUrl, + sailingService.createSwissTimingArchiveConfiguration(stConfig, new AsyncCallback() { @Override public void onFailure(Throwable caught) { @@ -347,7 +349,8 @@ public class SwissTimingReplayConnectorPanel extends AbstractEventManagementPane @Override public void onSuccess(Void voidResult) { // refresh list of previous configurations - SwissTimingArchiveConfigurationDTO stConfig = new SwissTimingArchiveConfigurationDTO(swissTimingJsonUrl); + // TODO: refresh table + if (previousConfigurations.put(stConfig.getJsonUrl(), stConfig) == null) { previousConfigurationsComboBox.addItem(stConfig.getJsonUrl()); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java index 69a34934b01..b5c50cbbcf0 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java @@ -110,7 +110,7 @@ import com.sap.sailing.gwt.ui.shared.SimulatorResultsDTO; import com.sap.sailing.gwt.ui.shared.SliceRacePreperationDTO; import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO; import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTOWithSecurity; -import com.sap.sailing.gwt.ui.shared.SwissTimingArchiveConfigurationDTO; +import com.sap.sailing.gwt.ui.shared.SwissTimingArchiveConfigurationWithSecurityDTO; import com.sap.sailing.gwt.ui.shared.SwissTimingConfigurationDTO; import com.sap.sailing.gwt.ui.shared.SwissTimingEventRecordDTO; import com.sap.sailing.gwt.ui.shared.SwissTimingRaceRecordDTO; @@ -512,9 +512,16 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS List getOverallLeaderboardNamesContaining(String leaderboardName) throws UnauthorizedException; - List getPreviousSwissTimingArchiveConfigurations() throws UnauthorizedException; + List getPreviousSwissTimingArchiveConfigurations() throws UnauthorizedException; - void storeSwissTimingArchiveConfiguration(String swissTimingUrl) throws UnauthorizedException, Exception; + void createSwissTimingArchiveConfiguration(SwissTimingArchiveConfigurationWithSecurityDTO dto) + throws UnauthorizedException, Exception; + + void updateSwissTimingArchiveConfiguration(SwissTimingArchiveConfigurationWithSecurityDTO dto) + throws UnauthorizedException, Exception; + + void deleteSwissTimingArchiveConfiguration(SwissTimingArchiveConfigurationWithSecurityDTO dto) + throws UnauthorizedException, Exception; void createCourseAreas(UUID eventId, String[] courseAreaNames) throws UnauthorizedException; 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 6357c516942..6b18610ed85 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 @@ -95,7 +95,7 @@ import com.sap.sailing.gwt.ui.shared.SimulatorResultsDTO; import com.sap.sailing.gwt.ui.shared.SliceRacePreperationDTO; import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO; import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTOWithSecurity; -import com.sap.sailing.gwt.ui.shared.SwissTimingArchiveConfigurationDTO; +import com.sap.sailing.gwt.ui.shared.SwissTimingArchiveConfigurationWithSecurityDTO; import com.sap.sailing.gwt.ui.shared.SwissTimingConfigurationDTO; import com.sap.sailing.gwt.ui.shared.SwissTimingEventRecordDTO; import com.sap.sailing.gwt.ui.shared.SwissTimingRaceRecordDTO; @@ -578,9 +578,16 @@ public interface SailingServiceAsync extends FileStorageManagementGwtServiceAsyn void getOverallLeaderboardNamesContaining(String leaderboardName, AsyncCallback> asyncCallback); void getPreviousSwissTimingArchiveConfigurations( - AsyncCallback> asyncCallback); + AsyncCallback> asyncCallback); - void storeSwissTimingArchiveConfiguration(String swissTimingUrl, AsyncCallback asyncCallback); + void createSwissTimingArchiveConfiguration(SwissTimingArchiveConfigurationWithSecurityDTO dto, + AsyncCallback asyncCallback); + + void updateSwissTimingArchiveConfiguration(SwissTimingArchiveConfigurationWithSecurityDTO dto, + AsyncCallback asyncCallback); + + void deleteSwissTimingArchiveConfiguration(SwissTimingArchiveConfigurationWithSecurityDTO dto, + AsyncCallback asyncCallback); void updateRegatta(RegattaIdentifier regattaIdentifier, Date startDate, Date endDate, UUID defaultCourseAreaUuid, RegattaConfigurationDTO regattaConfiguration, Double buoyZoneRadiusInHullLengths, 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 81f18b7c48a..1b3a39f52e5 100644 --- 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 @@ -454,7 +454,7 @@ import com.sap.sailing.gwt.ui.shared.SliceRacePreperationDTO; import com.sap.sailing.gwt.ui.shared.SpeedWithBearingDTO; import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO; import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTOWithSecurity; -import com.sap.sailing.gwt.ui.shared.SwissTimingArchiveConfigurationDTO; +import com.sap.sailing.gwt.ui.shared.SwissTimingArchiveConfigurationWithSecurityDTO; import com.sap.sailing.gwt.ui.shared.SwissTimingConfigurationDTO; import com.sap.sailing.gwt.ui.shared.SwissTimingEventRecordDTO; import com.sap.sailing.gwt.ui.shared.SwissTimingRaceRecordDTO; @@ -5213,20 +5213,44 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet } @Override - public List getPreviousSwissTimingArchiveConfigurations() { + public List getPreviousSwissTimingArchiveConfigurations() { Iterable configs = swissTimingAdapterPersistence .getSwissTimingArchiveConfigurations(); return getSecurityService().mapAndFilterByReadPermissionForCurrentUser( SecuredDomainType.SWISS_TIMING_ARCHIVE_ACCOUNT, configs, - stArchiveConfig -> new SwissTimingArchiveConfigurationDTO(stArchiveConfig.getJsonURL())); + stArchiveConfig -> { + SwissTimingArchiveConfigurationWithSecurityDTO config = new SwissTimingArchiveConfigurationWithSecurityDTO( + stArchiveConfig.getJsonURL(), stArchiveConfig.getCreatorName()); + SecurityDTOUtil.addSecurityInformation(getSecurityService(), config, config.getIdentifier()); + return config; + }); } @Override - public void storeSwissTimingArchiveConfiguration(String swissTimingJsonUrl) throws Exception { + public void createSwissTimingArchiveConfiguration(SwissTimingArchiveConfigurationWithSecurityDTO dto) + throws Exception { + final String currentUserName = getSecurityService().getCurrentUser().getName(); getSecurityService().setOwnershipCheckPermissionForObjectCreationAndRevertOnError( - SecuredDomainType.SWISS_TIMING_ACCOUNT, SwissTimingArchiveConfiguration.getTypeRelativeObjectIdentifier(swissTimingJsonUrl), - swissTimingJsonUrl, () -> swissTimingAdapterPersistence.storeSwissTimingArchiveConfiguration( - swissTimingFactory.createSwissTimingArchiveConfiguration(swissTimingJsonUrl))); + SecuredDomainType.SWISS_TIMING_ACCOUNT, dto.getIdentifier().getTypeRelativeObjectIdentifier(), + dto.getName(), + () -> swissTimingAdapterPersistence.createSwissTimingArchiveConfiguration( + swissTimingFactory.createSwissTimingArchiveConfiguration(dto.getJsonUrl(), currentUserName))); + } + + @Override + public void updateSwissTimingArchiveConfiguration(SwissTimingArchiveConfigurationWithSecurityDTO dto) + throws Exception { + getSecurityService().checkCurrentUserUpdatePermission(dto); + swissTimingAdapterPersistence.updateSwissTimingArchiveConfiguration( + swissTimingFactory.createSwissTimingArchiveConfiguration(dto.getJsonUrl(), dto.getCreatorName())); + } + + @Override + public void deleteSwissTimingArchiveConfiguration(SwissTimingArchiveConfigurationWithSecurityDTO dto) + throws Exception { + getSecurityService().checkPermissionAndDeleteOwnershipForObjectRemoval(dto.getIdentifier(), + () -> swissTimingAdapterPersistence.deleteSwissTimingArchiveConfiguration(swissTimingFactory + .createSwissTimingArchiveConfiguration(dto.getJsonUrl(), dto.getCreatorName()))); } protected com.sap.sailing.domain.base.DomainFactory getBaseDomainFactory() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/SwissTimingArchiveConfigurationDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/SwissTimingArchiveConfigurationDTO.java deleted file mode 100755 index 194a57d611b..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/SwissTimingArchiveConfigurationDTO.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.sap.sailing.gwt.ui.shared; - -import com.google.gwt.user.client.rpc.IsSerializable; - -public class SwissTimingArchiveConfigurationDTO implements IsSerializable { - private String jsonUrl; - - SwissTimingArchiveConfigurationDTO() {} - - public SwissTimingArchiveConfigurationDTO(String jsonUrl) { - super(); - this.jsonUrl = jsonUrl; - } - - public String getJsonUrl() { - return jsonUrl; - } -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/SwissTimingArchiveConfigurationWithSecurityDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/SwissTimingArchiveConfigurationWithSecurityDTO.java new file mode 100644 index 00000000000..11172388314 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/SwissTimingArchiveConfigurationWithSecurityDTO.java @@ -0,0 +1,80 @@ +package com.sap.sailing.gwt.ui.shared; + +import com.google.gwt.user.client.rpc.IsSerializable; +import com.sap.sailing.domain.common.security.SecuredDomainType; +import com.sap.sse.security.shared.HasPermissions; +import com.sap.sse.security.shared.QualifiedObjectIdentifier; +import com.sap.sse.security.shared.TypeRelativeObjectIdentifier; +import com.sap.sse.security.shared.dto.AccessControlListDTO; +import com.sap.sse.security.shared.dto.OwnershipDTO; +import com.sap.sse.security.shared.dto.SecuredDTO; +import com.sap.sse.security.shared.dto.SecurityInformationDTO; + +public class SwissTimingArchiveConfigurationWithSecurityDTO implements IsSerializable, SecuredDTO { + private static final long serialVersionUID = 108023338445751985L; + + private String jsonUrl; + private String creatorName; + private SecurityInformationDTO securityInformation = new SecurityInformationDTO(); + + SwissTimingArchiveConfigurationWithSecurityDTO() { + } + + public SwissTimingArchiveConfigurationWithSecurityDTO(String jsonUrl, String creatorName) { + super(); + this.jsonUrl = jsonUrl; + this.creatorName = creatorName; + } + + public String getJsonUrl() { + return jsonUrl; + } + + public String getCreatorName() { + return creatorName; + } + + @Override + public AccessControlListDTO getAccessControlList() { + return securityInformation.getAccessControlList(); + } + + @Override + public OwnershipDTO getOwnership() { + return securityInformation.getOwnership(); + } + + @Override + public void setAccessControlList(AccessControlListDTO createAccessControlListDTO) { + securityInformation.setAccessControlList(createAccessControlListDTO); + } + + @Override + public void setOwnership(OwnershipDTO createOwnershipDTO) { + securityInformation.setOwnership(createOwnershipDTO); + } + + public SecurityInformationDTO getSecurityInformation() { + return securityInformation; + } + + @Override + public String getName() { + return jsonUrl; + } + + @Override + public HasPermissions getType() { + return SecuredDomainType.SWISS_TIMING_ARCHIVE_ACCOUNT; + } + + private TypeRelativeObjectIdentifier getTypeRelativeObjectIdentifier() { + return creatorName == null ? new TypeRelativeObjectIdentifier(jsonUrl) + : new TypeRelativeObjectIdentifier(jsonUrl, creatorName); + } + + @Override + public QualifiedObjectIdentifier getIdentifier() { + return getType().getQualifiedObjectIdentifier(getTypeRelativeObjectIdentifier()); + } +}