# added server code to create, edit and delete device configurations

This commit is contained in:
Lukas Niemeier committed 2013-10-23 16:02:09 +02:00
1 parent 8a34842d14
commit 313085c456
37 files changed
+1335 -53

No files matched your search

@@ -26,8 +26,9 @@ import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.RegattaRegistry;
import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.base.DeviceConfiguration;
import com.sap.sailing.domain.base.DeviceConfigurationIdentifier;
import com.sap.sailing.domain.base.configuration.DeviceConfiguration;
import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier;
import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher;
import com.sap.sailing.domain.common.RaceFetcher;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.RegattaFetcher;
@@ -555,10 +556,29 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch
void setPersistentRegattaForRaceIDs(Regatta regatta, Iterable<String> raceIdStrings, boolean override);
/**
* Returns a tablet's configuration.
* Returns a mobile device's configuration.
* @param identifier of the client (may include event)
* @return the {@link DeviceConfiguration}
*/
DeviceConfiguration getDeviceConfiguration(DeviceConfigurationIdentifier identifier);
/**
* Adds a device configuration.
* @param matcher defining for which the configuration applies.
* @param configuration of the device.
*/
void addDeviceConfiguration(DeviceConfigurationMatcher matcher, DeviceConfiguration configuration);
/**
* Removes a configuration by its matching object.
* @param matcher
*/
void removeDeviceConfiguration(DeviceConfigurationMatcher matcher);
/**
* Returns all configurations and their matching objects.
* @return the {@link DeviceConfiguration}s.
*/
Map<DeviceConfigurationMatcher, DeviceConfiguration> getAllDeviceConfigurations();
}
@@ -34,8 +34,6 @@ import java.util.logging.Logger;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.ControlPoint;
import com.sap.sailing.domain.base.CourseArea;
import com.sap.sailing.domain.base.DeviceConfiguration;
import com.sap.sailing.domain.base.DeviceConfigurationIdentifier;
import com.sap.sailing.domain.base.Event;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.Mark;
@@ -47,7 +45,14 @@ import com.sap.sailing.domain.base.RegattaListener;
import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.base.Sideline;
import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.base.impl.DeviceConfigurationImpl;
import com.sap.sailing.domain.base.configuration.DeviceConfiguration;
import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier;
import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher;
import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationImpl;
import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMapImpl;
import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcherAny;
import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcherMulti;
import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcherSingle;
import com.sap.sailing.domain.base.impl.EventImpl;
import com.sap.sailing.domain.base.impl.RegattaImpl;
import com.sap.sailing.domain.common.LeaderboardNameConstants;
@@ -191,7 +196,7 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
/**
* Leaderboards managed by this racing event service
*/
*/
private final ConcurrentHashMap<String, Leaderboard> leaderboardsByName;
private final ConcurrentHashMap<String, LeaderboardGroup> leaderboardGroupsByName;
@@ -229,6 +234,8 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
private final MediaDB mediaDB;
private final MediaLibrary mediaLibrary;
protected final DeviceConfigurationMapImpl configurationMap;
public RacingEventServiceImpl() {
this(MongoFactory.INSTANCE.getDefaultDomainObjectFactory(), MongoFactory.INSTANCE
@@ -272,6 +279,7 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
this.raceLogScoringReplicator = new RaceLogScoringReplicator(this);
this.mediaDB = mediaDb;
this.mediaLibrary = new MediaLibrary();
this.configurationMap = new DeviceConfigurationMapImpl();
// Add one default leaderboard that aggregates all races currently tracked by this service.
// This is more for debugging purposes than for anything else.
@@ -282,6 +290,7 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
loadRaceIDToRegattaAssociations();
loadStoredLeaderboardsAndGroups();
loadMediaLibary();
loadStoredDeviceConfigurations();
}
public RacingEventServiceImpl(MongoDBService mongoDBService) {
@@ -347,6 +356,30 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
mediaTrackAdded(mediaTrack);
}
}
private void loadStoredDeviceConfigurations() {
DeviceConfigurationMatcher anyMatcher = DeviceConfigurationMatcherAny.INSTANCE;
DeviceConfigurationImpl configuration1 = new DeviceConfigurationImpl();
configuration1.setAllowedCourseAreaNames(Arrays.asList("Alpha", "Beta", "Stadium"));
configuration1.setMaximumRoundsForCourse(3);
configuration1.setResultsMailRecipient("lukas.niemeier@sap.com");
DeviceConfigurationMatcher multiIdentifier = new DeviceConfigurationMatcherMulti(Arrays.asList("2", "3"));
DeviceConfigurationImpl configuration2 = new DeviceConfigurationImpl();
configuration2.setAllowedCourseAreaNames(Arrays.asList("GAMMA"));
configuration2.setMaximumRoundsForCourse(3);
DeviceConfigurationMatcher identifier = new DeviceConfigurationMatcherSingle("3");
DeviceConfigurationImpl configuration3 = new DeviceConfigurationImpl();
configuration3.setAllowedCourseAreaNames(Arrays.asList("Timo"));
configuration3.setMaximumRoundsForCourse(1);
synchronized (configurationMap) {
configurationMap.put(anyMatcher, configuration1);
configurationMap.put(identifier, configuration3);
configurationMap.put(multiIdentifier, configuration2);
}
}
@Override
public void addLeaderboard(Leaderboard leaderboard) {
@@ -1769,7 +1802,14 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
for (MediaTrack lg : mediaLibrary.allTracks()) {
logoutput.append(String.format("%3s\n", lg.toString()));
}
logger.info("Serializing configuration map...");
oos.writeObject(configurationMap);
logoutput.append("Serialized " + configurationMap.size() + " configuration entries\n");
for (DeviceConfigurationMatcher matcher : configurationMap.keySet()) {
logoutput.append(String.format("%3s\n", matcher.toString()));
}
logger.info(logoutput.toString());
}
@@ -1851,6 +1891,12 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
for (MediaTrack mediatrack : mediaLibrary.allTracks()) {
logoutput.append(String.format("%3s\n", mediatrack.toString()));
}
configurationMap.putAll((DeviceConfigurationMapImpl) ois.readObject());
logoutput.append("Received " + configurationMap.size() + " NEW configuration entries\n");
for (DeviceConfigurationMatcher matcher : configurationMap.keySet()) {
logoutput.append(String.format("%3s\n", matcher.toString()));
}
logger.info(logoutput.toString());
logger.info("Done with initial replication on " + this);
@@ -2098,11 +2144,26 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
@Override
public DeviceConfiguration getDeviceConfiguration(DeviceConfigurationIdentifier identifier) {
DeviceConfigurationImpl configuration = new DeviceConfigurationImpl();
configuration.setAllowedCourseAreaNames(Arrays.asList("Alpha", "Beta", "Stadium"));
configuration.setMaximumRoundsForCourse(3);
configuration.setResultsMailRecipient("lukas.niemeier@sap.com");
return configuration;
return configurationMap.getByMatch(identifier);
}
@Override
public void addDeviceConfiguration(DeviceConfigurationMatcher matcher, DeviceConfiguration configuration) {
synchronized (configurationMap) {
configurationMap.put(matcher, configuration);
}
}
@Override
public void removeDeviceConfiguration(DeviceConfigurationMatcher matcher) {
synchronized (configurationMap) {
configurationMap.remove(matcher);
}
}
@Override
public Map<DeviceConfigurationMatcher, DeviceConfiguration> getAllDeviceConfigurations() {
return new HashMap<DeviceConfigurationMatcher, DeviceConfiguration>(configurationMap);
}
}