fix for bug 3446: entity identity comparator for device configurations now compares the list of device names

Change-Id: I72f7d20cdb95d64cc403e7645f46c86a3f8c8384
This commit is contained in:
Axel Uhl committed 2016-01-30 12:33:27 +01:00
1 parent c0f30fd545
commit 209066b87b
24 files changed
+38 -120

No files matched your search

@@ -10,7 +10,6 @@ Export-Package: com.sap.sailing.domain.common,
com.sap.sailing.domain.common.abstractlog,
com.sap.sailing.domain.common.confidence,
com.sap.sailing.domain.common.confidence.impl,
com.sap.sailing.domain.common.configuration,
com.sap.sailing.domain.common.dto,
com.sap.sailing.domain.common.impl,
com.sap.sailing.domain.common.media,
@@ -1,16 +0,0 @@
package com.sap.sailing.domain.common.configuration;
public enum DeviceConfigurationMatcherType {
SINGLE(1);
private int matchingRank;
private DeviceConfigurationMatcherType(int rank) {
this.matchingRank = rank;
}
public int getRank() {
return matchingRank;
}
}
@@ -156,7 +156,6 @@ import com.sap.sailing.domain.common.SpeedWithBearing;
import com.sap.sailing.domain.common.Wind;
import com.sap.sailing.domain.common.WindSource;
import com.sap.sailing.domain.common.WindSourceType;
import com.sap.sailing.domain.common.configuration.DeviceConfigurationMatcherType;
import com.sap.sailing.domain.common.impl.DegreeBearingImpl;
import com.sap.sailing.domain.common.impl.DegreePosition;
import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl;
@@ -1972,8 +1971,6 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
}
private DeviceConfigurationMatcher loadConfigurationMatcher(DBObject matcherObject) {
DeviceConfigurationMatcherType type = DeviceConfigurationMatcherType.valueOf(
matcherObject.get(FieldNames.CONFIGURATION_MATCHER_TYPE.name()).toString());
List<String> clientIdentifiers = new ArrayList<String>();
BasicDBList clientIdentifiersObject = (BasicDBList) matcherObject.get(FieldNames.CONFIGURATION_MATCHER_CLIENTS.name());
if (clientIdentifiersObject != null) {
@@ -1981,7 +1978,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
clientIdentifiers.add(clientIdentifier.toString());
}
}
return baseDomainFactory.getOrCreateDeviceConfigurationMatcher(type, clientIdentifiers);
return baseDomainFactory.getOrCreateDeviceConfigurationMatcher(clientIdentifiers);
}
private DeviceConfiguration loadConfiguration(DBObject configObject) {
@@ -120,7 +120,7 @@ public enum FieldNames {
SERVER_IS_STANDALONE,
// configurations
CONFIGURATION_MATCHER, CONFIGURATION_CONFIG, CONFIGURATION_MATCHER_ID, CONFIGURATION_MATCHER_TYPE, CONFIGURATION_MATCHER_CLIENTS,
CONFIGURATION_MATCHER, CONFIGURATION_CONFIG, CONFIGURATION_MATCHER_ID, CONFIGURATION_MATCHER_CLIENTS,
CONFIGURATION_CONFIG_ALLOWED_COURSE_AREA_NAMES, CONFIGURATION_CONFIG_MIN_ROUNDS, CONFIGURATION_CONFIG_MAX_ROUNDS, CONFIGURATION_CONFIG_RESULTS_MAIL,
CONFIGURATION_CONFIG_PROCEDURES,
@@ -1270,7 +1270,6 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
private DBObject createDeviceConfigurationMatcherObject(DeviceConfigurationMatcher matcher) {
DBObject matcherObject = new BasicDBObject();
matcherObject.put(FieldNames.CONFIGURATION_MATCHER_TYPE.name(), matcher.getMatcherType().name());
if (matcher instanceof DeviceConfigurationMatcherSingle) {
BasicDBList client = new BasicDBList();
client.add(((DeviceConfigurationMatcherSingle)matcher).getClientIdentifier());
@@ -8,7 +8,6 @@ import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver;
import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher;
import com.sap.sailing.domain.common.MarkType;
import com.sap.sailing.domain.common.PassingInstruction;
import com.sap.sailing.domain.common.configuration.DeviceConfigurationMatcherType;
public interface SharedDomainFactory extends CompetitorFactory {
@@ -100,7 +99,7 @@ public interface SharedDomainFactory extends CompetitorFactory {
/**
* Hm.
*/
DeviceConfigurationMatcher getOrCreateDeviceConfigurationMatcher(DeviceConfigurationMatcherType type, List<String> clientIdentifiers);
DeviceConfigurationMatcher getOrCreateDeviceConfigurationMatcher(List<String> clientIdentifiers);
Mark getExistingMarkByIdAsString(String toStringRepresentationOfID);
@@ -3,35 +3,15 @@ package com.sap.sailing.domain.base.configuration;
import java.io.Serializable;
import com.sap.sailing.domain.base.SharedDomainFactory;
import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMapImpl;
import com.sap.sailing.domain.common.configuration.DeviceConfigurationMatcherType;
import com.sap.sse.common.IsManagedByCache;
/**
* <p>
* Classes implementing this interface are matching {@link DeviceConfigurationIdentifier}s to associate them with a
* {@link DeviceConfiguration}.
* </p>
*
* <p>The rank (see {@link DeviceConfigurationMatcher#getMatchingRank()}) is used as a priority when multiple matchers
* are matching a {@link DeviceConfigurationIdentifier} (see also {@link DeviceConfigurationMapImpl}) (lower wins).</p>
* </p>
*/
public interface DeviceConfigurationMatcher extends IsManagedByCache<SharedDomainFactory>, Serializable {
/**
* Returns the kind of matching used by this matcher.
*
* @return the {@link Type}.
*/
DeviceConfigurationMatcherType getMatcherType();
/**
* Gets the matcher's rank.
*
* @return the rank.
*/
int getMatchingRank();
/**
* Returns <code>true</code> if this {@link DeviceConfigurationMatcher} matches the given
* {@link DeviceConfigurationIdentifier}; otherwise <code>false</code>.
@@ -47,7 +47,7 @@ public class DeviceConfigurationMapImpl extends ConcurrentHashMap<DeviceConfigur
DeviceConfigurationMatcher match = null;
for (Entry<DeviceConfigurationMatcher, DeviceConfiguration> entry : entrySet()) {
if (entry.getKey().matches(key)) {
if (match == null || match.getMatchingRank() > entry.getKey().getMatchingRank()) {
if (match == null) {
match = entry.getKey();
}
}
@@ -6,7 +6,6 @@ import java.util.Arrays;
import com.sap.sailing.domain.base.SharedDomainFactory;
import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier;
import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher;
import com.sap.sailing.domain.common.configuration.DeviceConfigurationMatcherType;
import com.sap.sse.common.IsManagedByCache;
/**
@@ -26,16 +25,6 @@ public class DeviceConfigurationMatcherSingle implements DeviceConfigurationMatc
return this.clientIdentifier.equals(identifier.getClientIdentifier());
}
@Override
public DeviceConfigurationMatcherType getMatcherType() {
return DeviceConfigurationMatcherType.SINGLE;
}
@Override
public int getMatchingRank() {
return getMatcherType().getRank();
}
public String getClientIdentifier() {
return clientIdentifier;
}
@@ -52,7 +41,7 @@ public class DeviceConfigurationMatcherSingle implements DeviceConfigurationMatc
@Override
public IsManagedByCache<SharedDomainFactory> resolve(SharedDomainFactory domainFactory) {
return domainFactory.getOrCreateDeviceConfigurationMatcher(getMatcherType(), Arrays.asList(clientIdentifier));
return domainFactory.getOrCreateDeviceConfigurationMatcher(Arrays.asList(clientIdentifier));
}
}
@@ -31,7 +31,6 @@ import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcher
import com.sap.sailing.domain.common.BoatClassMasterdata;
import com.sap.sailing.domain.common.MarkType;
import com.sap.sailing.domain.common.PassingInstruction;
import com.sap.sailing.domain.common.configuration.DeviceConfigurationMatcherType;
import com.sap.sse.common.Color;
import com.sap.sse.common.Duration;
import com.sap.sse.common.WithID;
@@ -349,9 +348,8 @@ public class SharedDomainFactoryImpl implements SharedDomainFactory {
}
@Override
public DeviceConfigurationMatcher getOrCreateDeviceConfigurationMatcher(DeviceConfigurationMatcherType type,
List<String> clientIdentifiers) {
DeviceConfigurationMatcher probe = createMatcher(type, clientIdentifiers);
public DeviceConfigurationMatcher getOrCreateDeviceConfigurationMatcher(List<String> clientIdentifiers) {
DeviceConfigurationMatcher probe = createMatcher(clientIdentifiers);
DeviceConfigurationMatcher matcher = configurationMatcherCache.get(probe.getMatcherIdentifier());
if (matcher == null) {
configurationMatcherCache.put(probe.getMatcherIdentifier(), probe);
@@ -360,16 +358,8 @@ public class SharedDomainFactoryImpl implements SharedDomainFactory {
return matcher;
}
private DeviceConfigurationMatcher createMatcher(DeviceConfigurationMatcherType type, List<String> clientIdentifiers) {
DeviceConfigurationMatcher matcher = null;
switch (type) {
case SINGLE:
matcher = new DeviceConfigurationMatcherSingle(clientIdentifiers.get(0));
break;
default:
throw new IllegalArgumentException("Unknown matcher type: " + type);
}
return matcher;
private DeviceConfigurationMatcher createMatcher(List<String> clientIdentifiers) {
return new DeviceConfigurationMatcherSingle(clientIdentifiers.get(0));
}
@Override
@@ -6,7 +6,6 @@ import java.util.List;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.configuration.DeviceConfigurationMatcherType;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.DeviceConfigurationMatcherDTO;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
@@ -16,24 +15,18 @@ public class DeviceConfigurationCreateSingleMatcherDialog extends DataEntryDialo
public static class MatcherValidator implements Validator<DeviceConfigurationMatcherDTO> {
private List<DeviceConfigurationMatcherDTO> allMatchers;
private final StringMessages stringMessages;
public MatcherValidator(List<DeviceConfigurationMatcherDTO> allMatchers) {
public MatcherValidator(List<DeviceConfigurationMatcherDTO> allMatchers, StringMessages stringMessages) {
this.allMatchers = allMatchers;
this.stringMessages = stringMessages;
}
@Override
public String getErrorMessage(DeviceConfigurationMatcherDTO valueToValidate) {
for (DeviceConfigurationMatcherDTO existingMatcher : allMatchers) {
if (existingMatcher.type.equals(valueToValidate.type)) {
switch (valueToValidate.type) {
case SINGLE:
if (existingMatcher.clients.containsAll(valueToValidate.clients)) {
return "There is already a configuration for such a matcher.";
}
break;
default:
break;
}
if (existingMatcher.clients.containsAll(valueToValidate.clients)) {
return stringMessages.thereIsAlreadyAConfigurationForThisDevice();
}
}
for (String identifier : valueToValidate.clients) {
@@ -67,7 +60,6 @@ public class DeviceConfigurationCreateSingleMatcherDialog extends DataEntryDialo
@Override
protected DeviceConfigurationMatcherDTO getResult() {
DeviceConfigurationMatcherDTO matcher = new DeviceConfigurationMatcherDTO();
matcher.type = DeviceConfigurationMatcherType.SINGLE;
matcher.clients = Arrays.asList(identifierBox.getValue());
return matcher;
}
@@ -58,12 +58,12 @@ public abstract class DeviceConfigurationListComposite extends Composite {
refreshableConfigurationSelectionModel = new RefreshableMultiSelectionModel<>(new EntityIdentityComparator<DeviceConfigurationMatcherDTO>() {
@Override
public boolean representSameEntity(DeviceConfigurationMatcherDTO dto1, DeviceConfigurationMatcherDTO dto2) {
return Util.equalsWithNull(dto1.type.name(), dto2.type.name());
return Util.equalsWithNull(dto1.clients, dto2.clients);
}
@Override
public int hashCode(DeviceConfigurationMatcherDTO t) {
return t.type.name() == null ? 0 : t.type.name().hashCode();
return t.clients == null ? 0 : t.clients.hashCode();
}
}, configurationsDataProvider);
configurationTable.setSelectionModel(refreshableConfigurationSelectionModel);
@@ -152,7 +152,7 @@ public abstract class DeviceConfigurationPanel extends SimplePanel implements De
private void createConfiguration(final List<DeviceConfigurationMatcherDTO> allMatchers, final DeviceConfigurationDTO configuration) {
getCreateDialog(stringMessages,
new DeviceConfigurationCreateSingleMatcherDialog.MatcherValidator(allMatchers),
new DeviceConfigurationCreateSingleMatcherDialog.MatcherValidator(allMatchers, stringMessages),
new DialogCallback<DeviceConfigurationMatcherDTO>() {
@Override
public void ok(DeviceConfigurationMatcherDTO createdMatcher) {
@@ -191,7 +191,7 @@ public abstract class DeviceConfigurationPanel extends SimplePanel implements De
detailComposite.setConfiguration(null);
detailComposite.setVisible(false);
for (DeviceConfigurationMatcherDTO identifier : refreshableMultiSelectionModel.getSelectedSet()) {
sailingService.removeDeviceConfiguration(identifier.type, identifier.clients, new AsyncCallback<Boolean>() {
sailingService.removeDeviceConfiguration(identifier.clients, new AsyncCallback<Boolean>() {
@Override
public void onSuccess(Boolean result) {
listComposite.refreshTable();
@@ -29,7 +29,6 @@ import com.sap.sailing.domain.common.ScoringSchemeType;
import com.sap.sailing.domain.common.UnableToCloseDeviceMappingException;
import com.sap.sailing.domain.common.WindSource;
import com.sap.sailing.domain.common.abstractlog.NotRevokableException;
import com.sap.sailing.domain.common.configuration.DeviceConfigurationMatcherType;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.FleetDTO;
@@ -436,7 +435,7 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS
DeviceConfigurationMatcherDTO createOrUpdateDeviceConfiguration(DeviceConfigurationMatcherDTO matcherDTO, DeviceConfigurationDTO configurationDTO);
boolean removeDeviceConfiguration(DeviceConfigurationMatcherType type, List<String> clientIds);
boolean removeDeviceConfiguration(List<String> clientIds);
boolean setStartTimeAndProcedure(RaceLogSetStartTimeAndProcedureDTO dto);
@@ -24,7 +24,6 @@ import com.sap.sailing.domain.common.RegattaIdentifier;
import com.sap.sailing.domain.common.RegattaNameAndRaceName;
import com.sap.sailing.domain.common.ScoringSchemeType;
import com.sap.sailing.domain.common.WindSource;
import com.sap.sailing.domain.common.configuration.DeviceConfigurationMatcherType;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.FleetDTO;
@@ -583,8 +582,7 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan
void createOrUpdateDeviceConfiguration(DeviceConfigurationMatcherDTO matcherDTO,
DeviceConfigurationDTO configurationDTO, AsyncCallback<DeviceConfigurationMatcherDTO> callback);
void removeDeviceConfiguration(DeviceConfigurationMatcherType type, List<String> clientIds,
AsyncCallback<Boolean> asyncCallback);
void removeDeviceConfiguration(List<String> clientIds, AsyncCallback<Boolean> asyncCallback);
/**
* Sets the a new start time.
@@ -1472,4 +1472,5 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, c
String createDeviceConfiguration();
String forWhichDeviceShouldConfigurationApply();
String create();
String thereIsAlreadyAConfigurationForThisDevice();
}
@@ -1438,4 +1438,5 @@ matchingDevices=Matching devices
addDevice=Add Device
createDeviceConfiguration=Create Device Configuration
forWhichDeviceShouldConfigurationApply=Specify for which device the new configuration should apply
create=Create
create=Create
thereIsAlreadyAConfigurationForThisDevice=There is already a configuration for this device.
@@ -1429,4 +1429,5 @@ matchingDevices=Passende Geräte
addDevice=Gerät hinzufügen
createDeviceConfiguration=Gerätekonfiguration anlegen
forWhichDeviceShouldConfigurationApply=Für welches Gerät soll die neue Konfiguration gelten?
create=Anlegen
create=Anlegen
thereIsAlreadyAConfigurationForThisDevice=Es gibt bereits eine Konfiguration für dieses Gerät.
@@ -1360,4 +1360,5 @@ matchingDevices=Matching devices
addDevice=Add Device
createDeviceConfiguration=Create Device Configuration
forWhichDeviceShouldConfigurationApply=Specify for which device the new configuration should apply
create=Create
create=Create
thereIsAlreadyAConfigurationForThisDevice=There is already a configuration for this device.
@@ -1375,4 +1375,5 @@ matchingDevices=Matching devices
addDevice=Add Device
createDeviceConfiguration=Create Device Configuration
forWhichDeviceShouldConfigurationApply=Specify for which device the new configuration should apply
create=Create
create=Create
thereIsAlreadyAConfigurationForThisDevice=There is already a configuration for this device.
@@ -177,7 +177,6 @@ import com.sap.sailing.domain.common.Wind;
import com.sap.sailing.domain.common.WindSource;
import com.sap.sailing.domain.common.WindSourceType;
import com.sap.sailing.domain.common.abstractlog.NotRevokableException;
import com.sap.sailing.domain.common.configuration.DeviceConfigurationMatcherType;
import com.sap.sailing.domain.common.dto.BoatClassDTO;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
@@ -4707,7 +4706,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
@Override
public DeviceConfigurationDTO getDeviceConfiguration(DeviceConfigurationMatcherDTO matcherDto) {
DeviceConfigurationMatcher matcher = convertToDeviceConfigurationMatcher(matcherDto.type, matcherDto.clients);
DeviceConfigurationMatcher matcher = convertToDeviceConfigurationMatcher(matcherDto.clients);
DeviceConfiguration configuration = getService().getAllDeviceConfigurations().get(matcher);
if (configuration == null) {
return null;
@@ -4718,15 +4717,15 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
@Override
public DeviceConfigurationMatcherDTO createOrUpdateDeviceConfiguration(DeviceConfigurationMatcherDTO matcherDTO, DeviceConfigurationDTO configurationDTO) {
DeviceConfigurationMatcher matcher = convertToDeviceConfigurationMatcher(matcherDTO.type, matcherDTO.clients);
DeviceConfigurationMatcher matcher = convertToDeviceConfigurationMatcher(matcherDTO.clients);
DeviceConfiguration configuration = convertToDeviceConfiguration(configurationDTO);
getService().createOrUpdateDeviceConfiguration(matcher, configuration);
return convertToDeviceConfigurationMatcherDTO(matcher);
}
@Override
public boolean removeDeviceConfiguration(DeviceConfigurationMatcherType type, List<String> clientIds) {
DeviceConfigurationMatcher matcher = convertToDeviceConfigurationMatcher(type, clientIds);
public boolean removeDeviceConfiguration(List<String> clientIds) {
DeviceConfigurationMatcher matcher = convertToDeviceConfigurationMatcher(clientIds);
getService().removeDeviceConfiguration(matcher);
return true;
}
@@ -4737,14 +4736,12 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
clients.add(((DeviceConfigurationMatcherSingle)matcher).getClientIdentifier());
}
DeviceConfigurationMatcherDTO dto = new DeviceConfigurationMatcherDTO(
matcher.getMatcherType(),
clients,
matcher.getMatchingRank());
clients);
return dto;
}
private DeviceConfigurationMatcher convertToDeviceConfigurationMatcher(DeviceConfigurationMatcherType type, List<String> clientIds) {
return baseDomainFactory.getOrCreateDeviceConfigurationMatcher(type, clientIds);
private DeviceConfigurationMatcher convertToDeviceConfigurationMatcher(List<String> clientIds) {
return baseDomainFactory.getOrCreateDeviceConfigurationMatcher(clientIds);
}
private DeviceConfigurationDTO convertToDeviceConfigurationDTO(DeviceConfiguration configuration) {
@@ -3,22 +3,15 @@ package com.sap.sailing.gwt.ui.shared;
import java.util.List;
import com.google.gwt.user.client.rpc.IsSerializable;
import com.sap.sailing.domain.common.configuration.DeviceConfigurationMatcherType;
public class DeviceConfigurationMatcherDTO implements IsSerializable {
public List<String> clients;
public DeviceConfigurationMatcherType type;
public int rank;
public DeviceConfigurationMatcherDTO() {
}
public DeviceConfigurationMatcherDTO(DeviceConfigurationMatcherType type, List<String> clients, int rank) {
public DeviceConfigurationMatcherDTO(List<String> clients) {
this.clients = clients;
this.type = type;
this.rank = rank;
}
}
@@ -44,7 +44,6 @@ public class StoreAndLoadDeviceConfigurationsTest extends AbstractMongoDBTest {
assertEquals(1, Util.size(configurations));
Entry<DeviceConfigurationMatcher, DeviceConfiguration> entry = configurations.iterator().next();
assertEquals(matcher.getMatcherType(), entry.getKey().getMatcherType());
assertNull(entry.getValue().getAllowedCourseAreaNames());
assertNull(entry.getValue().getByNameCourseDesignerCourseNames());
assertNull(entry.getValue().getResultsMailRecipient());
@@ -64,7 +63,6 @@ public class StoreAndLoadDeviceConfigurationsTest extends AbstractMongoDBTest {
assertEquals(1, Util.size(configurations));
Entry<DeviceConfigurationMatcher, DeviceConfiguration> entry = configurations.iterator().next();
assertEquals(matcher.getMatcherType(), entry.getKey().getMatcherType());
assertNotNull(entry.getValue().getAllowedCourseAreaNames());
assertEquals(2, entry.getValue().getAllowedCourseAreaNames().size());
assertEquals(2, entry.getValue().getByNameCourseDesignerCourseNames().size());
@@ -23,7 +23,6 @@ public class DeviceConfigurationReplicationTest extends AbstractServerReplicatio
Thread.sleep(1000);
Map<DeviceConfigurationMatcher, DeviceConfiguration> configurationMap = replica.getAllDeviceConfigurations();
assertEquals(1, configurationMap.size());
assertEquals(matcher.getMatcherType(), configurationMap.keySet().iterator().next().getMatcherType());
}
@Test