Bug 4819: added CRUD operations to SailingServiceImpl + adjusted

SwissTimingArchiveConfigurationWithSecurityDTO
This commit is contained in:
Steffen Jacobs
2019-04-10 15:05:46 +02:00
parent 2486e75599
commit 367297f5d6
10 changed files with 159 additions and 46 deletions
@@ -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);
}
}
@@ -69,6 +69,6 @@ public interface SwissTimingFactory {
SailMasterMessage createMessage(String message);
SwissTimingArchiveConfiguration createSwissTimingArchiveConfiguration(String string);
SwissTimingArchiveConfiguration createSwissTimingArchiveConfiguration(String jsonUrl, String creatorName);
}
@@ -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;
}
}
@@ -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);
}
}
@@ -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<SwissTimingReplayRaceDTO> filterablePanelEvents;
private final ListDataProvider<SwissTimingReplayRaceDTO> raceList;
private final CellTable<SwissTimingReplayRaceDTO> raceTable;
private final Map<String, SwissTimingArchiveConfigurationDTO> previousConfigurations;
private final Map<String, SwissTimingArchiveConfigurationWithSecurityDTO> 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<String, SwissTimingArchiveConfigurationDTO>();
previousConfigurations = new HashMap<String, SwissTimingArchiveConfigurationWithSecurityDTO>();
getConnectionHistory();
jsonUrlBox = new TextBox();
@@ -296,7 +296,7 @@ public class SwissTimingReplayConnectorPanel extends AbstractEventManagementPane
}
private void getConnectionHistory() {
sailingService.getPreviousSwissTimingArchiveConfigurations(new AsyncCallback<List<SwissTimingArchiveConfigurationDTO>>() {
sailingService.getPreviousSwissTimingArchiveConfigurations(new AsyncCallback<List<SwissTimingArchiveConfigurationWithSecurityDTO>>() {
@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<SwissTimingArchiveConfigurationDTO> result) {
public void onSuccess(List<SwissTimingArchiveConfigurationWithSecurityDTO> 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<Void>() {
@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());
}
@@ -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<String> getOverallLeaderboardNamesContaining(String leaderboardName) throws UnauthorizedException;
List<SwissTimingArchiveConfigurationDTO> getPreviousSwissTimingArchiveConfigurations() throws UnauthorizedException;
List<SwissTimingArchiveConfigurationWithSecurityDTO> 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;
@@ -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<List<String>> asyncCallback);
void getPreviousSwissTimingArchiveConfigurations(
AsyncCallback<List<SwissTimingArchiveConfigurationDTO>> asyncCallback);
AsyncCallback<List<SwissTimingArchiveConfigurationWithSecurityDTO>> asyncCallback);
void storeSwissTimingArchiveConfiguration(String swissTimingUrl, AsyncCallback<Void> asyncCallback);
void createSwissTimingArchiveConfiguration(SwissTimingArchiveConfigurationWithSecurityDTO dto,
AsyncCallback<Void> asyncCallback);
void updateSwissTimingArchiveConfiguration(SwissTimingArchiveConfigurationWithSecurityDTO dto,
AsyncCallback<Void> asyncCallback);
void deleteSwissTimingArchiveConfiguration(SwissTimingArchiveConfigurationWithSecurityDTO dto,
AsyncCallback<Void> asyncCallback);
void updateRegatta(RegattaIdentifier regattaIdentifier, Date startDate, Date endDate, UUID defaultCourseAreaUuid,
RegattaConfigurationDTO regattaConfiguration, Double buoyZoneRadiusInHullLengths,
@@ -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<SwissTimingArchiveConfigurationDTO> getPreviousSwissTimingArchiveConfigurations() {
public List<SwissTimingArchiveConfigurationWithSecurityDTO> getPreviousSwissTimingArchiveConfigurations() {
Iterable<SwissTimingArchiveConfiguration> 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() {
@@ -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;
}
}
@@ -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());
}
}