diff --git a/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/SwissTimingAdapterPersistence.java b/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/SwissTimingAdapterPersistence.java index 36556a325f9..6f5a2ae02f0 100644 --- a/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/SwissTimingAdapterPersistence.java +++ b/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/SwissTimingAdapterPersistence.java @@ -5,6 +5,7 @@ import java.util.List; import com.sap.sailing.domain.swisstimingadapter.Race; import com.sap.sailing.domain.swisstimingadapter.RaceSpecificMessageLoader; import com.sap.sailing.domain.swisstimingadapter.SailMasterMessage; +import com.sap.sailing.domain.swisstimingadapter.SwissTimingArchiveConfiguration; import com.sap.sailing.domain.swisstimingadapter.SwissTimingConfiguration; import com.sap.sailing.domain.swisstimingadapter.SwissTimingFactory; import com.sap.sailing.domain.swisstimingadapter.persistence.impl.SwissTimingAdapterPersistenceImpl; @@ -15,6 +16,8 @@ public interface SwissTimingAdapterPersistence extends RaceSpecificMessageLoader SwissTimingAdapterPersistence INSTANCE = new SwissTimingAdapterPersistenceImpl(MongoDBService.INSTANCE, SwissTimingFactory.INSTANCE); Iterable getSwissTimingConfigurations(); + + Iterable getSwissTimingArchiveConfigurations(); /** * Loads all messages received and stored to the DB starting with sequence number firstSequenceNumber. @@ -38,6 +41,8 @@ public interface SwissTimingAdapterPersistence extends RaceSpecificMessageLoader void storeSwissTimingConfiguration(SwissTimingConfiguration swissTimingConfiguration); + void storeSwissTimingArchiveConfiguration(SwissTimingArchiveConfiguration createSwissTimingArchiveConfiguration); + void storeSailMasterMessage(SailMasterMessage message); void storeRace(Race race); diff --git a/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/CollectionNames.java b/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/CollectionNames.java index 23f5b6fb07f..87a86ffe1fb 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/CollectionNames.java +++ b/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/CollectionNames.java @@ -1,6 +1,6 @@ package com.sap.sailing.domain.swisstimingadapter.persistence.impl; public enum CollectionNames { - SWISSTIMING_CONFIGURATIONS, LAST_MESSAGE_COUNT, - RACES_MASTERDATA, RACES_MESSAGES, COMMAND_MESSAGES + SWISSTIMING_CONFIGURATIONS, SWISSTIMING_ARCHIVE_CONFIGURATIONS, LAST_MESSAGE_COUNT, + RACES_MASTERDATA, RACES_MESSAGES, COMMAND_MESSAGES } diff --git a/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/FieldNames.java b/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/FieldNames.java index a6e8c9f74f2..3eed46cfc80 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/FieldNames.java +++ b/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/FieldNames.java @@ -2,7 +2,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_CAN_SEND_REQUESTS, + ST_CONFIG_NAME, ST_CONFIG_HOSTNAME, ST_CONFIG_PORT, ST_CONFIG_CAN_SEND_REQUESTS, ST_ARCHIVE_JSON_URL, // last message count field: LAST_MESSAGE_COUNT, @@ -11,5 +11,5 @@ public enum FieldNames { MESSAGE_SEQUENCE_NUMBER, MESSAGE_CONTENT, MESSAGE_COMMAND, // race specific message and masterdata - RACE_ID, RACE_DESCRIPTION, RACE_STARTTIME, + RACE_ID, RACE_DESCRIPTION, RACE_STARTTIME } diff --git a/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/SwissTimingAdapterPersistenceImpl.java b/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/SwissTimingAdapterPersistenceImpl.java index 9e3e309a191..51c71b30d27 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/SwissTimingAdapterPersistenceImpl.java +++ b/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/SwissTimingAdapterPersistenceImpl.java @@ -16,6 +16,7 @@ import com.sap.sailing.domain.base.impl.MillisecondsTimePoint; import com.sap.sailing.domain.swisstimingadapter.MessageType; import com.sap.sailing.domain.swisstimingadapter.Race; import com.sap.sailing.domain.swisstimingadapter.SailMasterMessage; +import com.sap.sailing.domain.swisstimingadapter.SwissTimingArchiveConfiguration; import com.sap.sailing.domain.swisstimingadapter.SwissTimingConfiguration; import com.sap.sailing.domain.swisstimingadapter.SwissTimingFactory; import com.sap.sailing.domain.swisstimingadapter.persistence.SwissTimingAdapterPersistence; @@ -85,8 +86,8 @@ public class SwissTimingAdapterPersistenceImpl implements SwissTimingAdapterPers } catch (Throwable t) { // something went wrong during DB access; report, then use empty new wind track logger.log(Level.SEVERE, - "Error connecting to MongoDB, unable to load recorded TracTrac configurations. Check MongoDB settings."); - logger.throwing(SwissTimingAdapterPersistenceImpl.class.getName(), "getTracTracConfigurations", t); + "Error connecting to MongoDB, unable to load recorded SwissTiming configurations. Check MongoDB settings."); + logger.throwing(SwissTimingAdapterPersistenceImpl.class.getName(), "getSwissTimingConfigurations", t); } return result; } @@ -98,6 +99,29 @@ public class SwissTimingAdapterPersistenceImpl implements SwissTimingAdapterPers .get(FieldNames.ST_CONFIG_PORT.name()), canSendRequests == null ? false : canSendRequests); } + @Override + public Iterable getSwissTimingArchiveConfigurations() { + List result = new ArrayList(); + try { + DBCollection stConfigs = database.getCollection(CollectionNames.SWISSTIMING_ARCHIVE_CONFIGURATIONS.name()); + for (DBObject o : stConfigs.find()) { + SwissTimingArchiveConfiguration stConfig = loadSwissTimingArchiveConfiguration(o); + result.add(stConfig); + } + Collections.reverse(result); + } catch (Throwable t) { + // something went wrong during DB access; report, then use empty new wind track + logger.log(Level.SEVERE, + "Error connecting to MongoDB, unable to load recorded SwissTiming archive configurations. Check MongoDB settings."); + logger.throwing(SwissTimingAdapterPersistenceImpl.class.getName(), "getSwissTimingArchiveConfigurations", t); + } + return result; + } + + private SwissTimingArchiveConfiguration loadSwissTimingArchiveConfiguration(DBObject object) { + return swissTimingFactory.createSwissTimingArchiveConfiguration((String) object.get(FieldNames.ST_ARCHIVE_JSON_URL.name())); + } + @Override public List loadCommandMessages(int firstSequenceNumber) { DBCollection commandMessages = database.getCollection(CollectionNames.COMMAND_MESSAGES.name()); @@ -192,6 +216,19 @@ public class SwissTimingAdapterPersistenceImpl implements SwissTimingAdapterPers stConfigCollection.insert(result); } + @Override + public void storeSwissTimingArchiveConfiguration( + SwissTimingArchiveConfiguration createSwissTimingArchiveConfiguration) { + DBCollection stArchiveConfigCollection = database.getCollection(CollectionNames.SWISSTIMING_ARCHIVE_CONFIGURATIONS.name()); + stArchiveConfigCollection.ensureIndex(CollectionNames.SWISSTIMING_ARCHIVE_CONFIGURATIONS.name()); + BasicDBObject result = new BasicDBObject(); + result.put(FieldNames.ST_ARCHIVE_JSON_URL.name(), createSwissTimingArchiveConfiguration.getJsonUrl()); + for (DBObject equallyNamedConfig : stArchiveConfigCollection.find(result)) { + stArchiveConfigCollection.remove(equallyNamedConfig); + } + stArchiveConfigCollection.insert(result); + } + @Override public void storeSailMasterMessage(SailMasterMessage message) { // Attention: this method is very time critical as we will receive thousands of messages in a short time 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 new file mode 100755 index 00000000000..c97e8d9ac4b --- /dev/null +++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/SwissTimingArchiveConfiguration.java @@ -0,0 +1,5 @@ +package com.sap.sailing.domain.swisstimingadapter; + +public interface SwissTimingArchiveConfiguration { + String getJsonUrl(); +} 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 7b304274300..7705e87a902 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 @@ -62,4 +62,6 @@ public interface SwissTimingFactory { SailMasterMessage createMessage(String message, Long sequenceNumber); + SwissTimingArchiveConfiguration createSwissTimingArchiveConfiguration(String string); + } 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 new file mode 100755 index 00000000000..fe2c18f3adb --- /dev/null +++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingArchiveConfigurationImpl.java @@ -0,0 +1,17 @@ +package com.sap.sailing.domain.swisstimingadapter.impl; + +import com.sap.sailing.domain.swisstimingadapter.SwissTimingArchiveConfiguration; + +public class SwissTimingArchiveConfigurationImpl implements SwissTimingArchiveConfiguration { + private final String jsonUrl; + + public SwissTimingArchiveConfigurationImpl(String jsonUrl) { + super(); + this.jsonUrl = jsonUrl; + } + + @Override + public String getJsonUrl() { + return jsonUrl; + } +} 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 fa6e34aa37e..82cacd70241 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 @@ -15,6 +15,7 @@ import com.sap.sailing.domain.swisstimingadapter.RaceSpecificMessageLoader; import com.sap.sailing.domain.swisstimingadapter.SailMasterConnector; import com.sap.sailing.domain.swisstimingadapter.SailMasterMessage; import com.sap.sailing.domain.swisstimingadapter.SailMasterTransceiver; +import com.sap.sailing.domain.swisstimingadapter.SwissTimingArchiveConfiguration; import com.sap.sailing.domain.swisstimingadapter.SwissTimingConfiguration; import com.sap.sailing.domain.swisstimingadapter.SwissTimingFactory; import com.sap.sailing.domain.swisstimingadapter.SwissTimingMessageParser; @@ -109,5 +110,8 @@ public class SwissTimingFactoryImpl implements SwissTimingFactory { return new RaceImpl(raceId, description, startTime); } - + @Override + public SwissTimingArchiveConfiguration createSwissTimingArchiveConfiguration(String jsonUrl) { + return new SwissTimingArchiveConfigurationImpl(jsonUrl); + } } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CourseTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CourseTest.java index b8d7c03adfd..02b7b5d87ce 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CourseTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CourseTest.java @@ -62,7 +62,7 @@ public class CourseTest { } @Test - public void testRemoveWaypointToCourseWithOneWaypoint() { + public void testRemoveWaypointFromCourseWithOneWaypoint() { List waypoints = new ArrayList(); waypoints.add(new WaypointImpl(new MarkImpl("Test Mark"))); waypoints.add(new WaypointImpl(new MarkImpl("Second Mark"))); @@ -73,7 +73,7 @@ public class CourseTest { assertEquals(1, Util.size(course.getWaypoints())); assertEquals(0, Util.size(course.getLegs())); } - + @Test public void testRemoveWaypointToEmptyCourse() { Iterable waypoints = Collections.emptyList(); @@ -107,7 +107,31 @@ public class CourseTest { } @Test - public void testRemovetWaypointFromCourseWithThreeWaypoints() { + public void testInsertWaypointAsFirstInCourseWithFormerlyTwoWaypoints() { + List waypoints = new ArrayList(); + final WaypointImpl wp1 = new WaypointImpl(new MarkImpl("Test Mark 1")); + waypoints.add(wp1); + final WaypointImpl wp2 = new WaypointImpl(new MarkImpl("Test Mark 2")); + waypoints.add(wp2); + Course course = new CourseImpl("Test Course", waypoints); + assertEquals(2, Util.size(course.getWaypoints())); + assertEquals(1, Util.size(course.getLegs())); + final WaypointImpl wp0_5 = new WaypointImpl(new MarkImpl("Test Mark .5")); + course.addWaypoint(0, wp0_5); + assertEquals(3, Util.size(course.getWaypoints())); + assertEquals(2, Util.size(course.getLegs())); + assertEquals(wp0_5, course.getLegs().get(0).getFrom()); + assertEquals(wp1, course.getLegs().get(0).getTo()); + assertEquals(wp1, course.getLegs().get(1).getFrom()); + assertEquals(wp2, course.getLegs().get(1).getTo()); + assertTrue(Util.equals(Arrays.asList(new Waypoint[] { wp0_5, wp1, wp2 }), course.getWaypoints())); + assertEquals(0, course.getIndexOfWaypoint(wp1)); + assertEquals(1, course.getIndexOfWaypoint(wp0_5)); + assertEquals(2, course.getIndexOfWaypoint(wp2)); + } + + @Test + public void testRemoveWaypointFromCourseWithThreeWaypoints() { List waypoints = new ArrayList(); final WaypointImpl wp1 = new WaypointImpl(new MarkImpl("Test Mark 1")); waypoints.add(wp1); @@ -121,6 +145,31 @@ public class CourseTest { course.removeWaypoint(1); assertEquals(2, Util.size(course.getWaypoints())); assertEquals(1, Util.size(course.getLegs())); + assertEquals(wp1, course.getLegs().get(0).getFrom()); + assertEquals(wp3, course.getLegs().get(0).getTo()); + assertTrue(Util.equals(Arrays.asList(new Waypoint[] { wp1, wp3 }), course.getWaypoints())); + assertEquals(0, course.getIndexOfWaypoint(wp1)); + assertEquals(-1, course.getIndexOfWaypoint(wp2)); + assertEquals(1, course.getIndexOfWaypoint(wp3)); + } + + @Test + public void testRemoveFirstWaypointFromCourseWithThreeWaypoints() { + List waypoints = new ArrayList(); + final WaypointImpl wp1 = new WaypointImpl(new MarkImpl("Test Mark 1")); + waypoints.add(wp1); + final WaypointImpl wp2 = new WaypointImpl(new MarkImpl("Test Mark 2")); + waypoints.add(wp2); + final WaypointImpl wp3 = new WaypointImpl(new MarkImpl("Test Mark 3")); + waypoints.add(wp3); + Course course = new CourseImpl("Test Course", waypoints); + assertEquals(3, Util.size(course.getWaypoints())); + assertEquals(2, Util.size(course.getLegs())); + course.removeWaypoint(0); + assertEquals(2, Util.size(course.getWaypoints())); + assertEquals(1, Util.size(course.getLegs())); + assertEquals(wp2, course.getLegs().get(0).getFrom()); + assertEquals(wp3, course.getLegs().get(0).getTo()); assertTrue(Util.equals(Arrays.asList(new Waypoint[] { wp1, wp3 }), course.getWaypoints())); assertEquals(0, course.getIndexOfWaypoint(wp1)); assertEquals(-1, course.getIndexOfWaypoint(wp2)); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/CourseImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/CourseImpl.java index 808f45b3a70..baeb0b5acfc 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/CourseImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/CourseImpl.java @@ -130,6 +130,7 @@ public class CourseImpl extends NamedImpl implements Course { } else { legStartWaypointIndex = zeroBasedPosition; } + // FIXME Arghhhhhh... need to update index of start waypoint for all subsequent legs!!! if (waypoints.size() > 1) { legs.add(new LegImpl(this, legStartWaypointIndex)); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegOfCompetitorImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegOfCompetitorImpl.java index 7c0be70f159..ca57eb9c6a0 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegOfCompetitorImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegOfCompetitorImpl.java @@ -370,27 +370,33 @@ public class TrackedLegOfCompetitorImpl implements TrackedLegOfCompetitor { if (leaderPosition != null && currentPosition != null) { result = Distance.NULL; boolean foundCompetitorsLeg = false; - for (Leg leg : getTrackedRace().getRace().getCourse().getLegs()) { - if (leg == getLeg()) { - foundCompetitorsLeg = true; - } - if (foundCompetitorsLeg) { - // if the leaderLeg is null, the leader has already arrived - if (leaderLeg == null || leg != leaderLeg.getLeg()) { - // add distance to next mark - Position nextMarkPosition = getTrackedRace().getApproximatePosition(leg.getTo(), timePoint); - Distance distanceToNextMark = getTrackedRace().getTrackedLeg(getCompetitor(), leg) - .getWindwardDistance(currentPosition, nextMarkPosition, timePoint); - result = new MeterDistance(result.getMeters() + distanceToNextMark.getMeters()); - currentPosition = nextMarkPosition; - } else { - // we're now in the same leg with leader; compute windward distance to leader - result = new MeterDistance(result.getMeters() - + getTrackedRace().getTrackedLeg(getCompetitor(), leg) - .getWindwardDistance(currentPosition, leaderPosition, timePoint).getMeters()); - break; + getTrackedRace().getRace().getCourse().lockForRead(); + try { + for (Leg leg : getTrackedRace().getRace().getCourse().getLegs()) { + if (leg == getLeg()) { + foundCompetitorsLeg = true; + } + if (foundCompetitorsLeg) { + // if the leaderLeg is null, the leader has already arrived + if (leaderLeg == null || leg != leaderLeg.getLeg()) { + // add distance to next mark + Position nextMarkPosition = getTrackedRace().getApproximatePosition(leg.getTo(), timePoint); + Distance distanceToNextMark = getTrackedRace().getTrackedLeg(getCompetitor(), leg) + .getWindwardDistance(currentPosition, nextMarkPosition, timePoint); + result = new MeterDistance(result.getMeters() + distanceToNextMark.getMeters()); + currentPosition = nextMarkPosition; + } else { + // we're now in the same leg with leader; compute windward distance to leader + result = new MeterDistance(result.getMeters() + + getTrackedRace().getTrackedLeg(getCompetitor(), leg) + .getWindwardDistance(currentPosition, leaderPosition, timePoint) + .getMeters()); + break; + } } } + } finally { + getTrackedRace().getRace().getCourse().unlockAfterRead(); } } return result; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index 36b863afb4c..2313149ed84 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -793,7 +793,7 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener { @Override public int getRankDifference(Competitor competitor, Leg leg, TimePoint timePoint) { int previousRank; - if (leg == getRace().getCourse().getLegs().iterator().next()) { + if (leg == getRace().getCourse().getFirstLeg()) { // first leg; report rank difference from 0 previousRank = 0; } else { @@ -1318,6 +1318,7 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener { @Override public void waypointAdded(int zeroBasedIndex, Waypoint waypointThatGotAdded) { + // expecting to hold the course's write lock invalidateMarkPassingTimes(); LockUtil.lockForRead(serializationLock); try { 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 72a5f4041ba..3048306a843 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 @@ -42,6 +42,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.SwissTimingReplayRaceDTO; /** @@ -56,8 +57,9 @@ public class SwissTimingReplayConnectorPanel extends AbstractEventManagementPane private final TextBox filterEventsTextbox; private final ListDataProvider raceList; private final CellTable raceTable; - private final Map connectionHistory; - private final TextBox connectionEdit; + private final Map previousConfigurations; + private final ListBox previousConfigurationsComboBox; + private final TextBox jsonUrlBox; private final Grid grid; private final List availableSwissTimingRaces; private Iterable allRegattas; @@ -67,9 +69,16 @@ public class SwissTimingReplayConnectorPanel extends AbstractEventManagementPane RegattaRefresher regattaRefresher, StringMessages stringMessages) { super(sailingService, regattaRefresher, errorReporter, new RaceSelectionModel(), stringMessages); this.errorReporter = errorReporter; - connectionHistory = new HashMap(); availableSwissTimingRaces = new ArrayList(); - + previousConfigurationsComboBox = new ListBox(); + previousConfigurationsComboBox.addChangeHandler(new ChangeHandler() { + @Override + public void onChange(ChangeEvent event) { + jsonUrlBox.setText(previousConfigurationsComboBox.getItemText(previousConfigurationsComboBox.getSelectedIndex())); + } + }); + previousConfigurations = new HashMap(); + getConnectionHistory(); VerticalPanel mainPanel = new VerticalPanel(); this.setWidget(mainPanel); mainPanel.setWidth("100%"); @@ -84,26 +93,19 @@ public class SwissTimingReplayConnectorPanel extends AbstractEventManagementPane verticalPanel.setWidth("100%"); - grid = new Grid(2, 2); + grid = new Grid(4, 2); verticalPanel.add(grid); verticalPanel.setCellWidth(grid, "100%"); - + + Label jsonUrlLabel = new Label(stringMessages.jsonUrl()); + grid.setWidget(0, 0, jsonUrlLabel); + grid.setWidget(1, 0, previousConfigurationsComboBox); Label connection = new Label(stringMessages.historyOfConnections()); - grid.setWidget(0, 0, connection); - - connectionEdit = new TextBox(); - grid.setWidget(1, 0, connectionEdit); - connectionEdit.addChangeHandler(new ChangeHandler() { - - //TODO: add autocompletion support - @Override - public void onChange(ChangeEvent event) { -// updatePanelFromSelectedStoredConfiguration(); - } - }); - + grid.setWidget(2, 0, connection); + jsonUrlBox = new TextBox(); + grid.setWidget(3, 0, jsonUrlBox); Button btnListRaces = new Button(stringMessages.listRaces()); - grid.setWidget(1, 1, btnListRaces); + grid.setWidget(3, 1, btnListRaces); btnListRaces.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { @@ -276,23 +278,29 @@ public class SwissTimingReplayConnectorPanel extends AbstractEventManagementPane } private void getConnectionHistory() { -// TODO: persist SwissTiming connections -// sailingService.getPreviousTracTracConfigurations(new AsyncCallback>() { -// @Override -// public void onFailure(Throwable caught) { -// errorReporter.reportError("Remote Procedure Call getPreviousConfigurations() - Failure: " -// + caught.getMessage()); -// } -// -// @Override -// public void onSuccess(List result) { -// } -// }); + sailingService.getPreviousSwissTimingArchiveConfigurations(new AsyncCallback>() { + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError("Remote Procedure Call getPreviousConfigurations() - Failure: " + + caught.getMessage()); + } + + @Override + public void onSuccess(List result) { + previousConfigurationsComboBox.clear(); + previousConfigurations.clear(); + for (SwissTimingArchiveConfigurationDTO configEntry : result) { + String name = configEntry.getJsonUrl(); + previousConfigurations.put(name, configEntry); + previousConfigurationsComboBox.addItem(name); + } + } + }); } private void fillRaces(final SailingServiceAsync sailingService) { - final String swissTimingUrl = connectionEdit.getValue(); - sailingService.listSwissTiminigReplayRaces(swissTimingUrl, new AsyncCallback>() { + final String swissTimingJsonUrl = jsonUrlBox.getValue(); + sailingService.listSwissTiminigReplayRaces(swissTimingJsonUrl, new AsyncCallback>() { @Override public void onFailure(Throwable caught) { SwissTimingReplayConnectorPanel.this.errorReporter.reportError("Error trying to list SwissTiming races: " @@ -307,26 +315,23 @@ public class SwissTimingReplayConnectorPanel extends AbstractEventManagementPane raceList.getList().addAll(availableSwissTimingRaces); filterEventsTextbox.setText(null); // store a successful configuration in the database for later retrieval - //TODO: adapt to SwissTiming connection persistence -// sailingService.storeTracTracConfiguration(races.getA(), jsonURL, liveDataURI, storedDataURI, -// new AsyncCallback() { -// @Override -// public void onFailure(Throwable caught) { -// errorReporter.reportError("Exception trying to store configuration in DB: " -// + caught.getMessage()); -// } -// -// @Override -// public void onSuccess(Void voidResult) { -// // refresh list of previous configurations -// TracTracConfigurationDTO ttConfig = new TracTracConfigurationDTO(races.getA(), -// jsonURL, liveDataURI, storedDataURI); -// if (connectionHistory.put(ttConfig.name, ttConfig) == null) { -// previousConfigurationsComboBox.addItem(ttConfig.name); -// } -// } -// }); -// + sailingService.storeSwissTimingArchiveConfiguration(swissTimingJsonUrl, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError("Exception trying to store configuration in DB: " + + caught.getMessage()); + } + + @Override + public void onSuccess(Void voidResult) { + // refresh list of previous configurations + SwissTimingArchiveConfigurationDTO stConfig = new SwissTimingArchiveConfigurationDTO(swissTimingJsonUrl); + 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 bb16afc15e5..b5ee119f644 100644 --- 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 @@ -40,6 +40,7 @@ import com.sap.sailing.gwt.ui.shared.RegattaScoreCorrectionDTO; import com.sap.sailing.gwt.ui.shared.ReplicationStateDTO; import com.sap.sailing.gwt.ui.shared.ScoreCorrectionProviderDTO; import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO; +import com.sap.sailing.gwt.ui.shared.SwissTimingArchiveConfigurationDTO; import com.sap.sailing.gwt.ui.shared.SwissTimingReplayRaceDTO; import com.sap.sailing.gwt.ui.shared.SwissTimingConfigurationDTO; import com.sap.sailing.gwt.ui.shared.SwissTimingRaceRecordDTO; @@ -276,4 +277,8 @@ public interface SailingService extends RemoteService { List>> getRankedCompetitorsFromBestToWorstAfterEachRaceColumn(String leaderboardName, Date date) throws NoWindException; List getOverallLeaderboardNamesContaining(String leaderboardName); + + List getPreviousSwissTimingArchiveConfigurations(); + + void storeSwissTimingArchiveConfiguration(String swissTimingUrl); } 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 143fbc444e6..5355472b702 100644 --- 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 @@ -18,6 +18,7 @@ import com.sap.sailing.domain.common.ScoringSchemeType; import com.sap.sailing.domain.common.WindSource; import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.domain.common.impl.Util.Triple; +import com.sap.sailing.gwt.ui.shared.SwissTimingArchiveConfigurationDTO; import com.sap.sailing.gwt.ui.shared.BulkScoreCorrectionDTO; import com.sap.sailing.gwt.ui.shared.CompetitorDTO; import com.sap.sailing.gwt.ui.shared.ControlPointDTO; @@ -435,4 +436,9 @@ public interface SailingServiceAsync { * leaderboard is found. */ void getOverallLeaderboardNamesContaining(String leaderboardName, AsyncCallback> asyncCallback); + + void getPreviousSwissTimingArchiveConfigurations( + AsyncCallback> asyncCallback); + + void storeSwissTimingArchiveConfiguration(String swissTimingUrl, AsyncCallback asyncCallback); } 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 ece1f5b34d3..5660ec7b7c9 100755 --- 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 @@ -101,6 +101,7 @@ import com.sap.sailing.domain.persistence.DomainObjectFactory; import com.sap.sailing.domain.persistence.MongoFactory; import com.sap.sailing.domain.persistence.MongoObjectFactory; import com.sap.sailing.domain.persistence.MongoWindStoreFactory; +import com.sap.sailing.domain.swisstimingadapter.SwissTimingArchiveConfiguration; import com.sap.sailing.domain.swisstimingadapter.SwissTimingConfiguration; import com.sap.sailing.domain.swisstimingadapter.SwissTimingFactory; import com.sap.sailing.domain.swisstimingadapter.persistence.SwissTimingAdapterPersistence; @@ -174,6 +175,7 @@ import com.sap.sailing.gwt.ui.shared.ScoreCorrectionProviderDTO; import com.sap.sailing.gwt.ui.shared.SeriesDTO; import com.sap.sailing.gwt.ui.shared.SpeedWithBearingDTO; import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO; +import com.sap.sailing.gwt.ui.shared.SwissTimingArchiveConfigurationDTO; import com.sap.sailing.gwt.ui.shared.SwissTimingConfigurationDTO; import com.sap.sailing.gwt.ui.shared.SwissTimingRaceRecordDTO; import com.sap.sailing.gwt.ui.shared.SwissTimingReplayRaceDTO; @@ -2975,4 +2977,20 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S } return result; } + + @Override + public List getPreviousSwissTimingArchiveConfigurations() { + Iterable configs = swissTimingAdapterPersistence.getSwissTimingArchiveConfigurations(); + List result = new ArrayList(); + for (SwissTimingArchiveConfiguration stArchiveConfig : configs) { + result.add(new SwissTimingArchiveConfigurationDTO(stArchiveConfig.getJsonUrl())); + } + return result; + } + + @Override + public void storeSwissTimingArchiveConfiguration(String swissTimingJsonUrl) { + swissTimingAdapterPersistence.storeSwissTimingArchiveConfiguration(swissTimingFactory.createSwissTimingArchiveConfiguration( + swissTimingJsonUrl)); + } } \ No newline at end of file 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 new file mode 100755 index 00000000000..50f2cf9f357 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/SwissTimingArchiveConfigurationDTO.java @@ -0,0 +1,16 @@ +package com.sap.sailing.gwt.ui.shared; + +import com.google.gwt.user.client.rpc.IsSerializable; + +public class SwissTimingArchiveConfigurationDTO implements IsSerializable { + private String jsonUrl; + + public SwissTimingArchiveConfigurationDTO(String jsonUrl) { + super(); + this.jsonUrl = jsonUrl; + } + + public String getJsonUrl() { + return jsonUrl; + } +}