Bug 4819: added CRUD operations for SwissTimingAdapter +

SailingServiceImpl -> SwissTiming
This commit is contained in:
Steffen Jacobs
2019-04-10 16:47:51 +02:00
parent 870df259ef
commit 8100e2ea1f
11 changed files with 119 additions and 34 deletions
@@ -14,11 +14,15 @@ public interface SwissTimingAdapterPersistence {
Iterable<SwissTimingArchiveConfiguration> getSwissTimingArchiveConfigurations();
void storeSwissTimingConfiguration(SwissTimingConfiguration swissTimingConfiguration);
void createSwissTimingArchiveConfiguration(SwissTimingArchiveConfiguration swissTimingArchiveConfiguration);
void updateSwissTimingArchiveConfiguration(SwissTimingArchiveConfiguration swissTimingArchiveConfiguration);
void deleteSwissTimingArchiveConfiguration(SwissTimingArchiveConfiguration swissTimingArchiveConfiguration);
void deleteSwissTimingConfiguration(String creatorName, String jsonURL);
void updateSwissTimingConfiguration(SwissTimingConfiguration createSwissTimingConfiguration);
void createSwissTimingConfiguration(SwissTimingConfiguration createSwissTimingConfiguration);
}
@@ -3,7 +3,7 @@ package com.sap.sailing.domain.swisstimingadapter.persistence.impl;
public enum FieldNames {
// SwissTiming configuration parameters:
ST_CONFIG_NAME, ST_CONFIG_HOSTNAME, ST_CONFIG_PORT, ST_CONFIG_JSON_URL, ST_CONFIG_UPDATE_URL,
ST_CONFIG_UPDATE_USERNAME, ST_CONFIG_UPDATE_PASSWORD, ST_ARCHIVE_JSON_URL, ST_ARCHIVE_CREATOR_NAME,
ST_CONFIG_UPDATE_USERNAME, ST_CONFIG_UPDATE_PASSWORD, ST_CONFIG_CREATOR_NAME, ST_ARCHIVE_JSON_URL, ST_ARCHIVE_CREATOR_NAME,
// last message count field:
LAST_MESSAGE_COUNT,
@@ -60,7 +60,9 @@ public class SwissTimingAdapterPersistenceImpl implements SwissTimingAdapterPers
String updateURL = (String) object.get(FieldNames.ST_CONFIG_UPDATE_URL.name());
String updateUsername = (String) object.get(FieldNames.ST_CONFIG_UPDATE_USERNAME.name());
String updatePassword = (String) object.get(FieldNames.ST_CONFIG_UPDATE_PASSWORD.name());
return swissTimingFactory.createSwissTimingConfiguration(name, jsonURL, hostname, port, updateURL, updateUsername, updatePassword);
String creatorName = object.getString(FieldNames.ST_CONFIG_CREATOR_NAME.name());
return swissTimingFactory.createSwissTimingConfiguration(name, jsonURL, hostname, port, updateURL,
updateUsername, updatePassword, creatorName);
}
@Override
@@ -88,8 +90,16 @@ public class SwissTimingAdapterPersistenceImpl implements SwissTimingAdapterPers
}
@Override
public void storeSwissTimingConfiguration(SwissTimingConfiguration swissTimingConfiguration) {
public void createSwissTimingConfiguration(SwissTimingConfiguration swissTimingConfiguration) {
MongoCollection<org.bson.Document> stConfigCollection = database.getCollection(CollectionNames.SWISSTIMING_CONFIGURATIONS.name());
Document result = storeSwissTimingConfiguration(swissTimingConfiguration);
final Document updateQuery = new Document(FieldNames.ST_CONFIG_JSON_URL.name(),
swissTimingConfiguration.getJsonURL());
stConfigCollection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(updateQuery, result,
new UpdateOptions().upsert(true));
}
private Document storeSwissTimingConfiguration(SwissTimingConfiguration swissTimingConfiguration) {
Document result = new Document();
result.put(FieldNames.ST_CONFIG_NAME.name(), swissTimingConfiguration.getName());
result.put(FieldNames.ST_CONFIG_JSON_URL.name(), swissTimingConfiguration.getJsonURL());
@@ -98,10 +108,8 @@ public class SwissTimingAdapterPersistenceImpl implements SwissTimingAdapterPers
result.put(FieldNames.ST_CONFIG_UPDATE_URL.name(), swissTimingConfiguration.getUpdateURL());
result.put(FieldNames.ST_CONFIG_UPDATE_USERNAME.name(), swissTimingConfiguration.getUpdateUsername());
result.put(FieldNames.ST_CONFIG_UPDATE_PASSWORD.name(), swissTimingConfiguration.getUpdatePassword());
final Document updateQuery = new Document(FieldNames.ST_CONFIG_JSON_URL.name(),
swissTimingConfiguration.getJsonURL());
stConfigCollection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(updateQuery, result,
new UpdateOptions().upsert(true));
result.put(FieldNames.ST_CONFIG_CREATOR_NAME.name(), swissTimingConfiguration.getCreatorName());
return result;
}
@Override
@@ -137,4 +145,25 @@ public class SwissTimingAdapterPersistenceImpl implements SwissTimingAdapterPers
Document result = storeSwissTimingArchiveConfiguration(config);
stArchiveConfigCollection.withWriteConcern(WriteConcern.ACKNOWLEDGED).deleteOne(result);
}
@Override
public void deleteSwissTimingConfiguration(String creatorName, String jsonURL) {
MongoCollection<org.bson.Document> stArchiveConfigCollection = database
.getCollection(CollectionNames.SWISSTIMING_ARCHIVE_CONFIGURATIONS.name());
Document result = new Document();
result.put(FieldNames.ST_CONFIG_JSON_URL.name(), jsonURL);
result.put(FieldNames.ST_CONFIG_CREATOR_NAME.name(), creatorName);
stArchiveConfigCollection.withWriteConcern(WriteConcern.ACKNOWLEDGED).deleteOne(result);
}
@Override
public void updateSwissTimingConfiguration(SwissTimingConfiguration config) {
MongoCollection<org.bson.Document> stArchiveConfigCollection = database
.getCollection(CollectionNames.SWISSTIMING_CONFIGURATIONS.name());
Document result = storeSwissTimingConfiguration(config);
final Document updateQuery = new Document(FieldNames.ST_CONFIG_JSON_URL.name(), config.getJsonURL());
updateQuery.put(FieldNames.ST_CONFIG_CREATOR_NAME.name(), config.getCreatorName());
stArchiveConfigCollection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(updateQuery, result,
new UpdateOptions().upsert(true));
}
}
@@ -13,6 +13,8 @@ import com.sap.sse.security.shared.WithQualifiedObjectIdentifier;
*
*/
public interface SwissTimingConfiguration extends WithQualifiedObjectIdentifier {
String getCreatorName();
String getName();
String getJsonURL();
@@ -38,10 +40,11 @@ public interface SwissTimingConfiguration extends WithQualifiedObjectIdentifier
}
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);
}
}
@@ -53,7 +53,8 @@ public interface SwissTimingFactory {
SailMasterTransceiver createSailMasterTransceiver();
SwissTimingConfiguration createSwissTimingConfiguration(String name, String jsonURL, String hostname, Integer port, String updateURL, String updateUsername, String updatePassword);
SwissTimingConfiguration createSwissTimingConfiguration(String name, String jsonURL, String hostname, Integer port,
String updateURL, String updateUsername, String updatePassword, String creatorName);
SwissTimingRaceTracker createRaceTracker(RaceLogStore raceLogStore, RegattaLogStore regattaLogStore, WindStore windStore,
DomainFactory domainFactory, TrackedRegattaRegistry trackedRegattaRegistry, RaceLogResolver raceLogResolver, SwissTimingTrackingConnectivityParameters connectivityParams,
@@ -11,8 +11,10 @@ public class SwissTimingConfigurationImpl implements SwissTimingConfiguration {
private final String updateURL;
private final String updateUsername;
private final String updatePassword;
private String creatorName;
public SwissTimingConfigurationImpl(String name, String jsonURL, String hostname, Integer port, String updateURL, String updateUsername, String updatePassword) {
public SwissTimingConfigurationImpl(String name, String jsonURL, String hostname, Integer port, String updateURL,
String updateUsername, String updatePassword, String creatorName) {
super();
this.name = name;
this.jsonURL = jsonURL;
@@ -21,6 +23,12 @@ public class SwissTimingConfigurationImpl implements SwissTimingConfiguration {
this.updateURL = updateURL;
this.updateUsername = updateUsername;
this.updatePassword = updatePassword;
this.creatorName = creatorName;
}
@Override
public String getCreatorName() {
return creatorName;
}
@Override
@@ -85,8 +85,9 @@ public class SwissTimingFactoryImpl implements SwissTimingFactory {
@Override
public SwissTimingConfiguration createSwissTimingConfiguration(String name, String jsonURL, String hostname,
Integer port, String updateURL, String updateUsername, String updatePassword) {
return new SwissTimingConfigurationImpl(name, jsonURL, hostname, port, updateURL, updateUsername, updatePassword);
Integer port, String updateURL, String updateUsername, String updatePassword, String creatorName) {
return new SwissTimingConfigurationImpl(name, jsonURL, hostname, port, updateURL, updateUsername,
updatePassword, creatorName);
}
@Override
@@ -507,7 +507,8 @@ public class SwissTimingEventManagementPanel extends AbstractEventManagementPane
final String hostname = result.trackingDataHost;
final Integer port = result.trackingDataPort;
final String configName = result.eventName;
sailingService.storeSwissTimingConfiguration(configName, jsonUrl, hostname, port, updateURL, updateUsername, updatePassword,
sailingService.createSwissTimingConfiguration(configName, jsonUrl, hostname, port, updateURL,
updateUsername, updatePassword,
new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
@@ -375,9 +375,15 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS
SwissTimingEventRecordDTO getRacesOfSwissTimingEvent(String eventJsonURL) throws UnauthorizedException, Exception;
void storeSwissTimingConfiguration(String configName, String jsonURL, String hostname, Integer port,
void createSwissTimingConfiguration(String configName, String jsonURL, String hostname, Integer port,
String updateURL, String updateUsername, String updatePassword) throws UnauthorizedException, Exception;
void deleteSwissTimingConfiguration(SwissTimingConfigurationWithSecurityDTO configuration)
throws UnauthorizedException, Exception;
void updateSwissTimingConfiguration(SwissTimingConfigurationWithSecurityDTO configuration)
throws UnauthorizedException, Exception;
String[] getCountryCodes() throws UnauthorizedException;
Map<CompetitorDTO, List<GPSFixDTOWithSpeedWindTackAndLegType>> getDouglasPoints(
@@ -367,9 +367,15 @@ public interface SailingServiceAsync extends FileStorageManagementGwtServiceAsyn
void getRacesOfSwissTimingEvent(String eventJsonUrl, AsyncCallback<SwissTimingEventRecordDTO> asyncCallback);
void storeSwissTimingConfiguration(String configName, String jsonURL, String hostname, Integer port,
void createSwissTimingConfiguration(String configName, String jsonURL, String hostname, Integer port,
String updateURL, String updateUsername, String updatePassword, AsyncCallback<Void> asyncCallback);
void updateSwissTimingConfiguration(SwissTimingConfigurationWithSecurityDTO configuration,
AsyncCallback<Void> asyncCallback);
void deleteSwissTimingConfiguration(SwissTimingConfigurationWithSecurityDTO configuration,
AsyncCallback<Void> asyncCallback);
void getCountryCodes(AsyncCallback<String[]> callback);
void getDouglasPoints(RegattaAndRaceIdentifier raceIdentifier, Map<CompetitorDTO, TimeRange> competitorTimeRanges,
@@ -3177,9 +3177,48 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet
public List<SwissTimingConfigurationWithSecurityDTO> getPreviousSwissTimingConfigurations() {
Iterable<SwissTimingConfiguration> configs = swissTimingAdapterPersistence.getSwissTimingConfigurations();
return getSecurityService().mapAndFilterByReadPermissionForCurrentUser(SecuredDomainType.SWISS_TIMING_ACCOUNT, configs,
stConfig -> new SwissTimingConfigurationWithSecurityDTO(stConfig.getName(), stConfig.getJsonURL(),
stConfig -> {
final SwissTimingConfigurationWithSecurityDTO config = new SwissTimingConfigurationWithSecurityDTO(
stConfig.getName(), stConfig.getJsonURL(),
stConfig.getHostname(), stConfig.getPort(), stConfig.getUpdateURL(),
stConfig.getUpdateUsername(), stConfig.getUpdatePassword(), null));
stConfig.getUpdateUsername(), stConfig.getUpdatePassword(), null);
SecurityDTOUtil.addSecurityInformation(getSecurityService(), config, config.getIdentifier());
return config;
});
}
@Override
public void createSwissTimingConfiguration(String configName, String jsonURL, String hostname, Integer port,
String updateURL, String updateUsername, String updatePassword) throws Exception {
if (!jsonURL.equalsIgnoreCase("test")) {
final String currentUserName = getSecurityService().getCurrentUser().getName();
getSecurityService().setOwnershipCheckPermissionForObjectCreationAndRevertOnError(
SecuredDomainType.SWISS_TIMING_ACCOUNT,
SwissTimingConfiguration.getTypeRelativeObjectIdentifier(jsonURL, currentUserName), configName,
() -> swissTimingAdapterPersistence
.createSwissTimingConfiguration(
swissTimingFactory.createSwissTimingConfiguration(configName,
jsonURL, hostname, port, updateURL, updateUsername, updatePassword,
currentUserName)));
}
}
@Override
public void deleteSwissTimingConfiguration(SwissTimingConfigurationWithSecurityDTO configuration) {
getSecurityService().checkCurrentUserDeletePermission(configuration);
getSecurityService().checkPermissionAndDeleteOwnershipForObjectRemoval(configuration,
() -> swissTimingAdapterPersistence.deleteSwissTimingConfiguration(configuration.getCreatorName(),
configuration.getJsonURL()));
}
@Override
public void updateSwissTimingConfiguration(SwissTimingConfigurationWithSecurityDTO configuration)
throws Exception {
getSecurityService().checkCurrentUserUpdatePermission(configuration);
swissTimingAdapterPersistence.updateSwissTimingConfiguration(swissTimingFactory.createSwissTimingConfiguration(
configuration.getName(), configuration.getJsonURL(), configuration.getHostname(),
configuration.getPort(), configuration.getUpdateURL(), configuration.getUpdateUsername(),
configuration.getUpdatePassword(), configuration.getCreatorName()));
}
@Override
@@ -3213,19 +3252,6 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet
}
return result;
}
@Override
public void storeSwissTimingConfiguration(String configName, String jsonURL, String hostname, Integer port,
String updateURL, String updateUsername, String updatePassword) throws Exception {
if (!jsonURL.equalsIgnoreCase("test")) {
getSecurityService().setOwnershipCheckPermissionForObjectCreationAndRevertOnError(
SecuredDomainType.SWISS_TIMING_ACCOUNT, SwissTimingConfiguration.getTypeRelativeObjectIdentifier(jsonURL),
configName,
() -> swissTimingAdapterPersistence
.storeSwissTimingConfiguration(swissTimingFactory.createSwissTimingConfiguration(configName,
jsonURL, hostname, port, updateURL, updateUsername, updatePassword)));
}
}
private RaceLogStore getRaceLogStore() {
return MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(mongoObjectFactory,