From 61db00f2c6dd8b97779fa11d62531109b7816f6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Wed, 28 Oct 2015 14:28:53 +0100 Subject: [PATCH 001/165] Remove Admin UI Features for RaceLogDeviceMapping and deprecate Mark and Competitor Mapping related events --- .../abstractlog/race/RaceLogEventFactory.java | 4 + ...ceLogCloseOpenEndedDeviceMappingEvent.java | 1 + .../race/tracking/RaceLogDefineMarkEvent.java | 1 + .../impl/RaceLogDefinedMarkFinder.java | 1 + .../RaceLogOpenEndedDeviceMappingCloser.java | 1 + ...gCloseOpenEndedDeviceMappingEventImpl.java | 1 + .../impl/RaceLogDefineMarkEventImpl.java | 1 + .../RaceLogAddDeviceMappingDialog.java | 73 -------- .../RaceLogTrackingDeviceMappingsDialog.java | 163 ------------------ ...ckingEventManagementRaceImagesBarCell.java | 2 - ...martphoneTrackingEventManagementPanel.java | 11 -- 11 files changed, 10 insertions(+), 249 deletions(-) delete mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogAddDeviceMappingDialog.java delete mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogTrackingDeviceMappingsDialog.java diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventFactory.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventFactory.java index dd6c9169caf..88a4b65c599 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventFactory.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventFactory.java @@ -102,9 +102,11 @@ public interface RaceLogEventFactory { RaceLogWindFixEvent createWindFixEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, Serializable id, List competitors, int passId, Wind wind, boolean isMagnetic); + @Deprecated //bug2851 RaceLogDeviceCompetitorMappingEvent createDeviceCompetitorMappingEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, DeviceIdentifier device, Competitor mappedTo, int passId, TimePoint from, TimePoint to); + @Deprecated //bug2851 RaceLogDeviceMarkMappingEvent createDeviceMarkMappingEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, DeviceIdentifier device, Mark mappedTo, int passId, TimePoint from, TimePoint to); @@ -117,8 +119,10 @@ public interface RaceLogEventFactory { RaceLogRegisterCompetitorEvent createRegisterCompetitorEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, Competitor competitor); + @Deprecated //bug2851 RaceLogDefineMarkEvent createDefineMarkEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, Mark mark); + @Deprecated //bug2851 RaceLogCloseOpenEndedDeviceMappingEvent createCloseOpenEndedDeviceMappingEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, Serializable deviceMappingEventId, TimePoint closingTimePoint); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogCloseOpenEndedDeviceMappingEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogCloseOpenEndedDeviceMappingEvent.java index 25becd6a796..feb33021bd5 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogCloseOpenEndedDeviceMappingEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogCloseOpenEndedDeviceMappingEvent.java @@ -4,6 +4,7 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; import com.sap.sailing.domain.abstractlog.shared.events.CloseOpenEndedDeviceMappingEvent; +@Deprecated //bug2851 public interface RaceLogCloseOpenEndedDeviceMappingEvent extends RaceLogEvent, CloseOpenEndedDeviceMappingEvent { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogDefineMarkEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogDefineMarkEvent.java index db38a837a84..adbfb6912d6 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogDefineMarkEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogDefineMarkEvent.java @@ -10,6 +10,7 @@ import com.sap.sailing.domain.base.Mark; * @author Fredrik Teschke * */ +@Deprecated //see bug 2851 public interface RaceLogDefineMarkEvent extends RaceLogEvent, Revokable { Mark getMark(); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceLogDefinedMarkFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceLogDefinedMarkFinder.java index 23859c29e34..2a717a1ca0c 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceLogDefinedMarkFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceLogDefinedMarkFinder.java @@ -12,6 +12,7 @@ import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogAnalyzer; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent; import com.sap.sailing.domain.base.Mark; +@Deprecated //bug2851 public class RaceLogDefinedMarkFinder extends RaceLogAnalyzer> { public RaceLogDefinedMarkFinder(RaceLog raceLog) { super(raceLog); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceLogOpenEndedDeviceMappingCloser.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceLogOpenEndedDeviceMappingCloser.java index f7183da288f..97b3032a0ef 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceLogOpenEndedDeviceMappingCloser.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceLogOpenEndedDeviceMappingCloser.java @@ -12,6 +12,7 @@ import com.sap.sailing.domain.abstractlog.shared.analyzing.OpenEndedDeviceMappin import com.sap.sailing.domain.racelogtracking.DeviceMapping; import com.sap.sse.common.TimePoint; +@Deprecated //bug2851 public class RaceLogOpenEndedDeviceMappingCloser extends OpenEndedDeviceMappingCloser { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogCloseOpenEndedDeviceMappingEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogCloseOpenEndedDeviceMappingEventImpl.java index fbd1631f9d6..288b0c09152 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogCloseOpenEndedDeviceMappingEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogCloseOpenEndedDeviceMappingEventImpl.java @@ -12,6 +12,7 @@ import com.sap.sailing.domain.abstractlog.shared.events.impl.BaseCloseOpenEndedD import com.sap.sailing.domain.base.Competitor; import com.sap.sse.common.TimePoint; +@Deprecated //bug2851 public class RaceLogCloseOpenEndedDeviceMappingEventImpl extends BaseCloseOpenEndedDeviceMappingEventImpl implements RaceLogCloseOpenEndedDeviceMappingEvent { private static final long serialVersionUID = -5114645637316367845L; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogDefineMarkEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogDefineMarkEventImpl.java index b60ce4535c5..6b5686eb106 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogDefineMarkEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogDefineMarkEventImpl.java @@ -11,6 +11,7 @@ import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Mark; import com.sap.sse.common.TimePoint; +@Deprecated //see bug2851 public class RaceLogDefineMarkEventImpl extends RaceLogEventImpl implements RaceLogDefineMarkEvent { private static final long serialVersionUID = 277007856878002208L; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogAddDeviceMappingDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogAddDeviceMappingDialog.java deleted file mode 100644 index 44dc0cee952..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogAddDeviceMappingDialog.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.sap.sailing.gwt.ui.adminconsole; - -import com.sap.sailing.domain.common.racelog.tracking.DeviceMappingConstants; -import com.sap.sailing.domain.common.racelog.tracking.QRCodeURLCreationException; -import com.sap.sailing.gwt.ui.client.GwtUrlHelper; -import com.sap.sailing.gwt.ui.client.SailingServiceAsync; -import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sailing.gwt.ui.shared.DeviceIdentifierDTO; -import com.sap.sailing.gwt.ui.shared.DeviceMappingDTO; -import com.sap.sse.gwt.client.ErrorReporter; - -public class RaceLogAddDeviceMappingDialog extends AbstractLogAddDeviceMappingDialog{ - private final String leaderboardName; - private final String fleetName; - private final String raceColumnName; - - public RaceLogAddDeviceMappingDialog(SailingServiceAsync sailingService, final ErrorReporter errorReporter, - final StringMessages stringMessages, final String leaderboardName, final String raceColumnName, - final String fleetName, DialogCallback callback, final DeviceMappingDTO mapping) { - super(sailingService, errorReporter, stringMessages, callback, mapping); - this.leaderboardName = leaderboardName; - this.fleetName = fleetName; - this.raceColumnName = raceColumnName; - - loadCompetitorsAndMarks(); - } - - @Override - protected DeviceMappingDTO getResult() { - String deviceTypeS = deviceType.getSelectedIndex() < 0 ? null : deviceType.getValue(deviceType - .getSelectedIndex()); - DeviceIdentifierDTO deviceIdentifier = new DeviceIdentifierDTO(deviceTypeS, deviceId.getValue()); - return new DeviceMappingDTO(deviceIdentifier, from.getValue(), to.getValue(), selectedItem, null); - } - - @Override - protected DeviceMappingQRCodeWidget setupQRCodeWidget() { - return new DeviceMappingQRCodeWidget(stringMessages, new DeviceMappingQRCodeWidget.URLFactory() { - @SuppressWarnings("deprecation") - @Override - public String createURL(String baseUrlWithoutTrailingSlash, String mappedItemType, String mappedItemId) - throws QRCodeURLCreationException { - if (from.getValue() == null && to.getValue() == null) { - throw new QRCodeURLCreationException(stringMessages.atMostOneEndOfTheTimeRangeMayBeOpen()); - } - - Long fromMillis = null; - if (from.getValue() != null){ - fromMillis = from.getValue().getTime(); - } - - Long toMillis = null; - if (to.getValue() != null) { - toMillis = to.getValue().getTime(); - } - - return DeviceMappingConstants.getDeviceMappingForRaceLogUrl(baseUrlWithoutTrailingSlash, - leaderboardName, raceColumnName, fleetName, mappedItemType, mappedItemId, fromMillis, toMillis, - GwtUrlHelper.INSTANCE); - } - }); - } - - @Override - protected void loadCompetitorsAndMarks() { - sailingService.getCompetitorRegistrationsFromLogHierarchy(leaderboardName, - itemSelectionPanel.getSetCompetitorsCallback()); - - sailingService.getMarksInRaceLog(leaderboardName, raceColumnName, fleetName, - itemSelectionPanel.getSetMarksCallback()); - } - -} \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogTrackingDeviceMappingsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogTrackingDeviceMappingsDialog.java deleted file mode 100644 index a9fb9d3246b..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogTrackingDeviceMappingsDialog.java +++ /dev/null @@ -1,163 +0,0 @@ -package com.sap.sailing.gwt.ui.adminconsole; - -import java.util.Collection; -import java.util.List; - -import com.google.gwt.cell.client.FieldUpdater; -import com.google.gwt.user.client.rpc.AsyncCallback; -import com.sap.sailing.gwt.ui.client.SailingServiceAsync; -import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sailing.gwt.ui.shared.DeviceMappingDTO; -import com.sap.sse.gwt.client.ErrorReporter; -import com.sap.sse.gwt.client.dialog.DataEntryDialog; - -public class RaceLogTrackingDeviceMappingsDialog extends AbstractLogTrackingDeviceMappingsDialog { - protected String leaderboardName; - protected String raceColumnName; - protected String fleetName; - - public RaceLogTrackingDeviceMappingsDialog(final SailingServiceAsync sailingService, - final StringMessages stringMessages, final ErrorReporter errorReporter, final String leaderboardName, - final String raceColumnName, final String fleetName, DialogCallback callback) { - - super(sailingService, stringMessages, errorReporter, callback); - - this.leaderboardName = leaderboardName; - this.raceColumnName = raceColumnName; - this.fleetName = fleetName; - - refresh(); - } - - @Override - protected void refresh() { - sailingService.getDeviceMappingsFromLogHierarchy(leaderboardName, raceColumnName, fleetName, - new AsyncCallback>() { - @Override - public void onSuccess(List result) { - mappings = result; - - updateChart(); - deviceMappingTable.refresh(mappings); - } - - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError("Could not load mappings for marks: " + caught.getMessage()); - } - }); - } - - @Override - protected void showAddMappingDialog(DeviceMappingDTO mapping) { - new RaceLogAddDeviceMappingDialog(sailingService, errorReporter, stringMessages, leaderboardName, - raceColumnName, fleetName, new DataEntryDialog.DialogCallback() { - @Override - public void ok(final DeviceMappingDTO mapping) { - sailingService.addDeviceMappingToRaceLog(leaderboardName, raceColumnName, fleetName, mapping, - new AsyncCallback() { - @Override - public void onSuccess(Void result) { - refresh(); - } - - @Override - public void onFailure(Throwable caught) { - showAddMappingDialog(mapping); - errorReporter.reportError("Could not add mapping: " + caught.getMessage()); - } - }); - } - - @Override - public void cancel() { - refresh(); - } - }, mapping).show(); - } - - @Override - protected void importFixes() { - new RaceLogImportFixesAndAddMappingsDialog(sailingService, errorReporter, stringMessages, leaderboardName, - raceColumnName, fleetName, new DataEntryDialog.DialogCallback>() { - - @Override - public void ok(Collection editedObject) { - for (DeviceMappingDTO mapping : editedObject) { - sailingService.addDeviceMappingToRaceLog(leaderboardName, raceColumnName, fleetName, - mapping, new AsyncCallback() { - @Override - public void onSuccess(Void result) { - refresh(); - } - - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError(caught.getMessage()); - } - }); - } - } - - @Override - public void cancel() { - } - }).show(); - } - - @Override - protected FieldUpdater getActionColFieldUpdater() { - - return new FieldUpdater() { - - @Override - public void update(int index, final DeviceMappingDTO dto, String value) { - if (RaceLogTrackingDeviceMappingsImagesBarCell.ACTION_CLOSE.equals(value)) { - new SetTimePointDialog(stringMessages, stringMessages.setClosingTimePoint(), - new DataEntryDialog.DialogCallback() { - @Override - public void ok(java.util.Date editedObject) { - sailingService.closeOpenEndedDeviceMapping(leaderboardName, raceColumnName, - fleetName, dto, editedObject, new AsyncCallback() { - @Override - public void onSuccess(Void result) { - refresh(); - } - - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError("Could not close open ended mapping: " - + caught.getMessage()); - } - }); - } - - @Override - public void cancel() { - } - }).show(); - } else if (RaceLogTrackingDeviceMappingsImagesBarCell.ACTION_REMOVE.equals(value)) { - sailingService.revokeRaceAndRegattaLogEvents(leaderboardName, raceColumnName, fleetName, - dto.originalRaceLogEventIds, new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError("Could not remove mappings: " + caught.getMessage()); - } - - @Override - public void onSuccess(Void result) { - refresh(); - } - - }); - } - - } - }; - } - - @Override - protected Void getResult() { - return null; - } -} \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogTrackingEventManagementRaceImagesBarCell.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogTrackingEventManagementRaceImagesBarCell.java index 9a2f6d69373..8e5a28b8b71 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogTrackingEventManagementRaceImagesBarCell.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogTrackingEventManagementRaceImagesBarCell.java @@ -13,7 +13,6 @@ public class RaceLogTrackingEventManagementRaceImagesBarCell extends ImagesBarCe public final static String ACTION_REMOVE_DENOTATION = "ACTION_REMOVE_DENOTATION"; public final static String ACTION_COMPETITOR_REGISTRATIONS = "ACTION_COMPETITOR_REGISTRATIONS"; public final static String ACTION_DEFINE_COURSE = "ACTION_DEFINE_COURSE"; - public final static String ACTION_MAP_DEVICES = "ACTION_MAP_DEVICES"; public final static String ACTION_COPY = "ACTION_COPY"; public final static String ACTION_EDIT = "ACTION_EDIT"; public final static String ACTION_REFRESH_RACELOG = "ACTION_REFRESH_RACE_LOG"; @@ -40,7 +39,6 @@ public class RaceLogTrackingEventManagementRaceImagesBarCell extends ImagesBarCe result.add(new ImageSpec(ACTION_REMOVE_DENOTATION, stringMessages.removeDenotation(), makeImagePrototype(resources.unDenoteForRaceLogTracking()))); result.add(new ImageSpec(ACTION_COMPETITOR_REGISTRATIONS, stringMessages.competitorRegistrations(), makeImagePrototype(resources.competitorRegistrations()))); result.add(new ImageSpec(ACTION_DEFINE_COURSE, stringMessages.defineCourse(), makeImagePrototype(resources.defineCourse()))); - result.add(new ImageSpec(ACTION_MAP_DEVICES, stringMessages.mapDevices(), makeImagePrototype(resources.mapDevices()))); result.add(new ImageSpec(ACTION_COPY, stringMessages.copyCourseAndCompetitors(), makeImagePrototype(resources.copy()))); } result.add(new ImageSpec(ACTION_EDIT, stringMessages.actionEdit(), makeImagePrototype(resources.editIcon()))); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SmartphoneTrackingEventManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SmartphoneTrackingEventManagementPanel.java index d7c2c30cfa3..4d876867c4f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SmartphoneTrackingEventManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SmartphoneTrackingEventManagementPanel.java @@ -250,17 +250,6 @@ public class SmartphoneTrackingEventManagementPanel extends AbstractLeaderboardC }); } }).show(); - - } else if (RaceLogTrackingEventManagementRaceImagesBarCell.ACTION_MAP_DEVICES.equals(value)) { - new RaceLogTrackingDeviceMappingsDialog(sailingService, stringMessages, errorReporter, leaderboardName, raceColumnName, fleetName, new DialogCallback() { - @Override - public void ok(Void editedObject) { - } - - @Override - public void cancel() { - } - }).show(); } else if (RaceLogTrackingEventManagementRaceImagesBarCell.ACTION_COPY.equals(value)) { List races = new ArrayList<>(raceColumnTable.getDataProvider().getList()); From 48070e14d8b56850b5e20b4e174cb9785c9d96ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Wed, 28 Oct 2015 15:49:44 +0100 Subject: [PATCH 002/165] Adds RegattaLogDefineMarkEvent --- .../domain/persistence/impl/FieldNames.java | 2 +- .../impl/MongoObjectFactoryImpl.java | 8 +++ .../impl/MongoRegattaLogStoreVisitor.java | 6 ++ .../impl/RaceLogRaceTracker.java | 11 +++- .../race/tracking/RaceLogDefineMarkEvent.java | 4 +- .../impl/RaceLogDefineMarkEventImpl.java | 25 +++++--- .../regatta/RegattaLogEventVisitor.java | 3 + .../events/RegattaLogDefineMarkEvent.java | 15 +++++ .../impl/RegattaLogDefineMarkEventImpl.java | 25 ++++++++ .../impl/BaseRegattaLogEventVisitor.java | 4 ++ .../regatta/impl/RegattaLogEventListener.java | 6 ++ .../shared/events/DefineMarkEvent.java | 9 +++ .../impl/AbstractDefineMarkEventImpl.java | 33 ++++++++++ .../RaceLogCourseManagementWidget.java | 4 +- ...aceLogImportFixesAndAddMappingsDialog.java | 62 ------------------- .../RegattaLogAddDeviceMappingDialog.java | 5 +- .../sailing/gwt/ui/client/SailingService.java | 8 +-- .../gwt/ui/client/SailingServiceAsync.java | 10 +-- .../gwt/ui/server/SailingServiceImpl.java | 47 ++------------ 19 files changed, 152 insertions(+), 135 deletions(-) create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogDefineMarkEvent.java create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDefineMarkEventImpl.java create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/DefineMarkEvent.java create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/impl/AbstractDefineMarkEventImpl.java delete mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogImportFixesAndAddMappingsDialog.java diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java index 4f9412e8a08..cf34f4c719e 100755 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java @@ -107,7 +107,7 @@ public enum FieldNames { REGATTA_LOG_IDENTIFIER_TYPE, REGATTA_LOG_IDENTIFIER_NAME, REGATTA_LOG_EVENT_ID, REGATTA_LOG_EVENT_CREATED_AT, REGATTA_LOG_EVENT_AUTHOR_NAME, REGATTA_LOG_EVENT_AUTHOR_PRIORITY, REGATTA_LOG_EVENT_CLASS, REGATTA_LOG_REVOKED_EVENT_ID, REGATTA_LOG_REVOKED_EVENT_TYPE, REGATTA_LOG_REVOKED_EVENT_SHORT_INFO, REGATTA_LOG_REVOKED_REASON, REGATTA_LOG_COMPETITOR_ID, REGATTA_LOG_DEVICE_MAPPING_EVENT_ID, REGATTA_LOG_CLOSING_TIMEPOINT, - REGATTA_LOG_FROM, REGATTA_LOG_TO, REGATTA_LOG_EVENT, + REGATTA_LOG_FROM, REGATTA_LOG_TO, REGATTA_LOG_EVENT, REGATTA_LOG_MARK, // remote server reference fields SERVER_NAME, diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java index a0c0ae078f3..0fbb5725dd7 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java @@ -49,6 +49,7 @@ import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetito import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogCloseOpenEndedDeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDefineMarkEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceCompetitorMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogRegisterCompetitorEvent; @@ -1494,6 +1495,13 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { storeRegattaLogEvent(regattaLikeId, result); } + public void storeRegattaLogEvent(RegattaLikeIdentifier regattaLikeIdentifier, RegattaLogDefineMarkEvent event) { + DBObject result = createBasicRegattaLogEventDBObject(event); + result.put(FieldNames.REGATTA_LOG_EVENT_CLASS.name(), RegattaLogDefineMarkEvent.class.getSimpleName()); + result.put(FieldNames.REGATTA_LOG_MARK.name(), storeMark(event.getMark())); + storeRegattaLogEvent(regattaLikeIdentifier, result); + } + private DBObject createImageObject(ImageDescriptor image) { DBObject result = new BasicDBObject(); result.put(FieldNames.IMAGE_URL.name(), image.getURL().toString()); diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRegattaLogStoreVisitor.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRegattaLogStoreVisitor.java index c0c1143c042..c3c796c59a6 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRegattaLogStoreVisitor.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRegattaLogStoreVisitor.java @@ -4,6 +4,7 @@ import java.util.logging.Logger; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogCloseOpenEndedDeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDefineMarkEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceCompetitorMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogRegisterCompetitorEvent; @@ -60,4 +61,9 @@ public class MongoRegattaLogStoreVisitor implements RegattaLogEventVisitor { public void visit(RegattaLogSetCompetitorTimeOnDistanceAllowancePerNauticalMileEvent event) { mongoObjectFactory.storeRegattaLogEvent(regattaLikeIdentifier, event); } + + @Override + public void visit(RegattaLogDefineMarkEvent event) { + mongoObjectFactory.storeRegattaLogEvent(regattaLikeIdentifier, event); + } } diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java index 747f938f666..b7b74d164f1 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java @@ -33,12 +33,14 @@ import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceInfor import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDefineMarkEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceCompetitorMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.impl.BaseRegattaLogEventVisitor; import com.sap.sailing.domain.abstractlog.shared.analyzing.DeviceCompetitorMappingFinder; import com.sap.sailing.domain.abstractlog.shared.analyzing.DeviceMarkMappingFinder; import com.sap.sailing.domain.abstractlog.shared.analyzing.RegisteredCompetitorsAnalyzer; +import com.sap.sailing.domain.abstractlog.shared.events.DefineMarkEvent; import com.sap.sailing.domain.abstractlog.shared.events.DeviceCompetitorMappingEvent; import com.sap.sailing.domain.abstractlog.shared.events.DeviceMarkMappingEvent; import com.sap.sailing.domain.base.BoatClass; @@ -75,6 +77,7 @@ import com.sap.sailing.domain.tracking.DynamicTrackedRace; import com.sap.sailing.domain.tracking.DynamicTrackedRegatta; import com.sap.sailing.domain.tracking.RaceHandle; import com.sap.sailing.domain.tracking.RaceTracker; +import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.WindStore; import com.sap.sailing.domain.tracking.WindTrack; import com.sap.sailing.domain.tracking.impl.TrackedRaceStatusImpl; @@ -174,6 +177,12 @@ public class RaceLogRaceTracker implements RaceTracker, GPSFixReceivedListener { public void visit(RegattaLogDeviceMarkMappingEvent event) { RaceLogRaceTracker.this.onDeviceMarkMappingEvent(event); } + + //FIXME: check with Axel whether this is the desired behavior + @Override + public void visit(RegattaLogDefineMarkEvent event) { + RaceLogRaceTracker.this.onDefineMarkEvent(event); + } }; visitors.put(log, visitor); ((RegattaLog) log).addListener(visitor); @@ -373,7 +382,7 @@ public class RaceLogRaceTracker implements RaceTracker, GPSFixReceivedListener { * {@link RaceLogDefineMarkEvent} is received, the existence of the track for that mark in the {@link TrackedRace} * has to be ensured, also ensuring that the mark will exist in the mark tracks map key set. */ - private void onDefineMarkEvent(RaceLogDefineMarkEvent event) { + private void onDefineMarkEvent(DefineMarkEvent event) { if (trackedRace != null) { trackedRace.getOrCreateTrack(event.getMark()); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogDefineMarkEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogDefineMarkEvent.java index adbfb6912d6..ba0c5db64a9 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogDefineMarkEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogDefineMarkEvent.java @@ -2,6 +2,8 @@ package com.sap.sailing.domain.abstractlog.race.tracking; import com.sap.sailing.domain.abstractlog.Revokable; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.shared.events.DefineMarkEvent; import com.sap.sailing.domain.base.Mark; /** @@ -11,6 +13,6 @@ import com.sap.sailing.domain.base.Mark; * */ @Deprecated //see bug 2851 -public interface RaceLogDefineMarkEvent extends RaceLogEvent, Revokable { +public interface RaceLogDefineMarkEvent extends DefineMarkEvent, RaceLogEvent, Revokable { Mark getMark(); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogDefineMarkEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogDefineMarkEventImpl.java index 6b5686eb106..d7cd8fd41e4 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogDefineMarkEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogDefineMarkEventImpl.java @@ -2,25 +2,32 @@ package com.sap.sailing.domain.abstractlog.race.tracking.impl; import java.io.Serializable; import java.util.Collections; +import java.util.List; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; -import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventImpl; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventDataImpl; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent; +import com.sap.sailing.domain.abstractlog.shared.events.impl.AbstractDefineMarkEventImpl; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Mark; import com.sap.sse.common.TimePoint; @Deprecated //see bug2851 -public class RaceLogDefineMarkEventImpl extends RaceLogEventImpl implements RaceLogDefineMarkEvent { +public class RaceLogDefineMarkEventImpl extends AbstractDefineMarkEventImpl implements RaceLogDefineMarkEvent { private static final long serialVersionUID = 277007856878002208L; - - private final Mark mark; + + private RaceLogEventDataImpl raceLogEventData; public RaceLogDefineMarkEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, - Serializable pId, int pPassId, Mark mark) { - super(createdAt, author, logicalTimePoint, pId, Collections.emptyList(), pPassId); - this.mark = mark; + Serializable pId, int passId, Mark mark) { + super(createdAt, author, logicalTimePoint, pId, mark); + this.raceLogEventData = new RaceLogEventDataImpl(null, passId); + } + + @Override + public int getPassId() { + return raceLogEventData.getPassId(); } @Override @@ -29,8 +36,8 @@ public class RaceLogDefineMarkEventImpl extends RaceLogEventImpl implements Race } @Override - public Mark getMark() { - return mark; + public List getInvolvedBoats() { + return Collections.emptyList(); } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/RegattaLogEventVisitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/RegattaLogEventVisitor.java index e880a8fdad8..bb949b3860c 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/RegattaLogEventVisitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/RegattaLogEventVisitor.java @@ -1,6 +1,7 @@ package com.sap.sailing.domain.abstractlog.regatta; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogCloseOpenEndedDeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDefineMarkEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceCompetitorMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogRegisterCompetitorEvent; @@ -22,4 +23,6 @@ public interface RegattaLogEventVisitor { void visit(RegattaLogSetCompetitorTimeOnTimeFactorEvent event); void visit(RegattaLogSetCompetitorTimeOnDistanceAllowancePerNauticalMileEvent event); + + void visit(RegattaLogDefineMarkEvent event); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogDefineMarkEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogDefineMarkEvent.java new file mode 100644 index 00000000000..bb8c7fa5229 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogDefineMarkEvent.java @@ -0,0 +1,15 @@ +package com.sap.sailing.domain.abstractlog.regatta.events; + +import com.sap.sailing.domain.abstractlog.Revokable; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; +import com.sap.sailing.domain.abstractlog.shared.events.DefineMarkEvent; +import com.sap.sailing.domain.base.Mark; + +/** + * Defines a mark, that can then be used to build a course. + * + */ +public interface RegattaLogDefineMarkEvent extends DefineMarkEvent, RegattaLogEvent, Revokable { + Mark getMark(); +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDefineMarkEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDefineMarkEventImpl.java new file mode 100644 index 00000000000..3698880617b --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDefineMarkEventImpl.java @@ -0,0 +1,25 @@ +package com.sap.sailing.domain.abstractlog.regatta.events.impl; + +import java.io.Serializable; + +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDefineMarkEvent; +import com.sap.sailing.domain.abstractlog.shared.events.impl.AbstractDefineMarkEventImpl; +import com.sap.sailing.domain.base.Mark; +import com.sap.sse.common.TimePoint; + +public class RegattaLogDefineMarkEventImpl extends AbstractDefineMarkEventImpl implements RegattaLogDefineMarkEvent { + private static final long serialVersionUID = -5114645637316367845L; + + public RegattaLogDefineMarkEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, + Serializable pId, Mark mark) { + super(createdAt, author, logicalTimePoint, pId, mark); + } + + @Override + public void accept(RegattaLogEventVisitor visitor) { + visitor.visit(this); + } + +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/impl/BaseRegattaLogEventVisitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/impl/BaseRegattaLogEventVisitor.java index a55ee5b8c90..d934cf6e5dd 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/impl/BaseRegattaLogEventVisitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/impl/BaseRegattaLogEventVisitor.java @@ -2,6 +2,7 @@ package com.sap.sailing.domain.abstractlog.regatta.impl; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogCloseOpenEndedDeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDefineMarkEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceCompetitorMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogRegisterCompetitorEvent; @@ -39,4 +40,7 @@ public class BaseRegattaLogEventVisitor implements RegattaLogEventVisitor { public void visit(RegattaLogSetCompetitorTimeOnDistanceAllowancePerNauticalMileEvent event) { } + @Override + public void visit(RegattaLogDefineMarkEvent event) { + } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/impl/RegattaLogEventListener.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/impl/RegattaLogEventListener.java index e086b07da51..4d60900e54b 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/impl/RegattaLogEventListener.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/impl/RegattaLogEventListener.java @@ -3,6 +3,7 @@ package com.sap.sailing.domain.abstractlog.regatta.impl; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogCloseOpenEndedDeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDefineMarkEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceCompetitorMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogRegisterCompetitorEvent; @@ -47,4 +48,9 @@ public abstract class RegattaLogEventListener implements RegattaLogEventVisitor public void visit(RegattaLogSetCompetitorTimeOnDistanceAllowancePerNauticalMileEvent event) { eventAdded(event); } + + @Override + public void visit(RegattaLogDefineMarkEvent event) { + eventAdded(event); + } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/DefineMarkEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/DefineMarkEvent.java new file mode 100644 index 00000000000..e014178ee87 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/DefineMarkEvent.java @@ -0,0 +1,9 @@ +package com.sap.sailing.domain.abstractlog.shared.events; + +import com.sap.sailing.domain.abstractlog.AbstractLogEvent; +import com.sap.sailing.domain.abstractlog.Revokable; +import com.sap.sailing.domain.base.Mark; + +public interface DefineMarkEvent extends AbstractLogEvent, Revokable { + Mark getMark(); +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/impl/AbstractDefineMarkEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/impl/AbstractDefineMarkEventImpl.java new file mode 100644 index 00000000000..86dfdf702b8 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/impl/AbstractDefineMarkEventImpl.java @@ -0,0 +1,33 @@ +package com.sap.sailing.domain.abstractlog.shared.events.impl; + +import java.io.Serializable; + +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.impl.AbstractLogEventImpl; +import com.sap.sailing.domain.abstractlog.shared.events.DefineMarkEvent; +import com.sap.sailing.domain.base.Mark; +import com.sap.sse.common.TimePoint; + +public abstract class AbstractDefineMarkEventImpl extends AbstractLogEventImpl implements +DefineMarkEvent { + + private static final long serialVersionUID = 5865183507521850320L; + + private final Mark mark; + + public AbstractDefineMarkEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, + Serializable pId, Mark mark) { + super(createdAt, author, logicalTimePoint, pId); + this.mark = mark; + } + + @Override + public Mark getMark() { + return mark; + } + + @Override + public String getShortInfo() { + return "mark: "+mark.toString(); + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCourseManagementWidget.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCourseManagementWidget.java index 0790c403d34..565dc83697c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCourseManagementWidget.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCourseManagementWidget.java @@ -37,7 +37,7 @@ public class RaceLogCourseManagementWidget extends CourseManagementWidget { new DataEntryDialog.DialogCallback() { @Override public void ok(MarkDTO mark) { - sailingService.addMarkToRaceLog(leaderboardName, raceColumnName, fleetName, mark, + sailingService.addMarkToRegattaLog(leaderboardName, mark, new AsyncCallback() { @Override public void onSuccess(Void result) { @@ -134,7 +134,7 @@ public class RaceLogCourseManagementWidget extends CourseManagementWidget { } }); - sailingService.getMarksInRaceLog(leaderboardName, raceColumnName, fleetName, + sailingService.getMarksInRegattaLog(leaderboardName, new AsyncCallback>() { @Override public void onSuccess(Iterable result) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogImportFixesAndAddMappingsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogImportFixesAndAddMappingsDialog.java deleted file mode 100644 index 45076f8b76f..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogImportFixesAndAddMappingsDialog.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.sap.sailing.gwt.ui.adminconsole; - -import java.util.Collection; - -import com.google.gwt.user.client.rpc.AsyncCallback; -import com.sap.sailing.domain.common.dto.CompetitorDTO; -import com.sap.sailing.gwt.ui.client.SailingServiceAsync; -import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sailing.gwt.ui.shared.DeviceMappingDTO; -import com.sap.sailing.gwt.ui.shared.MarkDTO; -import com.sap.sse.gwt.client.ErrorReporter; - -public class RaceLogImportFixesAndAddMappingsDialog extends AbstractLogImportFixesAndAddMappingsDialog { - private String leaderboardName; - private String raceColumnName; - private String fleetName; - - - public RaceLogImportFixesAndAddMappingsDialog(SailingServiceAsync sailingService, final ErrorReporter errorReporter, - final StringMessages stringMessages, String leaderboardName, String raceColumnName, String fleetName, - DialogCallback> callback) { - super(sailingService,errorReporter, stringMessages, callback); - - this.leaderboardName = leaderboardName; - this.raceColumnName = raceColumnName; - this.fleetName = fleetName; - - getCompetitorRegistrations(sailingService, errorReporter); - getMarks(sailingService, errorReporter); - } - - @Override - void getMarks(SailingServiceAsync sailingService, final ErrorReporter errorReporter) { - sailingService.getMarksInRaceLog(leaderboardName, raceColumnName, fleetName, new AsyncCallback>() { - @Override - public void onSuccess(Iterable result) { - markTable.refresh(result); - } - - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError("Could not load marks: " + caught.getMessage()); - } - }); - } - - @Override - void getCompetitorRegistrations(SailingServiceAsync sailingService, final ErrorReporter errorReporter) { - sailingService.getCompetitorRegistrationsFromLogHierarchy(leaderboardName, new AsyncCallback>() { - @Override - public void onSuccess(Collection result) { - competitorTable.refreshCompetitorList(result); - } - - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError("Could not load competitors: " + caught.getMessage()); - } - }); - } - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogAddDeviceMappingDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogAddDeviceMappingDialog.java index 141d8d96dc8..b83abec70f7 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogAddDeviceMappingDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogAddDeviceMappingDialog.java @@ -95,9 +95,6 @@ public class RegattaLogAddDeviceMappingDialog extends AbstractLogAddDeviceMappin @Override protected void loadCompetitorsAndMarks() { sailingService.getCompetitorRegistrationsFromLogHierarchy(leaderboardName, itemSelectionPanel.getSetCompetitorsCallback()); - // fetching marks definitions from the race logs; note that currently there are no mark *definitions* - // on regatta logs although there can be mark/device assignments on a regatta log which then gives the - // mark a position that applies across all races in the regatta-like thing - sailingService.getMarksInRaceLogsAndTrackedRaces(leaderboardName, itemSelectionPanel.getSetMarksCallback()); + sailingService.getMarksInRegattaLog(leaderboardName, itemSelectionPanel.getSetMarksCallback()); } } \ No newline at end of file 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 29d453b09e8..cc22c0b1a24 100755 --- 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 @@ -467,10 +467,6 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS * {@link #getCompetitorRegistrationsInRaceLog(String, String, String) registered for the racelog}. */ Collection getCompetitorRegistrationsInRegattaLog(String leaderboardName) throws DoesNotHaveRegattaLogException; - - void addMarkToRaceLog(String leaderboardName, String raceColumnName, String fleetName, MarkDTO markDTO); - - Iterable getMarksInRaceLog(String leaderboardName, String raceColumnName, String fleetName); /** * Adds the course definition to the racelog, while trying to reuse existing marks, controlpoints and waypoints @@ -584,8 +580,6 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS void inviteCompetitorsForTrackingViaEmail(String serverUrlWithoutTrailingSlash, EventDTO event, String leaderboardName, Collection competitors, String localeInfo) throws MailException; - Iterable getMarksInRaceLogsAndTrackedRaces(String leaderboardName); - void inviteBuoyTenderViaEmail(String serverUrlWithoutTrailingSlash, EventDTO eventDto, String leaderboardName, String emails, String localeInfoName) throws MailException; @@ -634,4 +628,6 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS */ Collection getCompetitorRegistrationsOnRaceLog(String leaderboardName, String raceColumnName, String fleetName); + + void addMarkToRegattaLog(String leaderboardName, MarkDTO mark) throws DoesNotHaveRegattaLogException; } 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 cb702df5b24..22f365273e8 100755 --- 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 @@ -626,12 +626,6 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan void getCompetitorRegistrationsOnRaceLog(String leaderboardName, String raceColumnName, String fleetName, AsyncCallback> callback); - void addMarkToRaceLog(String leaderboardName, String raceColumnName, String fleetName, MarkDTO markDTO, - AsyncCallback callback); - - void getMarksInRaceLog(String leaderboardName, String raceColumnName, String fleetName, - AsyncCallback> callback); - void addCourseDefinitionToRaceLog(String leaderboardName, String raceColumnName, String fleetName, List> course, AsyncCallback callback); @@ -733,8 +727,6 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan String leaderboardName, Collection competitors, String localeInfo, AsyncCallback callback); - void getMarksInRaceLogsAndTrackedRaces(String leaderboardName, AsyncCallback> callback); - void inviteBuoyTenderViaEmail(String serverUrlWithoutTrailingSlash, EventDTO eventDto, String leaderboardName, String emails, String localeInfoName, AsyncCallback callback); @@ -775,4 +767,6 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan void copyCourseToOtherRaceLogs(Triple fromTriple, Set> toTriples, AsyncCallback callback); + + void addMarkToRegattaLog(String leaderboardName, MarkDTO mark, 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 2f6cf4b2365..0184b61df9f 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 @@ -87,6 +87,7 @@ import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogCloseOpenEndedDeviceMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogRegisterCompetitorEvent; +import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDefineMarkEventImpl; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceCompetitorMappingEventImpl; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceMarkMappingEventImpl; import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogOpenEndedDeviceMappingCloser; @@ -4970,12 +4971,12 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S } @Override - public void addMarkToRaceLog(String leaderboardName, String raceColumnName, String fleetName, MarkDTO markDTO) { + public void addMarkToRegattaLog(String leaderboardName, MarkDTO markDTO) throws DoesNotHaveRegattaLogException { Mark mark = convertToMark(markDTO, false); - RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createDefineMarkEvent(MillisecondsTimePoint.now(), - getService().getServerAuthor(), raceLog.getCurrentPassId(), mark); - raceLog.add(event); + RegattaLog regattaLog = getRegattaLogInternal(leaderboardName); + RegattaLogDefineMarkEventImpl event = new RegattaLogDefineMarkEventImpl(MillisecondsTimePoint.now(), + getService().getServerAuthor(), MillisecondsTimePoint.now(), UUID.randomUUID(), mark); + regattaLog.add(event); } @Override @@ -4999,42 +5000,6 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S logger.warning("Could not revoke event for mark "+markDTO.getIdAsString()+". Mark not found in RaceLog."); } } - - @Override - public Iterable getMarksInRaceLog(String leaderboardName, String raceColumnName, String fleetName) { - RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); - Iterable marks = new RaceLogDefinedMarkFinder(raceLog).analyze(); - return convertToMarkDTOs((LeaderboardThatHasRegattaLike) getService().getLeaderboardByName(leaderboardName), raceLog, marks); - } - - @Override - public Iterable getMarksInRaceLogsAndTrackedRaces(String leaderboardName) { - Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName); - if (leaderboard == null) { - // TODO: implement proper Exception Handling - return null; - } - Set markDTOs = new HashSet<>(); - Map marksById = new HashMap<>(); - for (RaceColumn raceColumn : leaderboard.getRaceColumns()) { - for (Fleet fleet : raceColumn.getFleets()) { - RaceLog raceLog = raceColumn.getRaceLog(fleet); - TrackedRace trackedRace = raceColumn.getTrackedRace(fleet); //might not yet be attached - for (Mark markDefinitionFromRaceLog : new RaceLogDefinedMarkFinder(raceLog).analyze()) { - marksById.put(markDefinitionFromRaceLog.getId(), markDefinitionFromRaceLog); - } - if (trackedRace != null) { - for (Mark markFromTrackedRace : trackedRace.getMarks()) { - marksById.put(markFromTrackedRace.getId(), markFromTrackedRace); - } - } - Util.addAll(convertToMarkDTOs( - (LeaderboardThatHasRegattaLike) getService().getLeaderboardByName(leaderboardName), - raceLog, marksById.values()), markDTOs); - } - } - return markDTOs; - } @Override public void addCourseDefinitionToRaceLog(String leaderboardName, String raceColumnName, String fleetName, From 7024137b57d5424cffc68eb3faf094f2f7fcb53c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Wed, 28 Oct 2015 16:00:30 +0100 Subject: [PATCH 003/165] Removes addDeviceMappingToRacelog from sailingService --- .../sailing/gwt/ui/client/SailingService.java | 3 --- .../gwt/ui/client/SailingServiceAsync.java | 3 --- .../gwt/ui/server/SailingServiceImpl.java | 24 ------------------- 3 files changed, 30 deletions(-) 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 cc22c0b1a24..3d7537d6206 100755 --- 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 @@ -481,9 +481,6 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS */ void pingMarkViaRaceLogTracking(String leaderboardName, String raceColumnName, String fleetName, MarkDTO mark, Position position); - void addDeviceMappingToRaceLog(String leaderboardName, String raceColumnName, String fleetName, DeviceMappingDTO mapping) - throws TransformationException; - List getDeviceMappingsFromRaceLog(String leaderboardName, String raceColumnName, String fleetName) throws TransformationException; 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 22f365273e8..e627ee07cec 100755 --- 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 @@ -646,9 +646,6 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan void getDeviceMappingsFromRaceLog(String leaderboardName, String raceColumnName, String fleetName, AsyncCallback> callback); - void addDeviceMappingToRaceLog(String leaderboardName, String raceColumnName, String fleetName, - DeviceMappingDTO mapping, AsyncCallback callback); - void closeOpenEndedDeviceMapping(String leaderboardName, String raceColumnName, String fleetName, DeviceMappingDTO mapping, Date closingTimePoint, AsyncCallback callback); 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 0184b61df9f..f10663fc93a 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 @@ -5218,30 +5218,6 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S return getDeviceMappingsFromLogs(Collections.>singletonList(raceLog)); } - @Override - public void addDeviceMappingToRaceLog(String leaderboardName, String raceColumnName, String fleetName, - DeviceMappingDTO dto) throws NoCorrespondingServiceRegisteredException, TransformationException { - RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); - DeviceMapping mapping = convertToDeviceMapping(dto); - TimePoint now = MillisecondsTimePoint.now(); - RaceLogEvent event = null; - TimePoint from = mapping.getTimeRange().hasOpenBeginning() ? null : mapping.getTimeRange().from(); - TimePoint to = mapping.getTimeRange().hasOpenEnd() ? null : mapping.getTimeRange().to(); - if (dto.mappedTo instanceof MarkDTO) { - Mark mark = convertToMark(((MarkDTO) dto.mappedTo), true); - event = RaceLogEventFactory.INSTANCE.createDeviceMarkMappingEvent(now, getService().getServerAuthor(), - mapping.getDevice(), mark, raceLog.getCurrentPassId(), from, to); - } else if (dto.mappedTo instanceof CompetitorDTO) { - Competitor competitor = getService().getCompetitorStore().getExistingCompetitorByIdAsString( - ((CompetitorDTO) dto.mappedTo).getIdAsString()); - event = RaceLogEventFactory.INSTANCE.createDeviceCompetitorMappingEvent(now, getService().getServerAuthor(), - mapping.getDevice(), competitor, raceLog.getCurrentPassId(), from, to); - } else { - throw new RuntimeException("Can only map devices to competitors or marks"); - } - raceLog.add(event); - } - @Override public void addDeviceMappingToRegattaLog(String leaderboardName, DeviceMappingDTO dto) throws NoCorrespondingServiceRegisteredException, TransformationException, DoesNotHaveRegattaLogException { From 753d0e831ec2cc20d653546728c9896d2edc13b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Wed, 28 Oct 2015 16:01:05 +0100 Subject: [PATCH 004/165] Organize imports --- .../java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java | 1 - 1 file changed, 1 deletion(-) 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 f10663fc93a..6de1434dfa6 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 @@ -80,7 +80,6 @@ import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.Readon import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.ReadonlyRRS26RacingProcedure; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogDefinedMarkFinder; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogOpenEndedDeviceMappingCloser; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; From babaa5aafe3af8097356238dd784e117c8a8b6e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Wed, 28 Oct 2015 16:14:15 +0100 Subject: [PATCH 005/165] Temporarily removes ability to delete mark on raceview --- .../RaceLogCourseManagementWidget.java | 9 +++++++-- .../sailing/gwt/ui/client/SailingService.java | 5 ++--- .../gwt/ui/client/SailingServiceAsync.java | 5 ++--- .../gwt/ui/server/SailingServiceImpl.java | 20 ++++++++++--------- 4 files changed, 22 insertions(+), 17 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCourseManagementWidget.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCourseManagementWidget.java index 565dc83697c..5b3083277b7 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCourseManagementWidget.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCourseManagementWidget.java @@ -59,6 +59,7 @@ public class RaceLogCourseManagementWidget extends CourseManagementWidget { }); marksBtnsPanel.add(addMark); + /* TODO: implement the functionality as described in bug2851 Button removeMark = new Button(stringMessages.remove(stringMessages.mark())); removeMark.addClickHandler(new ClickHandler() { @Override @@ -66,7 +67,7 @@ public class RaceLogCourseManagementWidget extends CourseManagementWidget { Set marksToRemove = marks.getSelectionModel().getSelectedSet(); for (MarkDTO markToRemove : marksToRemove) { - sailingService.revokeMarkDefinitionEventInRaceLog(leaderboardName, raceColumnName, fleetName, + sailingService.revokeMarkDefinitionEventInRegattaLog(leaderboardName, markToRemove, new AsyncCallback() { @Override @@ -81,8 +82,12 @@ public class RaceLogCourseManagementWidget extends CourseManagementWidget { } } }); + + removeMark.setEnabled(false); + removeMark.setTitle("Is used in x races"); marksBtnsPanel.add(removeMark); - + */ + ImagesBarColumn actionColumn = new ImagesBarColumn( new RaceLogTrackingCourseDefinitionDialogMarksImagesBarCell(stringMessages)); actionColumn.setFieldUpdater(new FieldUpdater() { 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 3d7537d6206..1f8760774f5 100755 --- 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 @@ -600,9 +600,6 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS Pair getTrackingTimes(String leaderboardName, String raceColumnName, String fleetName); - void revokeMarkDefinitionEventInRaceLog(String leaderboardName, String raceColumnName, String fleetName, - MarkDTO markDTO); - Collection getCompetitorRegistrationsFromLogHierarchy(String leaderboardName); /** @@ -627,4 +624,6 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS String fleetName); void addMarkToRegattaLog(String leaderboardName, MarkDTO mark) throws DoesNotHaveRegattaLogException; + + void revokeMarkDefinitionEventInRegattaLog(String leaderboardName, MarkDTO markDTO) throws DoesNotHaveRegattaLogException; } 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 e627ee07cec..95c7feca3c2 100755 --- 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 @@ -753,9 +753,6 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan void getTrackingTimes(String leaderboardName, String raceColumnName, String fleetName, AsyncCallback> callback); - void revokeMarkDefinitionEventInRaceLog(String leaderboardName, String raceColumnName, String fleetName, - MarkDTO markDTO, AsyncCallback callback); - void getCompetitorRegistrationsFromLogHierarchy(String leaderboardName, AsyncCallback> setCompetitorsCallback); @@ -766,4 +763,6 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan Set> toTriples, AsyncCallback callback); void addMarkToRegattaLog(String leaderboardName, MarkDTO mark, AsyncCallback asyncCallback); + + void revokeMarkDefinitionEventInRegattaLog(String leaderboardName, MarkDTO markDTO, AsyncCallback callback); } 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 6de1434dfa6..b78f4e56be5 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 @@ -85,10 +85,12 @@ import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogTr import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogCloseOpenEndedDeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDefineMarkEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDefineMarkEventImpl; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceCompetitorMappingEventImpl; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceMarkMappingEventImpl; +import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogRevokeEventImpl; import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogOpenEndedDeviceMappingCloser; import com.sap.sailing.domain.abstractlog.shared.analyzing.DeviceCompetitorMappingFinder; import com.sap.sailing.domain.abstractlog.shared.analyzing.DeviceMarkMappingFinder; @@ -4979,24 +4981,24 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S } @Override - public void revokeMarkDefinitionEventInRaceLog(String leaderboardName, String raceColumnName, String fleetName, MarkDTO markDTO) { - RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); + public void revokeMarkDefinitionEventInRegattaLog(String leaderboardName, MarkDTO markDTO) throws DoesNotHaveRegattaLogException { + RegattaLog regattaLog = getRegattaLogInternal(leaderboardName); - final List raceLogDeviceMarkMappingEvents = new AllEventsOfTypeFinder<>(raceLog, /* only unrevoked */ true, RaceLogDefineMarkEvent.class).analyze(); + final List regattaLogDeviceMarkMappingEvents = new AllEventsOfTypeFinder<>(regattaLog, /* only unrevoked */ true, RegattaLogDefineMarkEvent.class).analyze(); - RaceLogEvent eventToRevoke = null; - for (RaceLogEvent event : raceLogDeviceMarkMappingEvents) { - RaceLogDefineMarkEvent defineMarkEvent = (RaceLogDefineMarkEvent) event; + RegattaLogEvent eventToRevoke = null; + for (RegattaLogEvent event : regattaLogDeviceMarkMappingEvents) { + RegattaLogDefineMarkEvent defineMarkEvent = (RegattaLogDefineMarkEvent) event; if (defineMarkEvent.getMark().getId().toString().equals(markDTO.getIdAsString())){ eventToRevoke = event; } } if (eventToRevoke != null){ - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createRevokeEvent(getService().getServerAuthor(), raceLog.getCurrentPassId(), eventToRevoke, "Revoked by AdminConsole (RaceLogTracking)"); - raceLog.add(event); + RegattaLogEvent event = new RegattaLogRevokeEventImpl(getService().getServerAuthor(), eventToRevoke, "Revoked by AdminConsole (RaceLogTracking)"); + regattaLog.add(event); } else { - logger.warning("Could not revoke event for mark "+markDTO.getIdAsString()+". Mark not found in RaceLog."); + logger.warning("Could not revoke event for mark "+markDTO.getIdAsString()+". Mark not found in RegattaLog."); } } From 47ccb5039dd6fa9a132051c75cd530470eb2ad4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Fri, 30 Oct 2015 11:29:31 +0100 Subject: [PATCH 006/165] Cleans up closing DeviceMappings, warns if mapping is in RaceLog --- .../common/RaceLogEventNotFoundException.java | 12 ++++++ .../sailing/gwt/ui/client/SailingService.java | 5 +-- .../gwt/ui/client/SailingServiceAsync.java | 3 -- .../gwt/ui/server/SailingServiceImpl.java | 41 +++++++++++++------ 4 files changed, 41 insertions(+), 20 deletions(-) create mode 100644 java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/RaceLogEventNotFoundException.java diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/RaceLogEventNotFoundException.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/RaceLogEventNotFoundException.java new file mode 100644 index 00000000000..a07702a3507 --- /dev/null +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/RaceLogEventNotFoundException.java @@ -0,0 +1,12 @@ +package com.sap.sailing.domain.common; + +public class RaceLogEventNotFoundException extends Exception { + private static final long serialVersionUID = 4595827888350748956L; + + @SuppressWarnings("unused") // required for some serialization frameworks such as GWT RPC + public RaceLogEventNotFoundException() {} + + public RaceLogEventNotFoundException(String message) { + super(message); + } +} 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 1f8760774f5..900deae2a5c 100755 --- 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 @@ -486,9 +486,6 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS List getDeserializableDeviceIdentifierTypes(); - void closeOpenEndedDeviceMapping(String leaderboardName, String raceColumnName, String fleetName, DeviceMappingDTO mapping, - Date closingTimePoint) throws NoCorrespondingServiceRegisteredException, TransformationException; - /** * Revoke the events in the {@code RaceLog} that are identified by the {@code eventIds}. * This only affects such events that implement {@link Revokable}. @@ -588,7 +585,7 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS void revokeRaceAndRegattaLogEvents(String leaderboardName, List eventIds) throws NotRevokableException, DoesNotHaveRegattaLogException; - void closeOpenEndedDeviceMapping(String leaderboardName, DeviceMappingDTO mappingDto, Date closingTimePoint) throws TransformationException; + void closeOpenEndedDeviceMapping(String leaderboardName, DeviceMappingDTO mappingDto, Date closingTimePoint) throws TransformationException, DoesNotHaveRegattaLogException; void addDeviceMappingToRegattaLog(String leaderboardName, DeviceMappingDTO dto) throws NoCorrespondingServiceRegisteredException, TransformationException, DoesNotHaveRegattaLogException; 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 95c7feca3c2..5f6e634a585 100755 --- 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 @@ -646,9 +646,6 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan void getDeviceMappingsFromRaceLog(String leaderboardName, String raceColumnName, String fleetName, AsyncCallback> callback); - void closeOpenEndedDeviceMapping(String leaderboardName, String raceColumnName, String fleetName, - DeviceMappingDTO mapping, Date closingTimePoint, AsyncCallback callback); - void revokeRaceAndRegattaLogEvents(String leaderboardName, String raceColumnName, String fleetName, List eventIds, AsyncCallback callback); 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 b78f4e56be5..b3f40f90d35 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 @@ -52,6 +52,7 @@ import java.util.zip.GZIPInputStream; import javax.servlet.ServletContext; import org.apache.http.client.ClientProtocolException; +import org.eclipse.jetty.util.log.Log; import org.osgi.framework.BundleContext; import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceReference; @@ -161,6 +162,7 @@ import com.sap.sailing.domain.common.PolarSheetsXYDiagramData; import com.sap.sailing.domain.common.Position; import com.sap.sailing.domain.common.RaceFetcher; import com.sap.sailing.domain.common.RaceIdentifier; +import com.sap.sailing.domain.common.RaceLogEventNotFoundException; import com.sap.sailing.domain.common.RankingMetrics; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.RegattaFetcher; @@ -5270,15 +5272,9 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S throw new RuntimeException("Can only map devices to competitors or marks"); } } - - @Override - public void closeOpenEndedDeviceMapping(String leaderboardName, String raceColumnName, String fleetName, - DeviceMappingDTO mappingDTO, Date closingTimePoint) throws NoCorrespondingServiceRegisteredException, TransformationException { - List> logHierarchy = getLogHierarchy(leaderboardName, raceColumnName, fleetName); - closeOpenEndedDeviceMapping(logHierarchy, mappingDTO, closingTimePoint); - } - private void closeOpenEndedDeviceMapping(List> logHierarchy, DeviceMappingDTO mappingDTO, Date closingTimePoint) throws TransformationException { + private void closeOpenEndedDeviceMapping(List> logHierarchy, DeviceMappingDTO mappingDTO, Date closingTimePoint) throws TransformationException, RaceLogEventNotFoundException { + boolean successfullyClosed = false; for (AbstractLog abstractLog : logHierarchy) { //check if abstractLog is the correct log for the closingEvent final AbstractLogEvent event; @@ -5289,6 +5285,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S abstractLog.unlockAfterRead(); } if (event != null) { + successfullyClosed = true; DeviceMapping mapping = convertToDeviceMapping(mappingDTO); if (abstractLog instanceof RegattaLog) { RegattaLog regattaLog = (RegattaLog) abstractLog; @@ -5309,6 +5306,10 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S } } } + + if (!successfullyClosed){ + throw new RaceLogEventNotFoundException(); + } } @Override @@ -5766,12 +5767,26 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S } @Override - public void closeOpenEndedDeviceMapping(String leaderboardName, DeviceMappingDTO mappingDTO, Date closingTimePoint) throws TransformationException { - List> logs = getLogHierarchy(leaderboardName); - closeOpenEndedDeviceMapping(logs, mappingDTO, closingTimePoint); + public void closeOpenEndedDeviceMapping(String leaderboardName, DeviceMappingDTO mappingDTO, Date closingTimePoint) throws TransformationException, DoesNotHaveRegattaLogException { + RegattaLog regattaLog = getRegattaLogInternal(leaderboardName); + + List> logList = new ArrayList<>(); + logList.add(regattaLog); + try { + closeOpenEndedDeviceMapping(logList, mappingDTO, closingTimePoint); + } catch (RaceLogEventNotFoundException e) { + logger.warning("Device Mapping Event couldn't be found on RegattaLog, checking in RaceLog (deprecated)"); + + List> logs = getLogHierarchy(leaderboardName); + try { + closeOpenEndedDeviceMapping(logs, mappingDTO, closingTimePoint); + } catch (RaceLogEventNotFoundException e1) { + logger.warning("Device Mapping Event could also not be found in RaceLogs"); + } + } + } - - + /** * Gets all the logs corresponding to a leaderboard. This includes all the RaceLogs of the leaderBoard's raceColumns * @param leaderboardName From db61a43cda694c4129f893a3cc65055a49a9228d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Fri, 30 Oct 2015 11:34:46 +0100 Subject: [PATCH 007/165] Removes warning about unnecessary SupressWarning --- .../sailing/domain/common/RaceLogEventNotFoundException.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/RaceLogEventNotFoundException.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/RaceLogEventNotFoundException.java index a07702a3507..d85a4479a2d 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/RaceLogEventNotFoundException.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/RaceLogEventNotFoundException.java @@ -2,8 +2,7 @@ package com.sap.sailing.domain.common; public class RaceLogEventNotFoundException extends Exception { private static final long serialVersionUID = 4595827888350748956L; - - @SuppressWarnings("unused") // required for some serialization frameworks such as GWT RPC + public RaceLogEventNotFoundException() {} public RaceLogEventNotFoundException(String message) { From 4d7eed5032dd4cf53ea22e4d277eef068ebe0268 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Fri, 30 Oct 2015 11:42:55 +0100 Subject: [PATCH 008/165] Do not duplicate marks when copying course and competitors --- .../racelogtracking/RaceLogTrackingAdapter.java | 6 ++---- .../impl/RaceLogTrackingAdapterImpl.java | 13 ------------- .../tracking/RaceLogDeviceMarkMappingEvent.java | 1 + .../impl/RaceLogDeviceMarkMappingEventImpl.java | 1 + 4 files changed, 4 insertions(+), 17 deletions(-) diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java index 6204f5fd191..aaf74ff34c5 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java @@ -5,7 +5,6 @@ import java.util.Set; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; @@ -114,9 +113,8 @@ public interface RaceLogTrackingAdapter { String emails, Locale locale) throws MailException; /** - * Duplicate the course in the newest {@link RaceLogCourseDesignChangedEvent} in {@code from} race log to the - * {@code to} race logs. The {@link Mark}s and {@link ControlPoint}s are duplicated and not reused. This also - * inserts the necessary {@link RaceLogDefineMarkEvent}s into the {@code to} race logs. + * Copy the course in the newest {@link RaceLogCourseDesignChangedEvent} in {@code from} race log to the + * {@code to} race logs. The {@link Mark}s and {@link ControlPoint}s are reused and not duplicated. */ void copyCourse(RaceLog fromRaceLog, Set toRaceLogs, SharedDomainFactory baseDomainFactory, RacingEventService service); diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java index 309f42ec296..b3dbef807ef 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java @@ -209,11 +209,6 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter { course.getWaypoints().forEach(wp -> Util.addAll(wp.getMarks(), marks)); } - final List raceLogDeviceMarkMappingEvents = new AllEventsOfTypeFinder<>(fromRaceLog, /* - * only - * unrevoked - */true, - RaceLogDeviceMarkMappingEvent.class).analyze(); for (RaceLog toRaceLog : toRaceLogs) { if (new RaceLogTrackingStateAnalyzer(toRaceLog).analyze().isForTracking()) { if (course != null) { @@ -224,14 +219,6 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter { for (Waypoint oldWaypoint : course.getWaypoints()) { newCourse.addWaypoint(i++, oldWaypoint); } - for (Mark mark : marks) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createDefineMarkEvent(now, - service.getServerAuthor(), toRaceLog.getCurrentPassId(), mark); - toRaceLog.add(event); - } - for (RaceLogEvent raceLogDeviceMarkMappingEvent : raceLogDeviceMarkMappingEvents) { - toRaceLog.add(raceLogDeviceMarkMappingEvent); - } int passId = toRaceLog.getCurrentPassId(); RaceLogEvent newCourseEvent = RaceLogEventFactory.INSTANCE.createCourseDesignChangedEvent(now, service.getServerAuthor(), passId, newCourse); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogDeviceMarkMappingEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogDeviceMarkMappingEvent.java index 73af94d801e..aabf7992115 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogDeviceMarkMappingEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogDeviceMarkMappingEvent.java @@ -4,6 +4,7 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; import com.sap.sailing.domain.abstractlog.shared.events.DeviceMarkMappingEvent; +@Deprecated //(see bug2851) public interface RaceLogDeviceMarkMappingEvent extends RaceLogEvent, DeviceMarkMappingEvent { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogDeviceMarkMappingEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogDeviceMarkMappingEventImpl.java index 4ad9650c8c4..b437f71f261 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogDeviceMarkMappingEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogDeviceMarkMappingEventImpl.java @@ -9,6 +9,7 @@ import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sse.common.TimePoint; +@Deprecated //see bug2851 public class RaceLogDeviceMarkMappingEventImpl extends AbstractRaceLogDeviceMappingEventImpl implements RaceLogDeviceMarkMappingEvent { private static final long serialVersionUID = -7223543830755457196L; From 36e2908adc08d0a5cd6370e587fbef6242dfc77d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Fri, 30 Oct 2015 13:44:14 +0100 Subject: [PATCH 009/165] Get marks from RegattaLog instead of from trackedRace/RaceLog --- .../sailing/gwt/ui/client/SailingService.java | 2 +- .../gwt/ui/server/SailingServiceImpl.java | 48 +++++++------------ 2 files changed, 17 insertions(+), 33 deletions(-) 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 900deae2a5c..e3db615fc81 100755 --- 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 @@ -579,7 +579,7 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS ArrayList getLeaderboardGroupsByEventId(UUID id); - Iterable getMarksInRegattaLog(String leaderboardName); + Iterable getMarksInRegattaLog(String leaderboardName) throws DoesNotHaveRegattaLogException; List getDeviceMappingsFromLogHierarchy(String leaderboardName) throws TransformationException; 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 b3f40f90d35..3c55e9f5fd0 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 @@ -4963,14 +4963,10 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S /** * Also finds the last position of the marks, if set by pinging them */ - private Collection convertToMarkDTOs(LeaderboardThatHasRegattaLike leaderboard, RaceLog raceLog, Iterable marks) { - List dtos = new ArrayList(); + private MarkDTO convertToMarkDTO(LeaderboardThatHasRegattaLike leaderboard, Mark mark) { final TimePoint now = MillisecondsTimePoint.now(); - for (Mark mark : marks) { - final Position lastPos = getService().getMarkPosition(mark, leaderboard, now, raceLog); - dtos.add(convertToMarkDTO(mark, lastPos)); - } - return dtos; + final Position lastPos = getService().getMarkPosition(mark, leaderboard, now, null); + return convertToMarkDTO(mark, lastPos); } @Override @@ -5724,38 +5720,26 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S } /** - * Gets all Marks defined in the RaceLogs of the RaceColumns corresponding to the leaderboard leaderboardName + * Gets all Marks defined in the RegattaLog and the trackedRace + * @throws DoesNotHaveRegattaLogException */ @Override - public Iterable getMarksInRegattaLog(String leaderboardName) { - Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName); - if (leaderboard == null) { - // TODO: implement proper Exception Handling - return null; - } - - if (!(leaderboard instanceof IsRegattaLike)){ - return null; + public Iterable getMarksInRegattaLog(String leaderboardName) throws DoesNotHaveRegattaLogException { + Leaderboard l = getService().getLeaderboardByName(leaderboardName); + if (! (l instanceof HasRegattaLike)) { + throw new DoesNotHaveRegattaLogException(); } + LeaderboardThatHasRegattaLike leaderboard = (LeaderboardThatHasRegattaLike) l; + RegattaLog regattaLog = ((HasRegattaLike) l).getRegattaLike().getRegattaLog(); Set markDTOs = new HashSet<>(); - Map marksById = new HashMap<>(); - for (RaceColumn raceColumn : leaderboard.getRaceColumns()) { - for (Fleet fleet : raceColumn.getFleets()) { - RaceLog raceLog = raceColumn.getRaceLog(fleet); - TrackedRace trackedRace = raceColumn.getTrackedRace(fleet); //might not yet be attached - - if (trackedRace != null) { - for (Mark markFromTrackedRace : trackedRace.getMarks()) { - marksById.put(markFromTrackedRace.getId(), markFromTrackedRace); - } - } - Util.addAll(convertToMarkDTOs( - (LeaderboardThatHasRegattaLike) getService().getLeaderboardByName(leaderboardName), - raceLog, marksById.values()), markDTOs); - } + List markEvents = new AllEventsOfTypeFinder<>(regattaLog, /* only unrevoked */ true, RegattaLogDefineMarkEvent.class).analyze(); + for (RegattaLogEvent regattaLogEvent : markEvents) { + RegattaLogDefineMarkEvent defineMarkEvent = (RegattaLogDefineMarkEvent) regattaLogEvent; + markDTOs.add(convertToMarkDTO(leaderboard, defineMarkEvent.getMark())); } + return markDTOs; } From 5136ceff7888cb9c03a8f11d4e7da90b59dbf13f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Fri, 30 Oct 2015 13:57:17 +0100 Subject: [PATCH 010/165] Ping marks in RegattaLog --- .../domain/racelogtracking/RaceLogTrackingAdapter.java | 5 ----- .../impl/RaceLogTrackingAdapterImpl.java | 10 +--------- ...RaceLogTest.java => PingMarkViaRegattaLogTest.java} | 7 ++++--- .../ui/adminconsole/RaceLogCourseManagementWidget.java | 5 +---- .../com/sap/sailing/gwt/ui/client/SailingService.java | 3 ++- .../sap/sailing/gwt/ui/client/SailingServiceAsync.java | 2 +- .../sap/sailing/gwt/ui/server/SailingServiceImpl.java | 8 ++++---- 7 files changed, 13 insertions(+), 27 deletions(-) rename java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/{PingMarkViaRaceLogTest.java => PingMarkViaRegattaLogTest.java} (88%) diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java index aaf74ff34c5..f1071ed9d48 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java @@ -74,11 +74,6 @@ public interface RaceLogTrackingAdapter { void denoteAllRacesForRaceLogTracking(RacingEventService service, Leaderboard leaderboard) throws NotDenotableForRaceLogTrackingException; - /** - * @see #pingMark(RaceLog, Mark, GPSFix, RacingEventService) using a random {@link PingDeviceIdentifier} - */ - void pingMark(RaceLog raceLogToAddTo, Mark mark, GPSFix gpsFix, RacingEventService service); - /** * @see #pingMark(RaceLog, Mark, GPSFix, RacingEventService) */ diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java index b3dbef807ef..88355c0e8e7 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java @@ -255,15 +255,7 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter { logger.log(Level.WARNING, "Could not ping mark " + mark); } } - - @Override - public void pingMark(RaceLog raceLog, Mark mark, GPSFix gpsFix, RacingEventService service) { - pingMark(raceLog, mark, gpsFix, service, - (DeviceIdentifier dev, TimePoint timePoint) -> RaceLogEventFactory.INSTANCE - .createDeviceMarkMappingEvent(timePoint, service.getServerAuthor(), dev, mark, - raceLog.getCurrentPassId(), timePoint, timePoint), new PingDeviceIdentifierImpl()); - } - + @Override public void pingMark(RegattaLog regattaLog, Mark mark, GPSFix gpsFix, RacingEventService service) { pingMark(regattaLog, mark, gpsFix, service, diff --git a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/PingMarkViaRaceLogTest.java b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/PingMarkViaRegattaLogTest.java similarity index 88% rename from java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/PingMarkViaRaceLogTest.java rename to java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/PingMarkViaRegattaLogTest.java index 28fbb9b2c89..8809a8d1916 100644 --- a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/PingMarkViaRaceLogTest.java +++ b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/PingMarkViaRegattaLogTest.java @@ -15,13 +15,14 @@ import com.sap.sailing.domain.base.impl.SeriesImpl; import com.sap.sailing.domain.common.Position; import com.sap.sailing.domain.common.RankingMetrics; import com.sap.sailing.domain.common.impl.DegreePosition; +import com.sap.sailing.domain.common.racelog.tracking.DoesNotHaveRegattaLogException; import com.sap.sailing.domain.leaderboard.RegattaLeaderboard; import com.sap.sailing.domain.leaderboard.impl.HighPoint; import com.sap.sailing.domain.ranking.RankingMetricsFactory; import com.sap.sailing.gwt.ui.shared.MarkDTO; import com.sap.sailing.server.RacingEventService; -public class PingMarkViaRaceLogTest { +public class PingMarkViaRegattaLogTest { private SailingServiceImplMock sailingService; private RacingEventService service; private final String columnName = "column"; @@ -34,7 +35,7 @@ public class PingMarkViaRaceLogTest { } @Test - public void testPinging() { + public void testPinging() throws DoesNotHaveRegattaLogException { service.getMongoObjectFactory().getDatabase().dropDatabase(); Series series = new SeriesImpl("series", false, Collections.singletonList(fleet), Collections.singletonList(columnName), service); @@ -47,6 +48,6 @@ public class PingMarkViaRaceLogTest { MarkDTO mark = new MarkDTO("mark", "mark"); Position position = new DegreePosition(30, 40); - sailingService.pingMarkViaRaceLogTracking(leaderboard.getName(), columnName, fleet.getName(), mark, position); + sailingService.pingMark(leaderboard.getName(), mark, position); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCourseManagementWidget.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCourseManagementWidget.java index 5b3083277b7..b28b9121095 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCourseManagementWidget.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCourseManagementWidget.java @@ -1,7 +1,5 @@ package com.sap.sailing.gwt.ui.adminconsole; -import java.util.Set; - import com.google.gwt.cell.client.FieldUpdater; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; @@ -98,8 +96,7 @@ public class RaceLogCourseManagementWidget extends CourseManagementWidget { new DataEntryDialog.DialogCallback() { @Override public void ok(Position position) { - sailingService.pingMarkViaRaceLogTracking(leaderboardName, raceColumnName, - fleetName, markDTO, position, new AsyncCallback() { + sailingService.pingMark(leaderboardName, markDTO, position, new AsyncCallback() { @Override public void onSuccess(Void result) { 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 e3db615fc81..f7ef8a162d3 100755 --- 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 @@ -478,8 +478,9 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS /** * Adds a fix to the {@link GPSFixStore}, and creates a mapping with a virtual device for exactly the current timepoint. + * @throws DoesNotHaveRegattaLogException */ - void pingMarkViaRaceLogTracking(String leaderboardName, String raceColumnName, String fleetName, MarkDTO mark, Position position); + void pingMark(String leaderboardName, MarkDTO mark, Position position) throws DoesNotHaveRegattaLogException; List getDeviceMappingsFromRaceLog(String leaderboardName, String raceColumnName, String fleetName) throws TransformationException; 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 5f6e634a585..3be3e25821e 100755 --- 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 @@ -632,7 +632,7 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan void getLastCourseDefinitionInRaceLog(String leaderboardName, String raceColumnName, String fleetName, AsyncCallback callback); - void pingMarkViaRaceLogTracking(String leaderboardName, String raceColumnName, String fleetName, MarkDTO mark, + void pingMark(String leaderboardName, MarkDTO mark, Position position, AsyncCallback callback); void getDeserializableDeviceIdentifierTypes(AsyncCallback> callback); 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 3c55e9f5fd0..885f5a80b83 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 @@ -5081,15 +5081,15 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S } @Override - public void pingMarkViaRaceLogTracking(String leaderboardName, String raceColumnName, String fleetName, - MarkDTO markDTO, Position positionDTO) { - RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); + public void pingMark(String leaderboardName, + MarkDTO markDTO, Position positionDTO) throws DoesNotHaveRegattaLogException { + RegattaLog regattaLog = getRegattaLogInternal(leaderboardName); Mark mark = convertToMark(markDTO, true); TimePoint time = MillisecondsTimePoint.now(); Position position = positionDTO; GPSFix fix = new GPSFixImpl(position, time); - getRaceLogTrackingAdapter().pingMark(raceLog, mark, fix, getService()); + getRaceLogTrackingAdapter().pingMark(regattaLog, mark, fix, getService()); } @Override From d32839fcaba9eb2e3dcb8fc3357c5d3905c5810d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Sat, 31 Oct 2015 15:32:12 +0100 Subject: [PATCH 011/165] Implements competitor regsitration behavior described in bug2851 --- ...egistrationOnRaceLogDisabledException.java | 7 ++ .../impl/DomainObjectFactoryImpl.java | 8 ++ .../impl/MongoObjectFactoryImpl.java | 8 ++ .../impl/MongoRaceLogStoreVisitor.java | 7 ++ .../RaceLogTrackingAdapter.java | 20 +++-- .../impl/RaceLogConnectivityParams.java | 10 +++ .../impl/RaceLogRaceTracker.java | 19 ++++- .../impl/RaceLogTrackingAdapterImpl.java | 39 ++++++--- .../analyzing/test/MultiLogAnalyzerTest.java | 31 ------- .../abstractlog/race/RaceLogEventFactory.java | 3 + .../race/RaceLogEventRestoreFactory.java | 2 + .../abstractlog/race/RaceLogEventVisitor.java | 3 + .../RaceLogRegisteredCompetitorsAnalyzer.java | 27 ++++++ .../impl/AbstractRaceLogChangedVisitor.java | 6 ++ .../race/impl/BaseRaceLogEventVisitor.java | 6 ++ .../race/impl/RaceLogEventFactoryImpl.java | 8 ++ .../impl/RaceLogEventRestoreFactoryImpl.java | 7 ++ ...RaceLogUseCompetitorsFromRaceLogEvent.java | 16 ++++ .../RaceLogUsesOwnCompetitorsAnalyzer.java | 30 +++++++ .../impl/RegisteredCompetitorsFinder.java | 61 +++++++++++++ ...LogUseCompetitorsFromRaceLogEventImpl.java | 31 +++++++ .../analyzing/CompetitorsInLogAnalyzer.java | 48 +++++++++++ .../RegisteredCompetitorsAnalyzer.java | 52 ------------ ...mpetitorProviderCacheInvalidationTest.java | 35 ++++++-- .../domain/base/impl/AbstractRaceColumn.java | 6 +- .../impl/RaceColumnRaceLogReplicator.java | 12 ++- ...ProviderFromRaceColumnsAndRegattaLike.java | 85 +++++++++++++------ .../RaceLogCompetitorRegistrationDialog.java | 2 +- .../RegattaLogAddDeviceMappingDialog.java | 2 +- .../sailing/gwt/ui/client/SailingService.java | 22 ++--- .../gwt/ui/client/SailingServiceAsync.java | 13 ++- .../gwt/ui/server/SailingServiceImpl.java | 52 +++++------- .../impl/RaceLogEventDeserializer.java | 13 ++- ...mpetitorsFromRaceLogEventDeserializer.java | 29 +++++++ .../racelog/impl/RaceLogEventSerializer.java | 13 ++- ...CompetitorsFromRaceLogEventSerializer.java | 21 +++++ .../racelog/RaceLogEventSerializerTest.java | 5 +- ...LeaderboardsResourceCheckinAndOutTest.java | 4 +- .../jaxrs/api/LeaderboardsResource.java | 4 +- 39 files changed, 557 insertions(+), 210 deletions(-) create mode 100644 java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/tracking/CompetitorRegistrationOnRaceLogDisabledException.java create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceLogRegisteredCompetitorsAnalyzer.java create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogUseCompetitorsFromRaceLogEvent.java create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceLogUsesOwnCompetitorsAnalyzer.java create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RegisteredCompetitorsFinder.java create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogUseCompetitorsFromRaceLogEventImpl.java create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/CompetitorsInLogAnalyzer.java delete mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/RegisteredCompetitorsAnalyzer.java create mode 100644 java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogUseCompetitorsFromRaceLogEventDeserializer.java create mode 100644 java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogUseCompetitorsFromRaceLogEventSerializer.java diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/tracking/CompetitorRegistrationOnRaceLogDisabledException.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/tracking/CompetitorRegistrationOnRaceLogDisabledException.java new file mode 100644 index 00000000000..e43b247bc3d --- /dev/null +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/tracking/CompetitorRegistrationOnRaceLogDisabledException.java @@ -0,0 +1,7 @@ +package com.sap.sailing.domain.common.racelog.tracking; + +import java.io.Serializable; + +public class CompetitorRegistrationOnRaceLogDisabledException extends Exception implements Serializable { + private static final long serialVersionUID = 963948633131929332L; +} diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java index d132dd645c7..89ce8f3b06d 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java @@ -70,6 +70,7 @@ import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorM import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogCloseOpenEndedDeviceMappingEvent; @@ -1354,11 +1355,18 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { return loadRaceLogFixedMarkPassingEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(RaceLogSuppressedMarkPassingsEvent.class.getSimpleName())){ return loadRaceLogSuppressedMarkPassingsEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); + } else if (eventClass.equals(RaceLogUseCompetitorsFromRaceLogEvent.class.getSimpleName())){ + return loadRaceLogUseCompetitorsFromRaceLogEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); } throw new IllegalStateException(String.format("Unknown RaceLogEvent type %s", eventClass)); } + private RaceLogEvent loadRaceLogUseCompetitorsFromRaceLogEvent(TimePoint createdAt, AbstractLogEventAuthor author, + TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { + return raceLogEventFactory.createUseCompetitorsFromRaceLogEvent(createdAt, author, logicalTimePoint, id, competitors, passId); + } + private RaceLogEvent loadRaceLogWindFixEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { Wind wind = loadWind((DBObject) dbObject.get(FieldNames.WIND.name())); diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java index 0fbb5725dd7..31143f3819d 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java @@ -47,6 +47,7 @@ import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorM import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogCloseOpenEndedDeviceMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDefineMarkEvent; @@ -1076,6 +1077,13 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { storeTimePoint(event.getClosingTimePoint(), result, FieldNames.RACE_LOG_CLOSING_TIMEPOINT); return result; } + + public DBObject storeRaceLogEntry(RaceLogIdentifier raceLogIdentifier, RaceLogUseCompetitorsFromRaceLogEvent event) { + DBObject result = new BasicDBObject(); + storeRaceLogEventProperties(event, result); + result.put(FieldNames.RACE_LOG_EVENT_CLASS.name(), RaceLogUseCompetitorsFromRaceLogEvent.class.getSimpleName()); + return result; + } private Object storeRaceLogFixedMarkPassingEvent(RaceLogFixedMarkPassingEvent event) { DBObject result = new BasicDBObject(); diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java index 4dff4932552..c1cc603ae10 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java @@ -31,6 +31,7 @@ import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorM import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; import com.sap.sailing.domain.persistence.MongoObjectFactory; import com.sap.sailing.domain.racelog.RaceLogIdentifier; @@ -208,4 +209,10 @@ public class MongoRaceLogStoreVisitor implements RaceLogEventVisitor { DBObject object = mongoObjectFactory.storeRaceLogEntry(raceLogIdentifier, event); mongoObjectFactory.storeRaceLogEventEvent(object); } + + @Override + public void visit(RaceLogUseCompetitorsFromRaceLogEvent event) { + DBObject object = mongoObjectFactory.storeRaceLogEntry(raceLogIdentifier, event); + mongoObjectFactory.storeRaceLogEventEvent(object); + } } diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java index f1071ed9d48..fc1a209f9e0 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java @@ -7,6 +7,8 @@ import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogUseCompetitorsFromRaceLogEventImpl; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.ControlPoint; @@ -15,6 +17,7 @@ import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.SharedDomainFactory; +import com.sap.sailing.domain.common.racelog.tracking.CompetitorRegistrationOnRaceLogDisabledException; import com.sap.sailing.domain.common.racelog.tracking.NotDenotableForRaceLogTrackingException; import com.sap.sailing.domain.common.racelog.tracking.NotDenotedForRaceLogTrackingException; import com.sap.sailing.domain.common.racelog.tracking.RaceLogTrackingState; @@ -82,8 +85,12 @@ public interface RaceLogTrackingAdapter { /** * If not yet registered, register the competitors in {@code competitors}, and unregister all already registered * competitors not in {@code competitors}. + * + * @throws CompetitorRegistrationOnRaceLogDisabledException + * if no {@link RaceLogUseCompetitorsFromRaceLogEvent} is present in the RaceLog */ - void registerCompetitors(RacingEventService service, RaceLog raceLog, Set competitors); + void registerCompetitors(RacingEventService service, RaceLog raceLog, Set competitors) + throws CompetitorRegistrationOnRaceLogDisabledException; /** * If not yet registered, register the competitors in {@code competitors}, and unregister all already registered @@ -108,15 +115,16 @@ public interface RaceLogTrackingAdapter { String emails, Locale locale) throws MailException; /** - * Copy the course in the newest {@link RaceLogCourseDesignChangedEvent} in {@code from} race log to the - * {@code to} race logs. The {@link Mark}s and {@link ControlPoint}s are reused and not duplicated. + * Copy the course in the newest {@link RaceLogCourseDesignChangedEvent} in {@code from} race log to the {@code to} + * race logs. The {@link Mark}s and {@link ControlPoint}s are reused and not duplicated. */ void copyCourse(RaceLog fromRaceLog, Set toRaceLogs, SharedDomainFactory baseDomainFactory, RacingEventService service); /** - * Duplicate the competitor registrations from the {@code from} race log to the {@code to} race logs. + * Duplicate the competitor registrations from the {@code from} race log to the {@code to} race logs. If a RaceLog + * is not set to use the CompetitorRegistrations on itself via {@link RaceLogUseCompetitorsFromRaceLogEvent}, + * the RaceLog is set to use its own by adding a {@link RaceLogUseCompetitorsFromRaceLogEventImpl} */ - void copyCompetitors(RaceLog from, Set to, - RacingEventService service); + void copyCompetitors(RaceLog from, Set to, RacingEventService service); } diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogConnectivityParams.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogConnectivityParams.java index 1c5c8928bab..acb440a692a 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogConnectivityParams.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogConnectivityParams.java @@ -9,12 +9,14 @@ import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceInformationFinder; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.DomainFactory; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.impl.RegattaImpl; +import com.sap.sailing.domain.common.racelog.tracking.DoesNotHaveRegattaLogException; import com.sap.sailing.domain.common.racelog.tracking.RaceNotCreatedException; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.racelog.tracking.GPSFixStore; @@ -97,6 +99,14 @@ public class RaceLogConnectivityParams implements RaceTrackingConnectivityParame public Leaderboard getLeaderboard() { return leaderboard; } + + public RegattaLog getRegattaLog() throws DoesNotHaveRegattaLogException { + if (leaderboard instanceof HasRegattaLike) { + return (((HasRegattaLike) leaderboard).getRegattaLike().getRegattaLog()); + } else { + throw new DoesNotHaveRegattaLogException(); + } + } public RacingEventService getService() { return service; diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java index b7b74d164f1..772172d3d25 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java @@ -15,13 +15,13 @@ import java.util.logging.Logger; import com.sap.sailing.domain.abstractlog.AbstractLog; import com.sap.sailing.domain.abstractlog.MultiLogAnalyzer; import com.sap.sailing.domain.abstractlog.MultiLogAnalyzer.MapWithValueCollectionReducer; -import com.sap.sailing.domain.abstractlog.MultiLogAnalyzer.SetReducer; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogEndOfTrackingEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; import com.sap.sailing.domain.abstractlog.race.RaceLogStartOfTrackingEvent; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.LastPublishedCourseDesignFinder; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogRegisteredCompetitorsAnalyzer; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver; import com.sap.sailing.domain.abstractlog.race.impl.BaseRaceLogEventVisitor; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent; @@ -31,6 +31,7 @@ import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMapping import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceInformationFinder; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RegisteredCompetitorsFinder; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDefineMarkEvent; @@ -39,7 +40,6 @@ import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMarkMap import com.sap.sailing.domain.abstractlog.regatta.impl.BaseRegattaLogEventVisitor; import com.sap.sailing.domain.abstractlog.shared.analyzing.DeviceCompetitorMappingFinder; import com.sap.sailing.domain.abstractlog.shared.analyzing.DeviceMarkMappingFinder; -import com.sap.sailing.domain.abstractlog.shared.analyzing.RegisteredCompetitorsAnalyzer; import com.sap.sailing.domain.abstractlog.shared.events.DefineMarkEvent; import com.sap.sailing.domain.abstractlog.shared.events.DeviceCompetitorMappingEvent; import com.sap.sailing.domain.abstractlog.shared.events.DeviceMarkMappingEvent; @@ -62,6 +62,7 @@ import com.sap.sailing.domain.common.PassingInstruction; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.TrackedRaceStatusEnum; import com.sap.sailing.domain.common.abstractlog.NotRevokableException; +import com.sap.sailing.domain.common.racelog.tracking.DoesNotHaveRegattaLogException; import com.sap.sailing.domain.common.racelog.tracking.RaceLogTrackingState; import com.sap.sailing.domain.common.racelog.tracking.RaceNotCreatedException; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; @@ -476,8 +477,18 @@ public class RaceLogRaceTracker implements RaceTracker, GPSFixReceivedListener { throw new RaceNotCreatedException(String.format("Race for racelog (%s) has already been created", raceLog)); } // check both the racelog and regattalog for registered competitors - Set competitors = new MultiLogAnalyzer<>(RegisteredCompetitorsAnalyzer.Factory.INSTANCE, - new SetReducer(), params.getLogHierarchy()).analyze(); + + Set competitors; + try { + RegattaLog regattaLog = params.getRegattaLog(); + competitors = new RegisteredCompetitorsFinder(raceLog, regattaLog).analyze(); + } catch (DoesNotHaveRegattaLogException e) { + logger.warning(params.getLeaderboard().getName()+" doesn't have an attached RegattaLog"); + competitors = new RaceLogRegisteredCompetitorsAnalyzer(raceLog).analyze(); + } + + + Serializable raceId = denoteEvent.getRaceId(); final RaceDefinition raceDef = new RaceDefinitionImpl(raceName, course, boatClass, competitors, raceId); Iterable sidelines = Collections. emptyList(); diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java index 88355c0e8e7..7d5bdb79577 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java @@ -33,13 +33,14 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogEventFactory; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.LastPublishedCourseDesignFinder; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogUsesOwnCompetitorsAnalyzer; +import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogUseCompetitorsFromRaceLogEventImpl; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceMarkMappingEventImpl; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogRegisterCompetitorEventImpl; -import com.sap.sailing.domain.abstractlog.shared.analyzing.RegisteredCompetitorsAnalyzer; +import com.sap.sailing.domain.abstractlog.shared.analyzing.CompetitorsInLogAnalyzer; import com.sap.sailing.domain.abstractlog.shared.events.RegisterCompetitorEvent; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; @@ -55,6 +56,7 @@ import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.base.impl.CourseDataImpl; import com.sap.sailing.domain.common.RegattaIdentifier; import com.sap.sailing.domain.common.abstractlog.NotRevokableException; +import com.sap.sailing.domain.common.racelog.tracking.CompetitorRegistrationOnRaceLogDisabledException; import com.sap.sailing.domain.common.racelog.tracking.DeviceMappingConstants; import com.sap.sailing.domain.common.racelog.tracking.NotDenotableForRaceLogTrackingException; import com.sap.sailing.domain.common.racelog.tracking.NotDenotedForRaceLogTrackingException; @@ -232,9 +234,16 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter { @Override public void copyCompetitors(RaceLog fromRaceLog, Set toRaceLogs, RacingEventService service) { - final Set competitors = new RegisteredCompetitorsAnalyzer<>(fromRaceLog).analyze(); + final Set competitors = new CompetitorsInLogAnalyzer<>(fromRaceLog).analyze(); for (RaceLog toRaceLog : toRaceLogs) { - registerCompetitors(service, toRaceLog, competitors); + try { + registerCompetitors(service, toRaceLog, competitors); + } catch (CompetitorRegistrationOnRaceLogDisabledException e) { + int passId = toRaceLog.getCurrentPassId(); + TimePoint now = MillisecondsTimePoint.now(); + toRaceLog.add(new RaceLogUseCompetitorsFromRaceLogEventImpl(now, service.getServerAuthor(), now, UUID.randomUUID(), passId)); + try { registerCompetitors(service, toRaceLog, competitors); } catch (CompetitorRegistrationOnRaceLogDisabledException e1) {/*cannot happen*/} + } } } @@ -282,7 +291,7 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter { private , EventT extends AbstractLogEvent, VisitorT> void registerCompetitors( AbstractLogEventAuthor author, LogT log, Set competitors, Function registerEventFactory) { - Set alreadyRegistered = new HashSet(new RegisteredCompetitorsAnalyzer<>(log).analyze()); + Set alreadyRegistered = new HashSet(new CompetitorsInLogAnalyzer<>(log).analyze()); Set toBeRegistered = new HashSet(); for (Competitor c : competitors) { @@ -315,13 +324,19 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter { } @Override - public void registerCompetitors(RacingEventService service, RaceLog raceLog, Set competitors) { - registerCompetitors( - service.getServerAuthor(), - raceLog, - competitors, - c -> RaceLogEventFactory.INSTANCE.createRegisterCompetitorEvent(MillisecondsTimePoint.now(), - service.getServerAuthor(), raceLog.getCurrentPassId(), c)); + public void registerCompetitors(RacingEventService service, RaceLog raceLog, Set competitors) throws CompetitorRegistrationOnRaceLogDisabledException { + if (new RaceLogUsesOwnCompetitorsAnalyzer(raceLog).analyze()){ + registerCompetitors( + service.getServerAuthor(), + raceLog, + competitors, + c -> RaceLogEventFactory.INSTANCE.createRegisterCompetitorEvent(MillisecondsTimePoint.now(), + service.getServerAuthor(), raceLog.getCurrentPassId(), c)); + } else { + logger.warning("Not performing competitor registration on RaceLog as no RaceLogUseCompetitorsFromRaceLogEvent " + + "is present and therefore competitors should be registered on RegattaLog"); + throw new CompetitorRegistrationOnRaceLogDisabledException(); + } } @Override diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/MultiLogAnalyzerTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/MultiLogAnalyzerTest.java index 02ceb503d7e..9b0d109f25d 100644 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/MultiLogAnalyzerTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/MultiLogAnalyzerTest.java @@ -2,11 +2,9 @@ package com.sap.sailing.domain.racelog.analyzing.test; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.hasItem; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.UUID; import org.junit.Before; @@ -18,13 +16,10 @@ import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceCompetitorMappingEventImpl; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogRegisterCompetitorEventImpl; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceCompetitorMappingEventImpl; -import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogRegisterCompetitorEventImpl; import com.sap.sailing.domain.abstractlog.regatta.impl.RegattaLogImpl; import com.sap.sailing.domain.abstractlog.shared.analyzing.DeviceMappingFinder; -import com.sap.sailing.domain.abstractlog.shared.analyzing.RegisteredCompetitorsAnalyzer; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.impl.CompetitorImpl; import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; @@ -43,10 +38,6 @@ public class MultiLogAnalyzerTest { return new MillisecondsTimePoint(millis); } - private static UUID uuid() { - return UUID.randomUUID(); - } - private RaceLog raceLog; private RegattaLog regattaLog; private AbstractLogEventAuthor author; @@ -66,28 +57,6 @@ public class MultiLogAnalyzerTest { author = new LogEventAuthorImpl("test", 0); } - @Test - public void registerCompetitorsInRaceAndRegattaLog() { - Competitor c1 = createCompetitor(1); - Competitor c2 = createCompetitor(2); - Competitor c3 = createCompetitor(3); - - raceLog.add(new RaceLogRegisterCompetitorEventImpl(now(), author, now(), uuid(), 0, c1)); - regattaLog.add(new RegattaLogRegisterCompetitorEventImpl(now(), author, now(), uuid(), c2)); - - raceLog.add(new RaceLogRegisterCompetitorEventImpl(now(), author, now(), uuid(), 0, c3)); - regattaLog.add(new RegattaLogRegisterCompetitorEventImpl(now(), author, now(), uuid(), c3)); - - Set result = new MultiLogAnalyzer<>( - RegisteredCompetitorsAnalyzer.Factory.INSTANCE, new MultiLogAnalyzer.SetReducer(), raceLog, - regattaLog).analyze(); - - assertThat("competitor 1 added", result, hasItem(c1)); - assertThat("competitor 2 added", result, hasItem(c2)); - assertThat("competitor 3 added", result, hasItem(c3)); - assertThat("only three items in total", result.size(), equalTo(3)); - } - @Test public void deviceMappingsInRaceAndRegattaLog() { Competitor c1 = createCompetitor(1); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventFactory.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventFactory.java index 88a4b65c599..785bc819ba4 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventFactory.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventFactory.java @@ -14,6 +14,7 @@ import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorM import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseBase; @@ -148,5 +149,7 @@ public interface RaceLogEventFactory { RaceLogEndOfTrackingEvent createEndOfTrackingEvent(TimePoint endOfTracking, AbstractLogEventAuthor author, Serializable id, List competitors, Integer passId); + RaceLogUseCompetitorsFromRaceLogEvent createUseCompetitorsFromRaceLogEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, + Serializable id, Integer passId); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventRestoreFactory.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventRestoreFactory.java index 1219911d501..e25f4962390 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventRestoreFactory.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventRestoreFactory.java @@ -103,4 +103,6 @@ public interface RaceLogEventRestoreFactory extends RaceLogEventFactory { RaceLogDependentStartTimeEvent createDependentStartTimeEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List involvedBoats, int passId, SimpleRaceLogIdentifier dependentOnRace, Duration startTimeDifference, RaceLogRaceStatus nextStatus); + + RaceLogEvent createUseCompetitorsFromRaceLogEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, Integer passId); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventVisitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventVisitor.java index 77174f3ac21..bb161350d9e 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventVisitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventVisitor.java @@ -8,6 +8,7 @@ import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorM import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; public interface RaceLogEventVisitor { @@ -64,4 +65,6 @@ public interface RaceLogEventVisitor { public void visit(RaceLogStartOfTrackingEvent event); public void visit(RaceLogEndOfTrackingEvent event); + + public void visit(RaceLogUseCompetitorsFromRaceLogEvent event); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceLogRegisteredCompetitorsAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceLogRegisteredCompetitorsAnalyzer.java new file mode 100644 index 00000000000..a934b1517c5 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceLogRegisteredCompetitorsAnalyzer.java @@ -0,0 +1,27 @@ +package com.sap.sailing.domain.abstractlog.race.analyzing.impl; + +import java.util.HashSet; +import java.util.Set; + +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogUsesOwnCompetitorsAnalyzer; +import com.sap.sailing.domain.abstractlog.shared.analyzing.CompetitorsInLogAnalyzer; +import com.sap.sailing.domain.base.Competitor; + +public class RaceLogRegisteredCompetitorsAnalyzer extends RaceLogAnalyzer> { + + public RaceLogRegisteredCompetitorsAnalyzer(RaceLog raceLog) { + super(raceLog); + } + + @Override + protected Set performAnalysis() { + if (new RaceLogUsesOwnCompetitorsAnalyzer(getLog()).analyze()){ + //get Events from RaceLog + return new CompetitorsInLogAnalyzer<>(getLog()).analyze(); + } else { + //get Events from RegattaLog + return new HashSet(); + } + } +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/AbstractRaceLogChangedVisitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/AbstractRaceLogChangedVisitor.java index d042544fb76..33de5dd8dd7 100755 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/AbstractRaceLogChangedVisitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/AbstractRaceLogChangedVisitor.java @@ -29,6 +29,7 @@ import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorM import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; public abstract class AbstractRaceLogChangedVisitor implements RaceLogEventVisitor { protected abstract void notifyListenerAboutEventAdded(RaceLogEvent event); @@ -161,4 +162,9 @@ public abstract class AbstractRaceLogChangedVisitor implements RaceLogEventVisit public void visit(RaceLogEndOfTrackingEvent event) { notifyListenerAboutEventAdded(event); } + + @Override + public void visit(RaceLogUseCompetitorsFromRaceLogEvent event) { + notifyListenerAboutEventAdded(event); + } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/BaseRaceLogEventVisitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/BaseRaceLogEventVisitor.java index f0aed5f9999..87a5d74556b 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/BaseRaceLogEventVisitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/BaseRaceLogEventVisitor.java @@ -28,6 +28,7 @@ import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorM import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; /** * Base class implementing {@link RaceLogEventVisitor}. Every method is implemented as a no-op. @@ -168,4 +169,9 @@ public abstract class BaseRaceLogEventVisitor implements RaceLogEventVisitor { public void visit(RaceLogStartOfTrackingEvent event) { } + + @Override + public void visit(RaceLogUseCompetitorsFromRaceLogEvent event) { + + } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogEventFactoryImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogEventFactoryImpl.java index ff3b35d6a20..70f5cb10ea6 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogEventFactoryImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogEventFactoryImpl.java @@ -39,6 +39,7 @@ import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorM import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogCloseOpenEndedDeviceMappingEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDefineMarkEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDenoteForTrackingEventImpl; @@ -46,6 +47,7 @@ import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceCompet import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceMarkMappingEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogRegisterCompetitorEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogStartTrackingEventImpl; +import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogUseCompetitorsFromRaceLogEventImpl; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseBase; @@ -326,4 +328,10 @@ public class RaceLogEventFactoryImpl implements RaceLogEventFactory { List competitors, Integer passId) { return new RaceLogEndOfTrackingEventImpl(MillisecondsTimePoint.now(), author, endOfTracking, id, competitors, passId); } + + @Override + public RaceLogUseCompetitorsFromRaceLogEvent createUseCompetitorsFromRaceLogEvent(TimePoint logicalTimePoint, + AbstractLogEventAuthor author, Serializable id, Integer passId) { + return new RaceLogUseCompetitorsFromRaceLogEventImpl(MillisecondsTimePoint.now(), author, logicalTimePoint, id, passId); + } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogEventRestoreFactoryImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogEventRestoreFactoryImpl.java index 36588de8091..ef873d3d46d 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogEventRestoreFactoryImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogEventRestoreFactoryImpl.java @@ -8,6 +8,7 @@ import com.sap.sailing.domain.abstractlog.race.CompetitorResults; import com.sap.sailing.domain.abstractlog.race.RaceLogCourseAreaChangedEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogDependentStartTimeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogEventRestoreFactory; import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningListChangedEvent; @@ -39,6 +40,7 @@ import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceCompet import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceMarkMappingEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogRegisterCompetitorEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogStartTrackingEventImpl; +import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogUseCompetitorsFromRaceLogEventImpl; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseBase; @@ -198,4 +200,9 @@ public class RaceLogEventRestoreFactoryImpl extends RaceLogEventFactoryImpl impl return new RaceLogDependentStartTimeEventImpl(createdAt, author, logicalTimePoint, id, involvedBoats, passId, dependentOnRace, startTimeDifference); } + + @Override + public RaceLogEvent createUseCompetitorsFromRaceLogEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, Integer passId) { + return new RaceLogUseCompetitorsFromRaceLogEventImpl(createdAt, author, logicalTimePoint, id, passId); + } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogUseCompetitorsFromRaceLogEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogUseCompetitorsFromRaceLogEvent.java new file mode 100644 index 00000000000..dd45e37ab76 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogUseCompetitorsFromRaceLogEvent.java @@ -0,0 +1,16 @@ +package com.sap.sailing.domain.abstractlog.race.tracking; + +import com.sap.sailing.domain.abstractlog.Revokable; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; + +/** + * This is a marker event, which marks a RaceLog for using it's own competitor registrations. + * When present competitors are not registered on the RegattaLog corresponding to the RaceLog, but on the RaceLog itself. + * This is for example used for split fleets. + * + * See bug2851 + * @author D056848 + * + */ +public interface RaceLogUseCompetitorsFromRaceLogEvent extends RaceLogEvent, Revokable { +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceLogUsesOwnCompetitorsAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceLogUsesOwnCompetitorsAnalyzer.java new file mode 100644 index 00000000000..557f0e72c22 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceLogUsesOwnCompetitorsAnalyzer.java @@ -0,0 +1,30 @@ +package com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl; + +import java.util.List; + +import com.sap.sailing.domain.abstractlog.impl.AllEventsOfTypeFinder; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogAnalyzer; +import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; + +public class RaceLogUsesOwnCompetitorsAnalyzer extends RaceLogAnalyzer{ + + public RaceLogUsesOwnCompetitorsAnalyzer(RaceLog raceLog) { + super(raceLog); + } + + @Override + protected Boolean performAnalysis() { + RaceLog raceLog = getLog(); + + List event = new AllEventsOfTypeFinder<>(raceLog, /*only unrevoked*/ true, RaceLogUseCompetitorsFromRaceLogEvent.class).analyze(); + + if (event.size() >= 1){ + return true; + } else { + return false; + } + } + +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RegisteredCompetitorsFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RegisteredCompetitorsFinder.java new file mode 100644 index 00000000000..28da5b247b3 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RegisteredCompetitorsFinder.java @@ -0,0 +1,61 @@ +package com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl; + +import java.util.HashSet; +import java.util.Set; + +import com.sap.sailing.domain.abstractlog.AbstractLog; +import com.sap.sailing.domain.abstractlog.AbstractLogEvent; +import com.sap.sailing.domain.abstractlog.BaseLogAnalyzer; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogAnalyzer; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; +import com.sap.sailing.domain.abstractlog.shared.events.RegisterCompetitorEvent; +import com.sap.sailing.domain.base.Competitor; + +public class RegisteredCompetitorsFinder extends RaceLogAnalyzer> { + private RegattaLog regattaLog; + + public RegisteredCompetitorsFinder(RaceLog raceLog, RegattaLog regattaLog) { + super(raceLog); + this.regattaLog = regattaLog; + } + + @Override + protected Set performAnalysis() { + if (new RaceLogUsesOwnCompetitorsAnalyzer(getLog()).analyze()){ + //get Events from RaceLog + return new CompetitorsInLogAnalyzer<>(getLog()).analyze(); + } else { + //get Events from RegattaLog + return new CompetitorsInLogAnalyzer<>(regattaLog).analyze(); + } + } + + + /** + * Uses the {@link RegisterCompetitorEvent}s in the provided {@link AbstractLog} to determine the competitors registered in the given log. + * + * @author Fredrik Teschke + * + */ + private class CompetitorsInLogAnalyzer, EventT extends AbstractLogEvent, VisitorT> + extends BaseLogAnalyzer> { + + public CompetitorsInLogAnalyzer(LogT log) { + super(log); + } + + @Override + protected Set performAnalysis() { + Set result = new HashSet(); + + for (EventT event : getLog().getUnrevokedEvents()) { + if (event instanceof RegisterCompetitorEvent) { + result.add(((RegisterCompetitorEvent) event).getCompetitor()); + } + } + + return result; + } + } +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogUseCompetitorsFromRaceLogEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogUseCompetitorsFromRaceLogEventImpl.java new file mode 100644 index 00000000000..b80d18405aa --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogUseCompetitorsFromRaceLogEventImpl.java @@ -0,0 +1,31 @@ +package com.sap.sailing.domain.abstractlog.race.tracking.impl; + +import java.io.Serializable; + +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventImpl; +import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; +import com.sap.sse.common.TimePoint; + +public class RaceLogUseCompetitorsFromRaceLogEventImpl extends RaceLogEventImpl implements + RaceLogUseCompetitorsFromRaceLogEvent { + private static final long serialVersionUID = -5114645637316367845L; + + public RaceLogUseCompetitorsFromRaceLogEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, + TimePoint logicalTimePoint, Serializable id, int passId) + throws IllegalArgumentException { + super(createdAt, author, logicalTimePoint, id, null, passId); + } + + @Override + public String toString() { + return "This RaceLog uses the competitors registered on the RaceLog instead of the competitors on the RegattaLog"; + } + + @Override + public void accept(RaceLogEventVisitor visitor) { + visitor.visit(this); + } + +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/CompetitorsInLogAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/CompetitorsInLogAnalyzer.java new file mode 100644 index 00000000000..75631bd4af6 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/CompetitorsInLogAnalyzer.java @@ -0,0 +1,48 @@ +package com.sap.sailing.domain.abstractlog.shared.analyzing; + +import java.util.HashSet; +import java.util.Set; + +import com.sap.sailing.domain.abstractlog.AbstractLog; +import com.sap.sailing.domain.abstractlog.AbstractLogEvent; +import com.sap.sailing.domain.abstractlog.BaseLogAnalyzer; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogRegisteredCompetitorsAnalyzer; +import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RegisteredCompetitorsFinder; +import com.sap.sailing.domain.abstractlog.shared.events.RegisterCompetitorEvent; +import com.sap.sailing.domain.base.Competitor; + +/** + * This class searches for RegisterCompetitorEvents in the given log. + * + * TLDR: It's likely, that you shouldn't use this, but you might want to use {@link RegisteredCompetitorsFinder} or {@link RaceLogRegisteredCompetitorsAnalyzer} + * + * Note that solemnly analyzing a certain race or RegattaLog my not lead the correct registered competitors for the race + * corresponding to the RaceLog/the races corresponding to the RegattaLog. + * + * This is the case as by default the competitors registered on the RegattaLog are used for each race of the regatta + * ignoring the ones in the RaceLog (if present). The RaceLog may override this behavior with the + * {@link RaceLogUseCompetitorsFromRaceLogEvent}. Is an event of this type present, the competitors written into the + * RaceLog are used instead of the competitors in the RegattaLog. + * + */ +public class CompetitorsInLogAnalyzer, EventT extends AbstractLogEvent, VisitorT> + extends BaseLogAnalyzer> { + + public CompetitorsInLogAnalyzer(LogT log) { + super(log); + } + + @Override + protected Set performAnalysis() { + Set result = new HashSet(); + + for (EventT event : getLog().getUnrevokedEvents()) { + if (event instanceof RegisterCompetitorEvent) { + result.add(((RegisterCompetitorEvent) event).getCompetitor()); + } + } + + return result; + } +} \ No newline at end of file diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/RegisteredCompetitorsAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/RegisteredCompetitorsAnalyzer.java deleted file mode 100644 index 5a533a1a6e1..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/RegisteredCompetitorsAnalyzer.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.sap.sailing.domain.abstractlog.shared.analyzing; - -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import com.sap.sailing.domain.abstractlog.AbstractLog; -import com.sap.sailing.domain.abstractlog.AbstractLogEvent; -import com.sap.sailing.domain.abstractlog.BaseLogAnalyzer; -import com.sap.sailing.domain.abstractlog.MultiLogAnalyzer.AnalyzerFactory; -import com.sap.sailing.domain.abstractlog.race.RaceLog; -import com.sap.sailing.domain.abstractlog.shared.events.RegisterCompetitorEvent; -import com.sap.sailing.domain.base.Competitor; - -/** - * Uses the {@link RegisterCompetitorEvent}s in the {@link RaceLog} to determine the competitors registered for this - * event. - * - * @author Fredrik Teschke - * - */ -public class RegisteredCompetitorsAnalyzer, EventT extends AbstractLogEvent, VisitorT> - extends BaseLogAnalyzer> { - - public static enum Factory implements AnalyzerFactory> { - INSTANCE; - - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public RegisteredCompetitorsAnalyzer createAnalyzer(AbstractLog log) { - return new RegisteredCompetitorsAnalyzer(log); - } - } - - public RegisteredCompetitorsAnalyzer(LogT log) { - super(log); - } - - @Override - protected Set performAnalysis() { - Set result = new HashSet(); - - for (EventT event : getLog().getUnrevokedEvents()) { - if (event instanceof RegisterCompetitorEvent) { - result.add(((RegisterCompetitorEvent) event).getCompetitor()); - } - } - - return result; - } - -} diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CompetitorProviderCacheInvalidationTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CompetitorProviderCacheInvalidationTest.java index 2d261296651..a6bdfc9aebc 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CompetitorProviderCacheInvalidationTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CompetitorProviderCacheInvalidationTest.java @@ -18,8 +18,10 @@ import org.junit.Test; import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogEventFactory; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogUseCompetitorsFromRaceLogEventImpl; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogRegisterCompetitorEventImpl; @@ -106,7 +108,8 @@ public class CompetitorProviderCacheInvalidationTest extends AbstractLeaderboard flexibleLeaderboard.addRaceColumn("R1", /* medalRace */ false); RaceLog raceLog = flexibleLeaderboard.getRacelog("R1", LeaderboardNameConstants.DEFAULT_FLEET_NAME); final int passId = 1; - final LogEventAuthorImpl author = new LogEventAuthorImpl("Me", 0); + final LogEventAuthorImpl author = new LogEventAuthorImpl("Me", 0); + raceLog.add(RaceLogEventFactory.INSTANCE.createUseCompetitorsFromRaceLogEvent(MillisecondsTimePoint.now(), author, UUID.randomUUID(), passId)); final Map competitorOnRaceLogRegistrationEvents = new HashMap<>(); for (Competitor c : compLists[0]) { final RaceLogRegisterCompetitorEvent registerCompetitorEvent = RaceLogEventFactory.INSTANCE.createRegisterCompetitorEvent(MillisecondsTimePoint.now(), author, passId, c); @@ -170,19 +173,28 @@ public class CompetitorProviderCacheInvalidationTest extends AbstractLeaderboard regattaLog.add(new RegattaLogRegisterCompetitorEventImpl(MillisecondsTimePoint.now(), new LogEventAuthorImpl("Me", 0), MillisecondsTimePoint.now(), UUID.randomUUID(), c)); } RaceLog raceLog = flexibleLeaderboard.getRacelog("R1", LeaderboardNameConstants.DEFAULT_FLEET_NAME); + final LogEventAuthorImpl author = new LogEventAuthorImpl("Me", 0); + int passId = 1; + raceLog.add(RaceLogEventFactory.INSTANCE.createUseCompetitorsFromRaceLogEvent(MillisecondsTimePoint.now(), author, UUID.randomUUID(), passId)); for (Competitor c : compLists[1]) { - raceLog.add(RaceLogEventFactory.INSTANCE.createRegisterCompetitorEvent(MillisecondsTimePoint.now(), new LogEventAuthorImpl("Me", 0), 1, c)); + raceLog.add(RaceLogEventFactory.INSTANCE.createRegisterCompetitorEvent(MillisecondsTimePoint.now(), author, passId, c)); } + //expected are all competitors, because the getAllCopmetitors method is called + //this includes competitors Registered in the RaceLogs, for which the RaceLog + //is denoted with the RaceLogUseCompetitorsFromRaceLogEvent as well as the competitors in the RegattaLog Set expected = new HashSet<>(compLists[0]); expected.addAll(compLists[1]); Set actual = new HashSet<>(); Util.addAll(competitorProviderFlexibleLeaderboard.getAllCompetitors(), actual); assertEquals(expected, actual); Set actualForRace = new HashSet<>(); + + //For the race only the competitors registered on RaceLog as RaceLogUseCompetitorsFromRaceLogEvent is present + Set expectedForRace = new HashSet<>(compLists[1]); Util.addAll(competitorProviderFlexibleLeaderboard.getAllCompetitors( flexibleLeaderboard.getRaceColumnByName("R1"), flexibleLeaderboard.getFleet(LeaderboardNameConstants.DEFAULT_FLEET_NAME)), actualForRace); - assertEquals(expected, actualForRace); + assertEquals(expectedForRace, actualForRace); } @Test @@ -250,8 +262,11 @@ public class CompetitorProviderCacheInvalidationTest extends AbstractLeaderboard @Test public void testSimpleCompetitorListOnOneRaceLogInRegattaLeaderboard() { RaceLog raceLog = regattaLeaderboard.getRacelog("R1", "Yellow"); + final LogEventAuthorImpl author = new LogEventAuthorImpl("Me", 0); + int passId = 1; + raceLog.add(RaceLogEventFactory.INSTANCE.createUseCompetitorsFromRaceLogEvent(MillisecondsTimePoint.now(), author, UUID.randomUUID(), passId)); for (Competitor c : compLists[0]) { - raceLog.add(RaceLogEventFactory.INSTANCE.createRegisterCompetitorEvent(MillisecondsTimePoint.now(), new LogEventAuthorImpl("Me", 0), 1, c)); + raceLog.add(RaceLogEventFactory.INSTANCE.createRegisterCompetitorEvent(MillisecondsTimePoint.now(), author, passId, c)); } Set expected = new HashSet<>(compLists[0]); Set actual = new HashSet<>(); @@ -306,6 +321,7 @@ public class CompetitorProviderCacheInvalidationTest extends AbstractLeaderboard } final RaceLog raceLog = regattaLeaderboard.getRacelog("R1", "Yellow"); final int passId = 1; + raceLog.add(RaceLogEventFactory.INSTANCE.createUseCompetitorsFromRaceLogEvent(MillisecondsTimePoint.now(), author, UUID.randomUUID(), passId)); final Map competitorOnRaceLogRegistrationEvents = new HashMap<>(); for (Competitor c : compLists[passId]) { final RaceLogRegisterCompetitorEvent registerCompetitorEvent = RaceLogEventFactory.INSTANCE.createRegisterCompetitorEvent(MillisecondsTimePoint.now(), author, passId, c); @@ -324,14 +340,15 @@ public class CompetitorProviderCacheInvalidationTest extends AbstractLeaderboard Util.addAll(regattaLeaderboard.getCompetitors(), actualWithoutSuppressed); assertEquals(expectedWithoutSuppressed, actualWithoutSuppressed); Set actualForRaceYellow = new HashSet<>(); + Set expectedFoRaceYellow = new HashSet<>(compLists[passId]); Util.addAll(competitorProviderRegattaLeaderboard.getAllCompetitors( regattaLeaderboard.getRaceColumnByName("R1"), regattaLeaderboard.getFleet("Yellow")), actualForRaceYellow); - assertEquals(expected, actualForRaceYellow); + assertEquals(expectedFoRaceYellow, actualForRaceYellow); actualForRaceYellow = new HashSet<>(); // try another time; cache should of course yield an equal result (although // we're not asserting here that the result actually comes from the cache) Util.addAll(competitorProviderRegattaLeaderboard.getAllCompetitors( regattaLeaderboard.getRaceColumnByName("R1"), regattaLeaderboard.getFleet("Yellow")), actualForRaceYellow); - assertEquals(expected, actualForRaceYellow); + assertEquals(expectedFoRaceYellow, actualForRaceYellow); // But now it gets interesting: we're revoking a competitor registration on the race log and assert // that the competitor is gone from the list: final Competitor competitorToRevokeFromRaceLog = compLists[passId].get(2); @@ -340,9 +357,9 @@ public class CompetitorProviderCacheInvalidationTest extends AbstractLeaderboard // we're not asserting here that the result actually comes from the cache) Util.addAll(competitorProviderRegattaLeaderboard.getAllCompetitors( regattaLeaderboard.getRaceColumnByName("R1"), regattaLeaderboard.getFleet("Yellow")), actualForRaceYellow); - expected.remove(competitorToRevokeFromRaceLog); - assertEquals(expected.size(), actualForRaceYellow.size()); - assertEquals(expected, actualForRaceYellow); + expectedFoRaceYellow.remove(competitorToRevokeFromRaceLog); + assertEquals(expectedFoRaceYellow.size(), actualForRaceYellow.size()); + assertEquals(expectedFoRaceYellow, actualForRaceYellow); } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java index 35b50df4d28..4d526ea3707 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java @@ -10,7 +10,7 @@ import java.util.Set; import java.util.logging.Logger; import com.sap.sailing.domain.abstractlog.race.RaceLog; -import com.sap.sailing.domain.abstractlog.shared.analyzing.RegisteredCompetitorsAnalyzer; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogRegisteredCompetitorsAnalyzer; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; @@ -231,7 +231,7 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem // race exists, its competitors set takes precedence over what's in the race log. Usually, // the tracked race will have the same competitors as those in the race log, or more because // those from the regatta log are added to the tracked race as well. - Set viaRaceLog = new RegisteredCompetitorsAnalyzer<>(getRaceLog(fleet)).analyze(); + Set viaRaceLog = new RaceLogRegisteredCompetitorsAnalyzer(getRaceLog(fleet)).analyze(); result.addAll(viaRaceLog); } } @@ -249,7 +249,7 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem // race exists, its competitors set takes precedence over what's in the race log. Usually, // the tracked race will have the same competitors as those in the race log, or more because // those from the regatta log are added to the tracked race as well. - Set viaRaceLog = new RegisteredCompetitorsAnalyzer<>(getRaceLog(fleet)).analyze(); + Set viaRaceLog = new RaceLogRegisteredCompetitorsAnalyzer(getRaceLog(fleet)).analyze(); result = viaRaceLog; } return result; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java index 43a03747b95..b9654b1626d 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java @@ -2,15 +2,15 @@ package com.sap.sailing.domain.base.impl; import java.io.Serializable; -import com.sap.sailing.domain.abstractlog.race.RaceLogEndOfTrackingEvent; -import com.sap.sailing.domain.abstractlog.race.RaceLogFixedMarkPassingEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogCourseAreaChangedEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogDependentStartTimeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEndOfTrackingEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningListChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFixedMarkPassingEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogGateLineOpeningTimeEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogPassChangeEvent; @@ -21,8 +21,8 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogRevokeEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogStartOfTrackingEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogStartProcedureChangedEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent; -import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogSuppressedMarkPassingsEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; import com.sap.sailing.domain.abstractlog.race.scoring.RaceLogAdditionalScoringInformationEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent; @@ -31,6 +31,7 @@ import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorM import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.racelog.RaceLogIdentifier; @@ -186,4 +187,9 @@ public class RaceColumnRaceLogReplicator implements RaceLogEventVisitor, Seriali public void visit(RaceLogEndOfTrackingEvent event) { notifyOnAdd(event); } + + @Override + public void visit(RaceLogUseCompetitorsFromRaceLogEvent event) { + notifyOnAdd(event); + } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/CompetitorProviderFromRaceColumnsAndRegattaLike.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/CompetitorProviderFromRaceColumnsAndRegattaLike.java index fbf18e485bc..f1143798fa3 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/CompetitorProviderFromRaceColumnsAndRegattaLike.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/CompetitorProviderFromRaceColumnsAndRegattaLike.java @@ -11,12 +11,14 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; import com.sap.sailing.domain.abstractlog.race.RaceLogRevokeEvent; import com.sap.sailing.domain.abstractlog.race.impl.BaseRaceLogEventVisitor; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RegisteredCompetitorsFinder; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogRevokeEvent; import com.sap.sailing.domain.abstractlog.regatta.impl.BaseRegattaLogEventVisitor; -import com.sap.sailing.domain.abstractlog.shared.analyzing.RegisteredCompetitorsAnalyzer; +import com.sap.sailing.domain.abstractlog.shared.analyzing.CompetitorsInLogAnalyzer; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; @@ -29,30 +31,32 @@ import com.sap.sse.common.Util.Pair; /** * A caching provider of a competitor set, based on the tracked races and {@link RaceLog}s of the {@link RaceColumn}s of - * a {@link HasRaceColumnsAndRegattaLike} and the {@link RegattaLog} of the same object. After an answer has been provided, - * it is cached. The cache is invalidated when one of the following events occurs: + * a {@link HasRaceColumnsAndRegattaLike} and the {@link RegattaLog} of the same object. After an answer has been + * provided, it is cached. The cache is invalidated when one of the following events occurs: *
    *
  • a competitor is registered with or unregistered from a race log of any of the race columns or the regatta log
  • *
  • a race column is added or removed
  • *
  • a tracked race is linked to or unlinked from any of the race columns
  • + *
  • the racelog is marked as providing it's own competitors via the {@link RaceLogUseCompetitorsFromRaceLogEvent}
  • *
* * @author Axel Uhl (d043530) * */ public class CompetitorProviderFromRaceColumnsAndRegattaLike { - private static final Logger logger = Logger.getLogger(CompetitorProviderFromRaceColumnsAndRegattaLike.class.getName()); - + private static final Logger logger = Logger.getLogger(CompetitorProviderFromRaceColumnsAndRegattaLike.class + .getName()); + private final HasRaceColumnsAndRegattaLike provider; private final RegattaLogEventVisitor regattaLogCompetitorsCacheInvalidationListener; private final RaceLogEventVisitor raceLogCompetitorsCacheInvalidationListener; - + private final RaceColumnListener raceColumnListener; private Iterable allCompetitorsCache; - + private final ConcurrentHashMap, Iterable> allCompetitorsCacheByRace; public CompetitorProviderFromRaceColumnsAndRegattaLike(HasRaceColumnsAndRegattaLike provider) { @@ -75,11 +79,13 @@ public class CompetitorProviderFromRaceColumnsAndRegattaLike { @Override public void visit(RegattaLogRevokeEvent event) { try { - if (RegattaLogRegisterCompetitorEvent.class.isAssignableFrom(Class.forName(event.getRevokedEventType()))) { + if (RegattaLogRegisterCompetitorEvent.class.isAssignableFrom(Class.forName(event + .getRevokedEventType()))) { invalidateAllCompetitorsCaches(); } } catch (ClassNotFoundException e) { - logger.log(Level.WARNING, "Problem occurred trying to resolve revoked event class "+event.getRevokedEventType(), e); + logger.log(Level.WARNING, + "Problem occurred trying to resolve revoked event class " + event.getRevokedEventType(), e); } } }; @@ -89,14 +95,21 @@ public class CompetitorProviderFromRaceColumnsAndRegattaLike { invalidateAllCompetitorsCaches(); } + @Override + public void visit(RaceLogUseCompetitorsFromRaceLogEvent event) { + invalidateAllCompetitorsCaches(); + } + @Override public void visit(RaceLogRevokeEvent event) { try { - if (RaceLogRegisterCompetitorEvent.class.isAssignableFrom(Class.forName(event.getRevokedEventType()))) { + if (RaceLogRegisterCompetitorEvent.class + .isAssignableFrom(Class.forName(event.getRevokedEventType()))) { invalidateAllCompetitorsCaches(); } } catch (ClassNotFoundException e) { - logger.log(Level.WARNING, "Problem occurred trying to resolve revoked event class "+event.getRevokedEventType(), e); + logger.log(Level.WARNING, + "Problem occurred trying to resolve revoked event class " + event.getRevokedEventType(), e); } } }; @@ -104,7 +117,8 @@ public class CompetitorProviderFromRaceColumnsAndRegattaLike { private static final long serialVersionUID = -8678230058730043052L; @Override - public void defaultAction() {} + public void defaultAction() { + } /** * As the entire provider object is considered transient, its listeners are so, too. @@ -135,7 +149,7 @@ public class CompetitorProviderFromRaceColumnsAndRegattaLike { } }; } - + public Iterable getAllCompetitors() { if (allCompetitorsCache == null) { final Set result = new HashSet<>(); @@ -153,23 +167,25 @@ public class CompetitorProviderFromRaceColumnsAndRegattaLike { } return allCompetitorsCache; } - + /** - * Obtains competitors from the regatta log and adds those from the tracked race for the - * raceColumn/fleet combination or the race log, if no tracked race is attached for this - * combination. Does not eliminate suppressed competitors. + * Obtains competitors from the regatta log and adds those from the tracked race for the raceColumn/fleet + * combination or the race log, if no tracked race is attached for this combination. Does not eliminate + * suppressed competitors. */ public Iterable getAllCompetitors(final RaceColumn raceColumn, final Fleet fleet) { Pair key = new Pair<>(raceColumn, fleet); Iterable result = allCompetitorsCacheByRace.get(key); if (result == null) { - final Set resultSet = new HashSet<>(); + final Set resultSet = new HashSet<>(); Util.addAll(raceColumn.getAllCompetitors(fleet), resultSet); - // note: adding listeners is idempotent; at most one occurrence of this listener exists in the race log's listeners set + // note: adding listeners is idempotent; at most one occurrence of this listener exists in the race log's + // listeners set raceColumn.getRaceLog(fleet).addListener(raceLogCompetitorsCacheInvalidationListener); provider.addRaceColumnListener(raceColumnListener); // consider {@link RegattaLog} - Set viaLog = getCompetitorsFromRegattaLogAndRegisterAsRegattaLogListener(); + Set viaLog = getCompetitorsForRaceAndRegisterAsRegattaLogListener(raceColumn + .getRaceLog(fleet)); resultSet.addAll(viaLog); result = resultSet; allCompetitorsCacheByRace.put(key, result); @@ -177,27 +193,42 @@ public class CompetitorProviderFromRaceColumnsAndRegattaLike { return result; } + private Set getCompetitorsForRaceAndRegisterAsRegattaLogListener(RaceLog racelog) { + Set viaLog = new RegisteredCompetitorsFinder(racelog, provider.getRegattaLike().getRegattaLog()) + .analyze(); + // note: adding listeners is idempotent; at most one occurrence of this listener exists in the regatta log's + // listeners set + provider.getRegattaLike().getRegattaLog().addListener(regattaLogCompetitorsCacheInvalidationListener); + return viaLog; + } + private Set getCompetitorsFromRegattaLogAndRegisterAsRegattaLogListener() { - Set viaLog = new RegisteredCompetitorsAnalyzer<>(provider.getRegattaLike().getRegattaLog()).analyze(); - // note: adding listeners is idempotent; at most one occurrence of this listener exists in the regatta log's listeners set + Set viaLog = new CompetitorsInLogAnalyzer<>(provider.getRegattaLike().getRegattaLog()).analyze(); + // note: adding listeners is idempotent; at most one occurrence of this listener exists in the regatta log's + // listeners set provider.getRegattaLike().getRegattaLog().addListener(regattaLogCompetitorsCacheInvalidationListener); return viaLog; } private void invalidateAllCompetitorsCaches() { allCompetitorsCache = null; - // note: adding listeners was idempotent; at most one occurrence of this listener exists in the regatta log's listeners set + // note: adding listeners was idempotent; at most one occurrence of this listener exists in the regatta log's + // listeners set provider.getRegattaLike().getRegattaLog().removeListener(regattaLogCompetitorsCacheInvalidationListener); for (final RaceColumn rc : provider.getRaceColumns()) { for (final Fleet fleet : rc.getFleets()) { - // note: adding listeners was idempotent; at most one occurrence of this listener exists in the race log's listeners set + // note: adding listeners was idempotent; at most one occurrence of this listener exists in the race + // log's listeners set rc.getRaceLog(fleet).removeListener(raceLogCompetitorsCacheInvalidationListener); } } - // note: adding listeners was idempotent; at most one occurrence of this listener exists in the race column listeners set + // note: adding listeners was idempotent; at most one occurrence of this listener exists in the race column + // listeners set provider.removeRaceColumnListener(raceColumnListener); - allCompetitorsCacheByRace.clear(); // this is a little coarse-grained; but given the typical access patterns it should be good enough. - // The change frequency of competitors lists on individual races is much lower than the access frequency to this structure. + allCompetitorsCacheByRace.clear(); // this is a little coarse-grained; but given the typical access patterns it + // should be good enough. + // The change frequency of competitors lists on individual races is much lower than the access frequency to this + // structure. } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java index 9c322f7ba84..16c2d241bf9 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java @@ -26,7 +26,7 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis @Override protected void setRegisteredCompetitors() { - sailingService.getCompetitorRegistrationsOnRaceLog(leaderboardName, raceColumnName, fleetName, + sailingService.getCompetitorRegistrationsForRace(leaderboardName, raceColumnName, fleetName, new AsyncCallback>() { @Override public void onSuccess(Collection registeredCompetitors) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogAddDeviceMappingDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogAddDeviceMappingDialog.java index b83abec70f7..f72cf3bc3b1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogAddDeviceMappingDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogAddDeviceMappingDialog.java @@ -94,7 +94,7 @@ public class RegattaLogAddDeviceMappingDialog extends AbstractLogAddDeviceMappin @Override protected void loadCompetitorsAndMarks() { - sailingService.getCompetitorRegistrationsFromLogHierarchy(leaderboardName, itemSelectionPanel.getSetCompetitorsCallback()); + sailingService.getCompetitorRegistrationsInRegattaLog(leaderboardName, itemSelectionPanel.getSetCompetitorsCallback()); sailingService.getMarksInRegattaLog(leaderboardName, itemSelectionPanel.getSetMarksCallback()); } } \ No newline at end of file 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 f7ef8a162d3..9c44306ff50 100755 --- 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 @@ -37,6 +37,7 @@ import com.sap.sailing.domain.common.dto.RaceColumnInSeriesDTO; import com.sap.sailing.domain.common.dto.RaceDTO; import com.sap.sailing.domain.common.dto.RegattaCreationParametersDTO; import com.sap.sailing.domain.common.racelog.RacingProcedureType; +import com.sap.sailing.domain.common.racelog.tracking.CompetitorRegistrationOnRaceLogDisabledException; import com.sap.sailing.domain.common.racelog.tracking.DoesNotHaveRegattaLogException; import com.sap.sailing.domain.common.racelog.tracking.NotDenotedForRaceLogTrackingException; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; @@ -460,13 +461,7 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS void startRaceLogTracking(String leaderboardName, String raceColumnName, String fleetName, boolean trackWind, boolean correctWindByDeclination) throws NotDenotedForRaceLogTrackingException, Exception; - void setCompetitorRegistrationsInRaceLog(String leaderboardName, String raceColumnName, String fleetName, Set competitors); - - /** - * Get the competitors registered in this leaderboard. Does not automatically include the competitors - * {@link #getCompetitorRegistrationsInRaceLog(String, String, String) registered for the racelog}. - */ - Collection getCompetitorRegistrationsInRegattaLog(String leaderboardName) throws DoesNotHaveRegattaLogException; + void setCompetitorRegistrationsInRaceLog(String leaderboardName, String raceColumnName, String fleetName, Set competitors) throws CompetitorRegistrationOnRaceLogDisabledException; /** * Adds the course definition to the racelog, while trying to reuse existing marks, controlpoints and waypoints @@ -598,8 +593,6 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS Pair getTrackingTimes(String leaderboardName, String raceColumnName, String fleetName); - Collection getCompetitorRegistrationsFromLogHierarchy(String leaderboardName); - /** * @param raceLogFrom identifies the race log to copy from by its leaderboard name, race column name and fleet name * @param raceLogsTo identifies the race log to copy from by their leaderboard name, race column name and fleet name @@ -615,13 +608,16 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS Set> toTriples); /** - * Get the competitors registered in this racelog. Does not automatically include the competitors - * {@link #getCompetitorRegistrationsOnRaceLog(String) registered for the leaderboard}. + * Get the competitors registered for a certain race. This automatically checks, whether competitors are registered + * in the raceLog (in case of e.g. splitFleets) or in the RegattaLog (default) + * @throws DoesNotHaveRegattaLogException */ - Collection getCompetitorRegistrationsOnRaceLog(String leaderboardName, String raceColumnName, - String fleetName); + Collection getCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, + String fleetName) throws DoesNotHaveRegattaLogException; void addMarkToRegattaLog(String leaderboardName, MarkDTO mark) throws DoesNotHaveRegattaLogException; void revokeMarkDefinitionEventInRegattaLog(String leaderboardName, MarkDTO markDTO) throws DoesNotHaveRegattaLogException; + + Collection getCompetitorRegistrationsInRegattaLog(String leaderboardName) throws DoesNotHaveRegattaLogException; } 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 3be3e25821e..65e8c4bbe33 100755 --- 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 @@ -623,7 +623,7 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan void setCompetitorRegistrationsInRegattaLog(String leaderboardName, Set competitors, AsyncCallback callback); - void getCompetitorRegistrationsOnRaceLog(String leaderboardName, String raceColumnName, String fleetName, + void getCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName, AsyncCallback> callback); void addCourseDefinitionToRaceLog(String leaderboardName, String raceColumnName, String fleetName, @@ -729,10 +729,7 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan void getMarksInRegattaLog(String leaderboardName, AsyncCallback> callback); void getDeviceMappingsFromLogHierarchy(String leaderboardName, AsyncCallback> asyncCallback); - - void getCompetitorRegistrationsInRegattaLog(String leaderboardName, - AsyncCallback> asyncCallback); - + void revokeRaceAndRegattaLogEvents(String leaderboardName, List eventIds, AsyncCallback callback); void closeOpenEndedDeviceMapping(String leaderboardName, DeviceMappingDTO mappingDto, Date closingTimePoint, @@ -750,9 +747,6 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan void getTrackingTimes(String leaderboardName, String raceColumnName, String fleetName, AsyncCallback> callback); - void getCompetitorRegistrationsFromLogHierarchy(String leaderboardName, - AsyncCallback> setCompetitorsCallback); - void copyCompetitorsToOtherRaceLogs(Triple fromTriple, Set> toTriples, AsyncCallback callback); @@ -762,4 +756,7 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan void addMarkToRegattaLog(String leaderboardName, MarkDTO mark, AsyncCallback asyncCallback); void revokeMarkDefinitionEventInRegattaLog(String leaderboardName, MarkDTO markDTO, AsyncCallback callback); + + void getCompetitorRegistrationsInRegattaLog(String leaderboardName, + AsyncCallback> setCompetitorsCallback); } 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 885f5a80b83..615254a73c1 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 @@ -52,7 +52,6 @@ import java.util.zip.GZIPInputStream; import javax.servlet.ServletContext; import org.apache.http.client.ClientProtocolException; -import org.eclipse.jetty.util.log.Log; import org.osgi.framework.BundleContext; import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceReference; @@ -80,9 +79,9 @@ import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.FlagPoleSta import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.ReadonlyGateStartRacingProcedure; import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.ReadonlyRRS26RacingProcedure; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogOpenEndedDeviceMappingCloser; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RegisteredCompetitorsFinder; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogCloseOpenEndedDeviceMappingEvent; @@ -93,9 +92,9 @@ import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceCo import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceMarkMappingEventImpl; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogRevokeEventImpl; import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogOpenEndedDeviceMappingCloser; +import com.sap.sailing.domain.abstractlog.shared.analyzing.CompetitorsInLogAnalyzer; import com.sap.sailing.domain.abstractlog.shared.analyzing.DeviceCompetitorMappingFinder; import com.sap.sailing.domain.abstractlog.shared.analyzing.DeviceMarkMappingFinder; -import com.sap.sailing.domain.abstractlog.shared.analyzing.RegisteredCompetitorsAnalyzer; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.ControlPoint; @@ -211,6 +210,7 @@ import com.sap.sailing.domain.common.racelog.FlagPole; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.domain.common.racelog.RacingProcedureType; +import com.sap.sailing.domain.common.racelog.tracking.CompetitorRegistrationOnRaceLogDisabledException; import com.sap.sailing.domain.common.racelog.tracking.DoesNotHaveRegattaLogException; import com.sap.sailing.domain.common.racelog.tracking.MappableToDevice; import com.sap.sailing.domain.common.racelog.tracking.NotDenotedForRaceLogTrackingException; @@ -248,7 +248,6 @@ import com.sap.sailing.domain.racelogtracking.impl.DeviceMappingImpl; import com.sap.sailing.domain.ranking.RankingMetric.RankingInfo; import com.sap.sailing.domain.ranking.RankingMetricsFactory; import com.sap.sailing.domain.regattalike.HasRegattaLike; -import com.sap.sailing.domain.regattalike.IsRegattaLike; import com.sap.sailing.domain.regattalike.LeaderboardThatHasRegattaLike; import com.sap.sailing.domain.regattalog.RegattaLogStore; import com.sap.sailing.domain.swisstimingadapter.StartList; @@ -2309,7 +2308,12 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S RaceLogTrackingState raceLogTrackingState = raceLog == null ? RaceLogTrackingState.NOT_A_RACELOG_TRACKED_RACE : new RaceLogTrackingStateAnalyzer(raceLog).analyze(); boolean raceLogTrackerExists = raceLog == null ? false : getService().getRaceTrackerById(raceLog.getId()) != null; - boolean competitorRegistrationsExist = raceLog == null ? false : !new RegisteredCompetitorsAnalyzer<>(raceLog).analyze().isEmpty(); + boolean competitorRegistrationsExist; + try { + competitorRegistrationsExist = raceLog == null ? false : ! new RegisteredCompetitorsFinder(raceLog, getRegattaLogInternal(leaderboard.getName())).analyze().isEmpty(); + } catch (DoesNotHaveRegattaLogException e) { + competitorRegistrationsExist = false; + } RaceLogTrackingInfoDTO raceLogTrackingInfo = new RaceLogTrackingInfoDTO(raceLogTrackerExists, competitorRegistrationsExist, raceLogTrackingState); raceColumnDTO.setRaceLogTrackingInfo(fleetDTO, raceLogTrackingInfo); @@ -4927,7 +4931,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S @Override public void setCompetitorRegistrationsInRaceLog(String leaderboardName, String raceColumnName, String fleetName, - Set competitorDTOs) { + Set competitorDTOs) throws CompetitorRegistrationOnRaceLogDisabledException { RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); Set competitors = new HashSet(); for (CompetitorDTO dto : competitorDTOs) { @@ -5743,13 +5747,6 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S return markDTOs; } - @Override - public Collection getCompetitorRegistrationsInRegattaLog(String leaderboardName) throws DoesNotHaveRegattaLogException { - return convertToCompetitorDTOs( - new RegisteredCompetitorsAnalyzer<>( - getRegattaLogInternal(leaderboardName)).analyze()); - } - @Override public void closeOpenEndedDeviceMapping(String leaderboardName, DeviceMappingDTO mappingDTO, Date closingTimePoint) throws TransformationException, DoesNotHaveRegattaLogException { RegattaLog regattaLog = getRegattaLogInternal(leaderboardName); @@ -5801,10 +5798,10 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S public boolean doesRegattaLogContainCompetitors(String leaderboardName) throws DoesNotHaveRegattaLogException { RegattaLog regattaLog = getRegattaLogInternal(leaderboardName); - List markEvents = new AllEventsOfTypeFinder<>(regattaLog, /* only unrevoked */ true, RegattaLogRegisterCompetitorEvent.class) + List comeptitorRegistrationEvents = new AllEventsOfTypeFinder<>(regattaLog, /* only unrevoked */ true, RegattaLogRegisterCompetitorEvent.class) .analyze(); - if (markEvents.isEmpty()){ + if (comeptitorRegistrationEvents.isEmpty()){ return false; } else { return true; @@ -5831,24 +5828,17 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S } @Override - public Collection getCompetitorRegistrationsFromLogHierarchy(String leaderboardName) { - List> logHierarchy = getLogHierarchy(leaderboardName); - - Collection competitorRegistrations = new ArrayList(); - - for (AbstractLog abstractLog : logHierarchy) { - competitorRegistrations.addAll(convertToCompetitorDTOs( - new RegisteredCompetitorsAnalyzer<>( - abstractLog).analyze())); - } - - return competitorRegistrations; + public Collection getCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, + String fleetName) throws DoesNotHaveRegattaLogException { + RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); + RegattaLog regattaLog = getRegattaLogInternal(leaderboardName); + return convertToCompetitorDTOs(new RegisteredCompetitorsFinder(raceLog, regattaLog).analyze()); } @Override - public Collection getCompetitorRegistrationsOnRaceLog(String leaderboardName, String raceColumnName, - String fleetName) { - RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); - return convertToCompetitorDTOs(new RegisteredCompetitorsAnalyzer<>(raceLog).analyze()); + public Collection getCompetitorRegistrationsInRegattaLog(String leaderboardName) throws DoesNotHaveRegattaLogException { + RegattaLog regattaLog = getRegattaLogInternal(leaderboardName); + + return convertToCompetitorDTOs(new CompetitorsInLogAnalyzer<>(regattaLog).analyze()); } } diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogEventDeserializer.java index 91b4aea0199..26963884cad 100755 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogEventDeserializer.java @@ -45,6 +45,7 @@ import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogStartPro import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogStartTimeEventSerializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogStartTrackingEventSerializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogSuppressedMarkPassingsEventSerializer; +import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogUseCompetitorsFromRaceLogEventSerializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogWindFixEventSerializer; import com.sap.sailing.server.gateway.serialization.racelog.tracking.impl.SmartphoneUUIDJsonHandler; @@ -91,7 +92,9 @@ public class RaceLogEventDeserializer implements JsonDeserializer new RaceLogAdditionalScoringInformationEventDeserializer(competitorDeserializer), new RaceLogFixedMarkPassingEventDeserializer(competitorDeserializer), new RaceLogSuppressedMarkPassingsEventDeserializer(competitorDeserializer), - new RaceLogStartOfTrackingEventDeserializer(competitorDeserializer), new RaceLogEndOfTrackingEventDeserializer(competitorDeserializer)); + new RaceLogStartOfTrackingEventDeserializer(competitorDeserializer), + new RaceLogUseCompetitorsFromRaceLogEventDeserializer(competitorDeserializer), + new RaceLogEndOfTrackingEventDeserializer(competitorDeserializer)); } protected final JsonDeserializer flagEventDeserializer; @@ -121,6 +124,7 @@ public class RaceLogEventDeserializer implements JsonDeserializer protected final JsonDeserializer suppressedMarkPassingsDeserializer; protected final JsonDeserializer startOfTrackingDeserializer; protected final JsonDeserializer endOfTrackingDeserializer; + protected final JsonDeserializer useCompetitorsFromRaceLogDeserializer; public RaceLogEventDeserializer(JsonDeserializer flagEventDeserializer, JsonDeserializer startTimeEventDeserializer, @@ -147,7 +151,9 @@ public class RaceLogEventDeserializer implements JsonDeserializer JsonDeserializer additionalScoringInformationEventDeserializer, JsonDeserializer fixedMarkPassingEventDeserializer, JsonDeserializer suppressedMarkPassingsEventDeserializer, - JsonDeserializer startOfTrackingEventDeserializer, JsonDeserializer endOfTrackingEventDeserializer) { + JsonDeserializer startOfTrackingEventDeserializer, + JsonDeserializer useCompetitorsFromRaceLogDeserializer, + JsonDeserializer endOfTrackingEventDeserializer) { this.flagEventDeserializer = flagEventDeserializer; this.startTimeEventDeserializer = startTimeEventDeserializer; this.dependentStartTimeEventDeserializer = dependentStartTimeEventDeserializer; @@ -175,6 +181,7 @@ public class RaceLogEventDeserializer implements JsonDeserializer this.suppressedMarkPassingsDeserializer = suppressedMarkPassingsEventDeserializer; this.startOfTrackingDeserializer = startOfTrackingEventDeserializer; this.endOfTrackingDeserializer = endOfTrackingEventDeserializer; + this.useCompetitorsFromRaceLogDeserializer = useCompetitorsFromRaceLogDeserializer; } protected JsonDeserializer getDeserializer(JSONObject object) throws JsonDeserializationException { @@ -234,6 +241,8 @@ public class RaceLogEventDeserializer implements JsonDeserializer return startOfTrackingDeserializer; } else if (type.equals(RaceLogEndOfTrackingEventSerializer.VALUE_CLASS)){ return endOfTrackingDeserializer; + } else if (type.equals(RaceLogUseCompetitorsFromRaceLogEventSerializer.VALUE_CLASS)){ + return endOfTrackingDeserializer; } throw new JsonDeserializationException(String.format("There is no deserializer defined for event type %s.", diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogUseCompetitorsFromRaceLogEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogUseCompetitorsFromRaceLogEventDeserializer.java new file mode 100644 index 00000000000..7e7e29f8c03 --- /dev/null +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogUseCompetitorsFromRaceLogEventDeserializer.java @@ -0,0 +1,29 @@ +package com.sap.sailing.server.gateway.deserialization.racelog.impl; + +import java.io.Serializable; +import java.util.List; + +import org.json.simple.JSONObject; + +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; +import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; +import com.sap.sse.common.TimePoint; + +public class RaceLogUseCompetitorsFromRaceLogEventDeserializer extends BaseRaceLogEventDeserializer implements + JsonDeserializer { + + public RaceLogUseCompetitorsFromRaceLogEventDeserializer(JsonDeserializer competitorDeserializer) { + super(competitorDeserializer); + } + + @Override + protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, + AbstractLogEventAuthor author, TimePoint timePoint, int passId, List competitors) + throws JsonDeserializationException { + return factory.createUseCompetitorsFromRaceLogEvent(timePoint, author, id, competitors, passId); + } + +} diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java index b106079a7fc..60b02aed85b 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java @@ -31,6 +31,7 @@ import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorM import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.racelogtracking.SmartphoneUUIDIdentifier; @@ -87,8 +88,8 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac new RaceLogSuppressedMarkPassingsEventSerializer(competitorSerializer), new RaceLogDependentStartTimeEventSerializer(competitorSerializer), new RaceLogStartOfTrackingEventSerializer(competitorSerializer), + new RaceLogUseCompetitorsFromRaceLogEventSerializer(competitorSerializer), new RaceLogEndOfTrackingEventSerializer(competitorSerializer)); - } private final JsonSerializer flagEventSerializer; @@ -118,6 +119,7 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac private final JsonSerializer dependentStartTimeEventSerializer; private final JsonSerializer startOfTrackingEventSerializer; private final JsonSerializer endOfTrackingEventSerializer; + private final JsonSerializer useCompetitorsFromRaceLogEventSerializer; private JsonSerializer chosenSerializer; @@ -149,7 +151,8 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac JsonSerializer suppressedMarkPassingsSerializer, JsonSerializer dependentStartTimeEventSerializer, JsonSerializer startOfTrackingEventSerializer, - JsonSerializer endOfTrackingEventSerializer) { + JsonSerializer endOfTrackingEventSerializer, + JsonSerializer useCompetitorsFromRaceLogEventSerializer) { this.flagEventSerializer = flagEventSerializer; this.startTimeSerializer = startTimeSerializer; this.raceStatusSerializer = raceStatusSerializer; @@ -177,6 +180,7 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac this.dependentStartTimeEventSerializer = dependentStartTimeEventSerializer; this.startOfTrackingEventSerializer = startOfTrackingEventSerializer; this.endOfTrackingEventSerializer = endOfTrackingEventSerializer; + this.useCompetitorsFromRaceLogEventSerializer = useCompetitorsFromRaceLogEventSerializer; this.chosenSerializer = null; } @@ -330,4 +334,9 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac public void visit(RaceLogEndOfTrackingEvent event) { chosenSerializer = endOfTrackingEventSerializer; } + + @Override + public void visit(RaceLogUseCompetitorsFromRaceLogEvent event) { + chosenSerializer = useCompetitorsFromRaceLogEventSerializer; + } } diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogUseCompetitorsFromRaceLogEventSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogUseCompetitorsFromRaceLogEventSerializer.java new file mode 100644 index 00000000000..3f31e7b2405 --- /dev/null +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogUseCompetitorsFromRaceLogEventSerializer.java @@ -0,0 +1,21 @@ +package com.sap.sailing.server.gateway.serialization.racelog.impl; + +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.server.gateway.serialization.JsonSerializer; + +public class RaceLogUseCompetitorsFromRaceLogEventSerializer extends BaseRaceLogEventSerializer implements + JsonSerializer { + public static final String VALUE_CLASS = RaceLogUseCompetitorsFromRaceLogEvent.class.getSimpleName(); + + public RaceLogUseCompetitorsFromRaceLogEventSerializer(JsonSerializer competitorSerializer) { + super(competitorSerializer); + } + + @Override + protected String getClassFieldValue() { + return VALUE_CLASS; + } + +} diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java index 93d712b2bc2..3cc2f1aa562 100644 --- a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java +++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java @@ -50,6 +50,7 @@ public class RaceLogEventSerializerTest { private JsonSerializer suppressedMarkPassingsSerializer; private JsonSerializer dependentStartTimeEventSerializer; private JsonSerializer startOfTrackingEventSerializer; + private JsonSerializer useCompetitorsFromRaceLogEventSerializer; private JsonSerializer endOfTrackingEventSerializer; private RaceLogEventFactory factory; @@ -84,6 +85,7 @@ public class RaceLogEventSerializerTest { suppressedMarkPassingsSerializer = mock(JsonSerializer.class); dependentStartTimeEventSerializer = mock(JsonSerializer.class); startOfTrackingEventSerializer = mock(JsonSerializer.class); + useCompetitorsFromRaceLogEventSerializer = mock(JsonSerializer.class); endOfTrackingEventSerializer = mock(JsonSerializer.class); serializer = new RaceLogEventSerializer(flagEventSerializer, startTimeSerializer, raceStatusSerializer, @@ -96,7 +98,8 @@ public class RaceLogEventSerializerTest { registerCompetitorEventSerializer, defineMarkEventSerializer, closeOpenEndedDeviceMappingEventSerializer, fixedMarkPassingEventSerializer, suppressedMarkPassingsSerializer, additionalScoringInformationSerializer, - dependentStartTimeEventSerializer, startOfTrackingEventSerializer, endOfTrackingEventSerializer); + dependentStartTimeEventSerializer, startOfTrackingEventSerializer, + useCompetitorsFromRaceLogEventSerializer, endOfTrackingEventSerializer); factory = RaceLogEventFactory.INSTANCE; } diff --git a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourceCheckinAndOutTest.java b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourceCheckinAndOutTest.java index f396795f3ec..e07c1c1946c 100644 --- a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourceCheckinAndOutTest.java +++ b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourceCheckinAndOutTest.java @@ -17,8 +17,8 @@ import org.junit.Before; import org.junit.Test; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; +import com.sap.sailing.domain.abstractlog.shared.analyzing.CompetitorsInLogAnalyzer; import com.sap.sailing.domain.abstractlog.shared.analyzing.DeviceCompetitorMappingFinder; -import com.sap.sailing.domain.abstractlog.shared.analyzing.RegisteredCompetitorsAnalyzer; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.impl.BoatClassImpl; @@ -73,7 +73,7 @@ public class LeaderboardsResourceCheckinAndOutTest extends AbstractJaxRsApiTest Response response = resource.postCheckin(json.toString(), leaderboard.getName()); assertThat("checkin returns OK", response.getStatus(), equalTo(Response.Status.OK.getStatusCode())); - Set registeredCompetitors = new RegisteredCompetitorsAnalyzer<>(log).analyze(); + Set registeredCompetitors = new CompetitorsInLogAnalyzer<>(log).analyze(); Map>> mappings = new DeviceCompetitorMappingFinder<>(log).analyze(); assertThat("competitor was registered", registeredCompetitors.size(), equalTo(1)); diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java index 6c63dbb1d0b..53140139512 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java @@ -42,7 +42,7 @@ import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogCloseOpe import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceCompetitorMappingEventImpl; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogRegisterCompetitorEventImpl; import com.sap.sailing.domain.abstractlog.regatta.impl.OpenEndedDeviceMappingFinder; -import com.sap.sailing.domain.abstractlog.shared.analyzing.RegisteredCompetitorsAnalyzer; +import com.sap.sailing.domain.abstractlog.shared.analyzing.CompetitorsInLogAnalyzer; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.DomainFactory; import com.sap.sailing.domain.base.Fleet; @@ -406,7 +406,7 @@ public class LeaderboardsResource extends AbstractSailingServerResource { .type(MediaType.TEXT_PLAIN).build(); } // add registration if necessary - Set registered = new RegisteredCompetitorsAnalyzer<>(isRegattaLike.getRegattaLog()).analyze(); + Set registered = new CompetitorsInLogAnalyzer<>(isRegattaLike.getRegattaLog()).analyze(); if (!registered.contains(mappedTo)) { isRegattaLike.getRegattaLog().add( new RegattaLogRegisterCompetitorEventImpl(now, author, now, UUID.randomUUID(), mappedTo)); From 4fc784a46a5e3103b1980aa587a686ba807262bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Sat, 31 Oct 2015 15:39:52 +0100 Subject: [PATCH 012/165] Fixes compile error --- .../impl/RaceLogUseCompetitorsFromRaceLogEventDeserializer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogUseCompetitorsFromRaceLogEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogUseCompetitorsFromRaceLogEventDeserializer.java index 7e7e29f8c03..44a9c3d35cf 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogUseCompetitorsFromRaceLogEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogUseCompetitorsFromRaceLogEventDeserializer.java @@ -23,7 +23,7 @@ public class RaceLogUseCompetitorsFromRaceLogEventDeserializer extends BaseRaceL protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, AbstractLogEventAuthor author, TimePoint timePoint, int passId, List competitors) throws JsonDeserializationException { - return factory.createUseCompetitorsFromRaceLogEvent(timePoint, author, id, competitors, passId); + return factory.createUseCompetitorsFromRaceLogEvent(timePoint, author, id, passId); } } From 05dea5263444737cfa35871594eed16fe1ba7293 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Sat, 31 Oct 2015 19:20:24 +0100 Subject: [PATCH 013/165] Fix broken testcase by adding RaceLog MarkerEvent --- .../racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java index f43277c8b1d..5e041368c07 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java @@ -174,6 +174,7 @@ public class CreateAndTrackWithRaceLogTest { DeviceIdentifier dev1 = new SmartphoneImeiIdentifier("dev1"); raceLog.add(factory.createDeviceCompetitorMappingEvent(t(), author, dev1, comp1, 0, t(0), t(10))); addFixes0(dev1); + raceLog.add(factory.createUseCompetitorsFromRaceLogEvent(t(), author, UUID.randomUUID(), 0)); raceLog.add(factory.createRegisterCompetitorEvent(t(), author, 0, comp1)); // start tracking From dd92eaccc4a3cc474644a8f942ae3bc78c265d73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Mon, 2 Nov 2015 12:45:30 +0100 Subject: [PATCH 014/165] Add RegattaLogDefineMarkEvent to DomainObjectFactory --- .../persistence/impl/DomainObjectFactoryImpl.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java index 89ce8f3b06d..bb17834fb5d 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java @@ -74,6 +74,7 @@ import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFro import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogCloseOpenEndedDeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDefineMarkEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceCompetitorMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogRegisterCompetitorEvent; @@ -81,6 +82,7 @@ import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogRevokeEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogSetCompetitorTimeOnDistanceAllowancePerNauticalMileEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogSetCompetitorTimeOnTimeFactorEvent; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogCloseOpenEndedDeviceMappingEventImpl; +import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDefineMarkEventImpl; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceCompetitorMappingEventImpl; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceMarkMappingEventImpl; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogRegisterCompetitorEventImpl; @@ -1681,12 +1683,14 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { return loadRegattaLogSetCompetitorTimeOnTimeFactorEvent(createdAt, author, logicalTimePoint, id, dbObject); } else if (eventClass.equals(RegattaLogSetCompetitorTimeOnDistanceAllowancePerNauticalMileEvent.class.getSimpleName())) { return loadRegattaLogSetCompetitorTimeOnDistanceAllowancePerNauticalMileEvent(createdAt, author, logicalTimePoint, id, dbObject); + } else if (eventClass.equals(RegattaLogDefineMarkEvent.class.getSimpleName())) { + return loadRegattaLogDefineMarkEvent(createdAt, author, logicalTimePoint, id, dbObject); } else if (eventClass.equals(RegattaLogRevokeEvent.class.getSimpleName())) { return loadRegattaLogRevokeEvent(createdAt, author, logicalTimePoint, id, dbObject); } throw new IllegalStateException(String.format("Unknown RegattaLogEvent type %s", eventClass)); } - + private Competitor getCompetitorByID(DBObject dbObject) { Serializable competitorId = (Serializable) dbObject.get(FieldNames.REGATTA_LOG_COMPETITOR_ID.name()); Competitor comp = baseDomainFactory.getCompetitorStore().getExistingCompetitorById(competitorId); @@ -1719,6 +1723,12 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { return new RegattaLogRevokeEventImpl(createdAt, author, logicalTimePoint, id, revokedEventId, revokedEventType, revokedEventShortInfo, reason); } + + private RegattaLogEvent loadRegattaLogDefineMarkEvent(TimePoint createdAt, AbstractLogEventAuthor author, + TimePoint logicalTimePoint, Serializable id, DBObject dbObject) { + Mark mark = loadMark((DBObject) dbObject.get(FieldNames.REGATTA_LOG_MARK.name())); + return new RegattaLogDefineMarkEventImpl(createdAt, author, logicalTimePoint, id, mark); + } private RegattaLogRegisterCompetitorEvent loadRegattaLogRegisterCompetitorEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, DBObject dbObject) { From 296df139129553b8b281675b64439773b36d5dd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Mon, 2 Nov 2015 14:56:32 +0100 Subject: [PATCH 015/165] Adapts AdminConsole UI according to new competitor registration logic --- ...AbstractCompetitorRegistrationsDialog.java | 34 +++++- .../RaceLogCompetitorRegistrationDialog.java | 108 +++++++++++++++++- ...egattaLogCompetitorRegistrationDialog.java | 4 + .../sailing/gwt/ui/client/SailingService.java | 6 + .../gwt/ui/client/SailingServiceAsync.java | 9 ++ .../sailing/gwt/ui/client/StringMessages.java | 6 + .../gwt/ui/client/StringMessages.properties | 8 +- .../ui/client/StringMessages_de.properties | 8 +- .../gwt/ui/server/SailingServiceImpl.java | 35 ++++++ 9 files changed, 208 insertions(+), 10 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java index 2f9512b9a72..a9980cc61ec 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java @@ -30,10 +30,12 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia protected CompetitorTableWrapper> allCompetitorsTable; protected CompetitorTableWrapper> registeredCompetitorsTable; protected final boolean filterByLeaderBoardInitially = false; - private final StringMessages stringMessages; + final StringMessages stringMessages; protected final SailingServiceAsync sailingService; final ErrorReporter errorReporter; private boolean editable; + private Button registerBtn; + private Button unregisterBtn; public AbstractCompetitorRegistrationsDialog(final SailingServiceAsync sailingService, final StringMessages stringMessages, final ErrorReporter errorReporter, boolean editable, @@ -48,7 +50,7 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia @Override protected Widget getAdditionalWidget() { FlowPanel mainPanel = new FlowPanel(); - + HorizontalPanel buttonPanel = new HorizontalPanel(); Button addCompetitorButton = new Button(stringMessages.add(stringMessages.competitor())); addCompetitorButton.addClickHandler(new ClickHandler() { @Override @@ -73,8 +75,8 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia allCompetitorsPanel.add(allCompetitorsTable); registeredCompetitorsPanel.add(registeredCompetitorsTable); VerticalPanel movePanel = new VerticalPanel(); - Button registerBtn = new Button("<"); - Button unregisterBtn = new Button(">"); + registerBtn = new Button("<"); + unregisterBtn = new Button(">"); registerBtn.setEnabled(editable); unregisterBtn.setEnabled(editable); movePanel.add(registerBtn); @@ -98,13 +100,19 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia refreshCompetitors(); - mainPanel.add(addCompetitorButton); - mainPanel.add(editCompetitorButton); + buttonPanel.add(addCompetitorButton); + buttonPanel.add(editCompetitorButton); + mainPanel.add(buttonPanel); + + addAdditionalWidgets(mainPanel); + mainPanel.add(competitorRegistrationPanel); return mainPanel; } + public abstract void addAdditionalWidgets(FlowPanel mainPanel); + void move(CompetitorTableWrapper from, CompetitorTableWrapper to, Collection toMove) { if (!toMove.isEmpty()) { List newFromList = new ArrayList<>(); @@ -196,6 +204,20 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia } protected abstract void setRegisteredCompetitors(); + + public void deactivateRegistrationButtons(String tooltip){ + registerBtn.setEnabled(false); + unregisterBtn.setEnabled(false); + registerBtn.setTitle(tooltip); + unregisterBtn.setTitle(tooltip); + } + + public void activateRegistrationButtons(){ + registerBtn.setEnabled(true); + unregisterBtn.setEnabled(true); + registerBtn.setTitle(""); + unregisterBtn.setTitle(""); + } @Override protected Set getResult() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java index 16c2d241bf9..c7139019478 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java @@ -3,25 +3,33 @@ package com.sap.sailing.gwt.ui.adminconsole; import java.util.Collection; import java.util.Set; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.CheckBox; +import com.google.gwt.user.client.ui.FlowPanel; import com.sap.sailing.domain.common.dto.CompetitorDTO; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sse.gwt.client.ErrorReporter; +import com.sap.sse.gwt.client.dialog.DataEntryDialog; public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegistrationsDialog { private String leaderboardName; private String fleetName; private String raceColumnName; + private CheckBox competitorRegistrationInRaceLogCheckBox; public RaceLogCompetitorRegistrationDialog(SailingServiceAsync sailingService, StringMessages stringMessages, - ErrorReporter errorReporter, boolean editable, String leaderboardName, String raceColumnName, String fleetName, - com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback> callback) { + ErrorReporter errorReporter, boolean editable, String leaderboardName, String raceColumnName, + String fleetName, com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback> callback) { super(sailingService, stringMessages, errorReporter, editable, callback); this.leaderboardName = leaderboardName; this.raceColumnName = raceColumnName; this.fleetName = fleetName; + competitorRegistrationInRaceLogCheckBox = new CheckBox(stringMessages.registerCompetitorsOnRace()); + setupCompetitorRegistationsOnRaceCheckbox(); } @Override @@ -41,4 +49,100 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis }); } + @Override + public void addAdditionalWidgets(FlowPanel mainPanel) { + mainPanel.add(competitorRegistrationInRaceLogCheckBox); + } + + private void setupCompetitorRegistationsOnRaceCheckbox() { + sailingService.areCompetitorRegistrationsEnabledForRace(leaderboardName, raceColumnName, fleetName, + new AsyncCallback() { + @Override + public void onSuccess(Boolean isEnabled) { + competitorRegistrationInRaceLogCheckBox.setValue(isEnabled); + if (isEnabled) { + activateRegistrationButtons(); + } else { + deactivateRegistrationButtons(stringMessages.competitorRegistrationsOnRaceDisabled()); + } + } + + @Override + public void onFailure(Throwable reason) { + errorReporter.reportError("Could not load already registered competitors: " + + reason.getMessage()); + } + }); + competitorRegistrationInRaceLogCheckBox.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + String title; + String message; + + if (competitorRegistrationInRaceLogCheckBox.getValue()) { + title = stringMessages.doYouWantToDisableCompetitorsRegistrationsOnTheRace(); + message = stringMessages.warningRegattaCompetitorRegistration(); + + } else { + title = stringMessages.doYouWantToRegisterCompetitorsDirectlyOnTheRace(); + message = stringMessages.warningDirectCompetitorRegistration(); + } + + new DataEntryDialog(title, message, stringMessages.ok(), stringMessages.cancel(), null, false, + new DialogCallback() { + @Override + public void ok(Void editedObject) { + if (competitorRegistrationInRaceLogCheckBox.getValue()) { + sailingService.activateCompetitorRegistrationsForRace(leaderboardName, + raceColumnName, fleetName, new AsyncCallback() { + @Override + public void onSuccess(Void isEnabled) { + competitorRegistrationInRaceLogCheckBox.setValue(true); + activateRegistrationButtons(); + setRegisteredCompetitors(); + } + + @Override + public void onFailure(Throwable reason) { + errorReporter + .reportError("Could not enable competitor registrations for race: " + + reason.getMessage()); + } + }); + + } else { + sailingService.deactivateCompetitorRegistrationsForRace(leaderboardName, + raceColumnName, fleetName, new AsyncCallback() { + @Override + public void onSuccess(Void isEnabled) { + competitorRegistrationInRaceLogCheckBox.setValue(false); + deactivateRegistrationButtons(stringMessages + .competitorRegistrationsOnRaceDisabled()); + setRegisteredCompetitors(); + } + + @Override + public void onFailure(Throwable reason) { + errorReporter + .reportError("Could not deactivate competitor registrations for race: " + + reason.getMessage()); + } + }); + } + } + + @Override + public void cancel() { + } + }) { + @Override + protected Void getResult() { + return null; + } + }.show(); + } + }); + } + } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogCompetitorRegistrationDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogCompetitorRegistrationDialog.java index 8cf53ed4394..02708f403ea 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogCompetitorRegistrationDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogCompetitorRegistrationDialog.java @@ -4,6 +4,7 @@ import java.util.Collection; import java.util.Set; import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.FlowPanel; import com.sap.sailing.domain.common.dto.CompetitorDTO; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.StringMessages; @@ -37,4 +38,7 @@ public class RegattaLogCompetitorRegistrationDialog extends AbstractCompetitorRe }); } + @Override + public void addAdditionalWidgets(FlowPanel mainPanel) { + } } 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 9c44306ff50..a775f4b6b8f 100755 --- 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 @@ -620,4 +620,10 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS void revokeMarkDefinitionEventInRegattaLog(String leaderboardName, MarkDTO markDTO) throws DoesNotHaveRegattaLogException; Collection getCompetitorRegistrationsInRegattaLog(String leaderboardName) throws DoesNotHaveRegattaLogException; + + boolean areCompetitorRegistrationsEnabledForRace(String leaderboardName, String raceColumnName, String fleetName); + + void deactivateCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName) throws NotRevokableException; + + void activateCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName); } 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 65e8c4bbe33..5250550ff3f 100755 --- 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 @@ -759,4 +759,13 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan void getCompetitorRegistrationsInRegattaLog(String leaderboardName, AsyncCallback> setCompetitorsCallback); + + void areCompetitorRegistrationsEnabledForRace(String leaderboardName, String raceColumnName, String fleetName, + AsyncCallback asyncCallback); + + void deactivateCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName, + AsyncCallback asyncCallback); + + void activateCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName, + AsyncCallback asyncCallback); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java index 468934a5075..a287d697d56 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java @@ -1434,4 +1434,10 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, c String couldNotRetrieveImageSizeYet(); @Override String pleaseOnlyUploadContentYouHaveAllUsageRightsFor(); + String registerCompetitorsOnRace(); + String doYouWantToRegisterCompetitorsDirectlyOnTheRace(); + String doYouWantToDisableCompetitorsRegistrationsOnTheRace(); + String warningDirectCompetitorRegistration(); + String warningRegattaCompetitorRegistration(); + String competitorRegistrationsOnRaceDisabled(); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties index f3fe26cb96a..e35629b4be0 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties @@ -1404,4 +1404,10 @@ addEventLogo=Add event logo noImagesDefinedYet=No images defined yet imageSizeError=The size of the {0} image does not fit. The width should be between {1} and {2} px and the height between {3} and {4} px. couldNotRetrieveImageSizeYet=The width and height of the image could not be retrieved yet. -pleaseOnlyUploadContentYouHaveAllUsageRightsFor=Please only upload content you have all usage rights for. Remember that content may be cropped. \ No newline at end of file +pleaseOnlyUploadContentYouHaveAllUsageRightsFor=Please only upload content you have all usage rights for. Remember that content may be cropped. +registerCompetitorsOnRace=Register Competitors on Race (e.g. for split-fleet racing) +doYouWantToRegisterCompetitorsDirectlyOnTheRace=Do you want to register competitors directly on the Race? +doYouWantToDisableCompetitorsRegistrationsOnTheRace=Do you want to disable competitor registrations on the Race? +warningDirectCompetitorRegistration=Warning! This setting will lead to competitors for this race being registered on a per race basis. Competitors will not be automatically registered for this race, when registering them on the corresponding regatta. +warningRegattaCompetitorRegistration=Warning! This will reactivate competior registrations on the regatta. All competitor registrations from the regatta will automatically be used as competitor registration for this race. +competitorRegistrationsOnRaceDisabled=Competitor Registrations are disabled for this race. Enable by checking the checkbox to the left. \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties index e5977cb4867..77584d23674 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties @@ -1393,4 +1393,10 @@ addEventLogo=Veranstaltungs-Logo hinzufügen noImagesDefinedYet=Noch keine Bilder vorhanden imageSizeError=Die Größe des {0}-Bildes ist unpassend. Die Breite sollte zwischen {1} und {2} px und die Höhe zwischen {3} und {4} px sein. couldNotRetrieveImageSizeYet=Bildgröße konnte noch nicht ermittelt werden. -pleaseOnlyUploadContentYouHaveAllUsageRightsFor=Bitte nur Inhalte hochladen, für die alle Verwendungsrechte vorliegen. Bitte beachten: Bilder können verändert wiedergegeben werden. \ No newline at end of file +pleaseOnlyUploadContentYouHaveAllUsageRightsFor=Bitte nur Inhalte hochladen, für die alle Verwendungsrechte vorliegen. Bitte beachten: Bilder können verändert wiedergegeben werden. +registerCompetitorsOnRace=Teilnehmer auf dem Rennen registrieren (z.B. für Split-Fleets) +doYouWantToRegisterCompetitorsDirectlyOnTheRace=Wollen Sie Teilnehmer direkt auf dem Rennen registrieren? +warningDirectCompetitorRegistration=Warnung! Diese Einstellung führt dazu, dass Teilnehmer dieses Rennens sich von nunan auf Rennebene registriert werden müssen. Dies ist nur sinnvoll, wenn sich die Teilnehmer verschiedener Rennen einer Regatta unterscheiden. +warningRegattaCompetitorRegistration=Warnung! Diese Einstellung reaktiviert die Teilnehmerregistrierung auf Regatta-Ebene. Alle Teilnehmer der zu diesem Rennen gehörenden Regatta werden automatisch Teilnehmer dieses Rennens. +doYouWantToDisableCompetitorsRegistrationsOnTheRace=Wollen Sie Teilnehmer auf Regatta- statt Rennebene registrieren? +competitorRegistrationsOnRaceDisabled=Teilnehmeranmeldung ist für dieses Rennen auf Rennebene deaktiviert. Aktivieren durch selektieren der CheckBox auf der linken Seite. \ No newline at end of file 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 615254a73c1..27a8a4c7cf1 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 @@ -79,9 +79,12 @@ import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.FlagPoleSta import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.ReadonlyGateStartRacingProcedure; import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.ReadonlyRRS26RacingProcedure; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogOpenEndedDeviceMappingCloser; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogUsesOwnCompetitorsAnalyzer; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RegisteredCompetitorsFinder; +import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogUseCompetitorsFromRaceLogEventImpl; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogCloseOpenEndedDeviceMappingEvent; @@ -5841,4 +5844,36 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S return convertToCompetitorDTOs(new CompetitorsInLogAnalyzer<>(regattaLog).analyze()); } + + @Override + public boolean areCompetitorRegistrationsEnabledForRace(String leaderboardName, String raceColumnName, + String fleetName) { + RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); + RaceLogUsesOwnCompetitorsAnalyzer analyzer = new RaceLogUsesOwnCompetitorsAnalyzer(raceLog); + return analyzer.analyze(); + } + + @Override + public void deactivateCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName) throws NotRevokableException { + if (areCompetitorRegistrationsEnabledForRace(leaderboardName, raceColumnName, fleetName)){ + RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); + + List events = new AllEventsOfTypeFinder<>(raceLog, true, RaceLogUseCompetitorsFromRaceLogEvent.class).analyze(); + List eventIds = new ArrayList<>(); + for (RaceLogEvent event : events) { + revokeEvent(false, event.getId(), raceLog); + } + } + } + + @Override + public void activateCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName) { + if (!areCompetitorRegistrationsEnabledForRace(leaderboardName, raceColumnName, fleetName)){ + RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); + int passId = raceLog.getCurrentPassId(); + RaceLogUseCompetitorsFromRaceLogEvent event = new RaceLogUseCompetitorsFromRaceLogEventImpl(MillisecondsTimePoint.now(), + getService().getServerAuthor(), MillisecondsTimePoint.now(), UUID.randomUUID(), passId); + raceLog.add(event); + } + } } From 151063d2c33821482eb1b71bef7eca5c12720f0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Mon, 2 Nov 2015 15:07:14 +0100 Subject: [PATCH 016/165] Removes unused code --- .../java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java | 1 - 1 file changed, 1 deletion(-) 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 27a8a4c7cf1..b5673cd8b71 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 @@ -5859,7 +5859,6 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); List events = new AllEventsOfTypeFinder<>(raceLog, true, RaceLogUseCompetitorsFromRaceLogEvent.class).analyze(); - List eventIds = new ArrayList<>(); for (RaceLogEvent event : events) { revokeEvent(false, event.getId(), raceLog); } From 3ae4d992604a78de819450aa5af5c097b1095bb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Mon, 2 Nov 2015 17:13:03 +0100 Subject: [PATCH 017/165] Readds mark removal feature, which disallows removal of marks used in other races --- ...mpetitorProviderCacheInvalidationTest.java | 2 - .../adminconsole/CourseManagementWidget.java | 11 +++ .../RaceLogCourseManagementWidget.java | 91 ++++++++++++------- .../sailing/gwt/ui/client/SailingService.java | 3 + .../gwt/ui/client/SailingServiceAsync.java | 3 + .../sailing/gwt/ui/client/StringMessages.java | 1 + .../gwt/ui/client/StringMessages.properties | 3 +- .../ui/client/StringMessages_de.properties | 3 +- .../gwt/ui/server/SailingServiceImpl.java | 42 +++++++++ 9 files changed, 122 insertions(+), 37 deletions(-) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CompetitorProviderCacheInvalidationTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CompetitorProviderCacheInvalidationTest.java index a6bdfc9aebc..fef28a4aee5 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CompetitorProviderCacheInvalidationTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CompetitorProviderCacheInvalidationTest.java @@ -18,10 +18,8 @@ import org.junit.Test; import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; import com.sap.sailing.domain.abstractlog.race.RaceLog; -import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogEventFactory; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogUseCompetitorsFromRaceLogEventImpl; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogRegisterCompetitorEventImpl; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CourseManagementWidget.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CourseManagementWidget.java index 3ac01a1e044..0d4eee446e1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CourseManagementWidget.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CourseManagementWidget.java @@ -23,6 +23,7 @@ import com.google.gwt.view.client.SetSelectionModel; import com.google.gwt.view.client.SingleSelectionModel; import com.sap.sailing.domain.common.PassingInstruction; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; +import com.sap.sailing.gwt.ui.client.SelectionChangeListener; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.shared.ControlPointDTO; import com.sap.sailing.gwt.ui.shared.GateDTO; @@ -74,6 +75,13 @@ public abstract class CourseManagementWidget implements IsWidget { marks = new MarkTableWrapper>( /* multiSelection */ true, sailingService, stringMessages, errorReporter); + marks.getSelectionModel().addSelectionChangeHandler(new SelectionChangeEvent.Handler() { + @Override + public void onSelectionChange(SelectionChangeEvent event) { + markSelectionChanged(); + } + }); + CaptionPanel waypointsPanel = new CaptionPanel(stringMessages.waypoints()); CaptionPanel controlPointsPanel = new CaptionPanel(stringMessages.twoMarkControlPoint()); CaptionPanel marksPanel = new CaptionPanel(stringMessages.mark()); @@ -156,6 +164,9 @@ public abstract class CourseManagementWidget implements IsWidget { controlPointsBtnsPanel.add(addControlPoint); } + protected void markSelectionChanged() { + } + private void removeWaypoint(WaypointDTO waypoint) { waypoints.getDataProvider().getList().remove(waypoint); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCourseManagementWidget.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCourseManagementWidget.java index b28b9121095..f5c5bf75e21 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCourseManagementWidget.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCourseManagementWidget.java @@ -1,5 +1,7 @@ package com.sap.sailing.gwt.ui.adminconsole; +import java.util.Set; + import com.google.gwt.cell.client.FieldUpdater; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; @@ -10,6 +12,7 @@ import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.shared.MarkDTO; import com.sap.sailing.gwt.ui.shared.RaceCourseDTO; +import com.sap.sse.common.Util.Pair; import com.sap.sse.gwt.client.ErrorReporter; import com.sap.sse.gwt.client.dialog.DataEntryDialog; @@ -17,6 +20,7 @@ public class RaceLogCourseManagementWidget extends CourseManagementWidget { protected final String leaderboardName; protected final String raceColumnName; protected final String fleetName; + private Button removeMark; public RaceLogCourseManagementWidget(final SailingServiceAsync sailingService, final ErrorReporter errorReporter, final StringMessages stringMessages, final String leaderboardName, final String raceColumnName, @@ -27,7 +31,7 @@ public class RaceLogCourseManagementWidget extends CourseManagementWidget { this.raceColumnName = raceColumnName; this.fleetName = fleetName; - Button addMark = new Button(stringMessages.add(stringMessages.mark())); + Button addMark = new Button(stringMessages.addMarkToRegatta()); addMark.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { @@ -35,18 +39,17 @@ public class RaceLogCourseManagementWidget extends CourseManagementWidget { new DataEntryDialog.DialogCallback() { @Override public void ok(MarkDTO mark) { - sailingService.addMarkToRegattaLog(leaderboardName, mark, - new AsyncCallback() { - @Override - public void onSuccess(Void result) { - refresh(); - } + sailingService.addMarkToRegattaLog(leaderboardName, mark, new AsyncCallback() { + @Override + public void onSuccess(Void result) { + refresh(); + } - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError("Could not add mark: " + caught.getMessage()); - } - }); + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError("Could not add mark: " + caught.getMessage()); + } + }); } @Override @@ -57,16 +60,15 @@ public class RaceLogCourseManagementWidget extends CourseManagementWidget { }); marksBtnsPanel.add(addMark); - /* TODO: implement the functionality as described in bug2851 - Button removeMark = new Button(stringMessages.remove(stringMessages.mark())); + removeMark = new Button(stringMessages.remove(stringMessages.mark())); removeMark.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { Set marksToRemove = marks.getSelectionModel().getSelectedSet(); - for (MarkDTO markToRemove : marksToRemove) { - sailingService.revokeMarkDefinitionEventInRegattaLog(leaderboardName, - markToRemove, new AsyncCallback() { + for (final MarkDTO markToRemove : marksToRemove) { + sailingService.revokeMarkDefinitionEventInRegattaLog(leaderboardName, markToRemove, + new AsyncCallback() { @Override public void onSuccess(Void result) { @@ -75,17 +77,16 @@ public class RaceLogCourseManagementWidget extends CourseManagementWidget { @Override public void onFailure(Throwable caught) { + errorReporter.reportError("Removing mark failed: "+caught.getMessage()); } }); } } }); - + removeMark.setEnabled(false); - removeMark.setTitle("Is used in x races"); marksBtnsPanel.add(removeMark); - */ - + ImagesBarColumn actionColumn = new ImagesBarColumn( new RaceLogTrackingCourseDefinitionDialogMarksImagesBarCell(stringMessages)); actionColumn.setFieldUpdater(new FieldUpdater() { @@ -96,7 +97,8 @@ public class RaceLogCourseManagementWidget extends CourseManagementWidget { new DataEntryDialog.DialogCallback() { @Override public void ok(Position position) { - sailingService.pingMark(leaderboardName, markDTO, position, new AsyncCallback() { + sailingService.pingMark(leaderboardName, markDTO, position, + new AsyncCallback() { @Override public void onSuccess(Void result) { @@ -120,6 +122,30 @@ public class RaceLogCourseManagementWidget extends CourseManagementWidget { }); marks.getTable().addColumn(actionColumn); } + + @Override + protected void markSelectionChanged() { + Set marksToRemove = marks.getSelectionModel().getSelectedSet(); + + sailingService.checkIfMarksAreUsedInOtherRaceLogs(leaderboardName, raceColumnName, fleetName, marksToRemove, + new AsyncCallback>() { + @Override + public void onSuccess(Pairresult) { + if (result.getA()){ + removeMark.setEnabled(false); + removeMark.setTitle("Removal deavticated, marks are used in races: "+result.getB()); + } else { + removeMark.setEnabled(true); + removeMark.setTitle(""); + } + } + + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError("Could not load course: " + caught.getMessage()); + } + }); + } @Override public void refresh() { @@ -136,17 +162,16 @@ public class RaceLogCourseManagementWidget extends CourseManagementWidget { } }); - sailingService.getMarksInRegattaLog(leaderboardName, - new AsyncCallback>() { - @Override - public void onSuccess(Iterable result) { - marks.refresh(result); - } + sailingService.getMarksInRegattaLog(leaderboardName, new AsyncCallback>() { + @Override + public void onSuccess(Iterable result) { + marks.refresh(result); + } - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError("Could not load marks: " + caught.getMessage()); - } - }); + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError("Could not load marks: " + caught.getMessage()); + } + }); } } \ No newline at end of file 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 a775f4b6b8f..ecfb2eda7d5 100755 --- 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 @@ -626,4 +626,7 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS void deactivateCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName) throws NotRevokableException; void activateCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName); + + Pair checkIfMarksAreUsedInOtherRaceLogs(String leaderboardName, String raceColumnName, + String fleetName, Set marksToRemove); } 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 5250550ff3f..59611dd87d8 100755 --- 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 @@ -768,4 +768,7 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan void activateCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName, AsyncCallback asyncCallback); + + void checkIfMarksAreUsedInOtherRaceLogs(String leaderboardName, String raceColumnName, String fleetName, + Set marksToRemove, AsyncCallback> asyncCallback); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java index a287d697d56..d059c870cf6 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java @@ -1440,4 +1440,5 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, c String warningDirectCompetitorRegistration(); String warningRegattaCompetitorRegistration(); String competitorRegistrationsOnRaceDisabled(); + String addMarkToRegatta(); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties index e35629b4be0..f969963cddd 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties @@ -1410,4 +1410,5 @@ doYouWantToRegisterCompetitorsDirectlyOnTheRace=Do you want to register competit doYouWantToDisableCompetitorsRegistrationsOnTheRace=Do you want to disable competitor registrations on the Race? warningDirectCompetitorRegistration=Warning! This setting will lead to competitors for this race being registered on a per race basis. Competitors will not be automatically registered for this race, when registering them on the corresponding regatta. warningRegattaCompetitorRegistration=Warning! This will reactivate competior registrations on the regatta. All competitor registrations from the regatta will automatically be used as competitor registration for this race. -competitorRegistrationsOnRaceDisabled=Competitor Registrations are disabled for this race. Enable by checking the checkbox to the left. \ No newline at end of file +competitorRegistrationsOnRaceDisabled=Competitor Registrations are disabled for this race. Enable by checking the checkbox to the left. +addMarkToRegatta=Add Mark to Regatta \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties index 77584d23674..5618f63042e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties @@ -1399,4 +1399,5 @@ doYouWantToRegisterCompetitorsDirectlyOnTheRace=Wollen Sie Teilnehmer direkt auf warningDirectCompetitorRegistration=Warnung! Diese Einstellung führt dazu, dass Teilnehmer dieses Rennens sich von nunan auf Rennebene registriert werden müssen. Dies ist nur sinnvoll, wenn sich die Teilnehmer verschiedener Rennen einer Regatta unterscheiden. warningRegattaCompetitorRegistration=Warnung! Diese Einstellung reaktiviert die Teilnehmerregistrierung auf Regatta-Ebene. Alle Teilnehmer der zu diesem Rennen gehörenden Regatta werden automatisch Teilnehmer dieses Rennens. doYouWantToDisableCompetitorsRegistrationsOnTheRace=Wollen Sie Teilnehmer auf Regatta- statt Rennebene registrieren? -competitorRegistrationsOnRaceDisabled=Teilnehmeranmeldung ist für dieses Rennen auf Rennebene deaktiviert. Aktivieren durch selektieren der CheckBox auf der linken Seite. \ No newline at end of file +competitorRegistrationsOnRaceDisabled=Teilnehmeranmeldung ist für dieses Rennen auf Rennebene deaktiviert. Aktivieren durch selektieren der CheckBox auf der linken Seite. +addMarkToRegatta=Tonne zu Regatta hinzufügen \ No newline at end of file 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 b5673cd8b71..9c9ae67cf9a 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 @@ -5875,4 +5875,46 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S raceLog.add(event); } } + + @Override + public Pair checkIfMarksAreUsedInOtherRaceLogs(String leaderboardName, String raceColumnName, + String fleetName, Set marksToRemove) { + Set markIds = new HashSet(); + for (MarkDTO markDTO : marksToRemove) { + markIds.add(markDTO.getIdAsString()); + } + + RaceLog raceLogToIgnore = getRaceLog(leaderboardName, raceColumnName, fleetName); + HashSet racesContainingMarksToDeleteInCourse = new HashSet(); + + boolean marksAreUsedInOtherRaceLogs = false; + + Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName); + for (RaceColumn raceColumn : leaderboard.getRaceColumns()) { + for (Fleet fleet : raceColumn.getFleets()) { + RaceLog raceLog = raceColumn.getRaceLog(fleet); + if (!raceLog.equals(raceLogToIgnore)){ + LastPublishedCourseDesignFinder finder = new LastPublishedCourseDesignFinder(raceLog); + CourseBase course = finder.analyze(); + for (Waypoint waypoint: course.getWaypoints()){ + for (Mark mark: waypoint.getMarks()){ + if (markIds.contains(mark.getId().toString())){ + //FIXME: check how to infer race name + racesContainingMarksToDeleteInCourse.add(raceColumn.getName()); + marksAreUsedInOtherRaceLogs = true; + } + } + } + } + } + } + + StringBuilder racesInCollision = new StringBuilder(); + for (String raceName : racesContainingMarksToDeleteInCourse) { + racesInCollision.append(raceName+", "); + } + + return new Pair(marksAreUsedInOtherRaceLogs, + racesInCollision.substring(0, Math.max(0, racesInCollision.length()-2))); + } } From 0daf5d427e550031e16bcefb04da1ad662afe174 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Wed, 4 Nov 2015 12:55:42 +0100 Subject: [PATCH 018/165] Rename CompetitorFinder --> CompetitorAnalyzer and add javadoc --- .../racelogtracking/impl/RaceLogRaceTracker.java | 4 ++-- ...inder.java => RegisteredCompetitorsAnalyzer.java} | 12 ++++++++++-- .../shared/analyzing/CompetitorsInLogAnalyzer.java | 4 ++-- ...petitorProviderFromRaceColumnsAndRegattaLike.java | 4 ++-- .../sailing/gwt/ui/server/SailingServiceImpl.java | 6 +++--- 5 files changed, 19 insertions(+), 11 deletions(-) rename java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/{RegisteredCompetitorsFinder.java => RegisteredCompetitorsAnalyzer.java} (80%) diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java index 772172d3d25..dab4e72c880 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java @@ -31,7 +31,7 @@ import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMapping import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceInformationFinder; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer; -import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RegisteredCompetitorsFinder; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RegisteredCompetitorsAnalyzer; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDefineMarkEvent; @@ -481,7 +481,7 @@ public class RaceLogRaceTracker implements RaceTracker, GPSFixReceivedListener { Set competitors; try { RegattaLog regattaLog = params.getRegattaLog(); - competitors = new RegisteredCompetitorsFinder(raceLog, regattaLog).analyze(); + competitors = new RegisteredCompetitorsAnalyzer(raceLog, regattaLog).analyze(); } catch (DoesNotHaveRegattaLogException e) { logger.warning(params.getLeaderboard().getName()+" doesn't have an attached RegattaLog"); competitors = new RaceLogRegisteredCompetitorsAnalyzer(raceLog).analyze(); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RegisteredCompetitorsFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RegisteredCompetitorsAnalyzer.java similarity index 80% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RegisteredCompetitorsFinder.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RegisteredCompetitorsAnalyzer.java index 28da5b247b3..c908e5698aa 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RegisteredCompetitorsFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RegisteredCompetitorsAnalyzer.java @@ -12,10 +12,18 @@ import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.shared.events.RegisterCompetitorEvent; import com.sap.sailing.domain.base.Competitor; -public class RegisteredCompetitorsFinder extends RaceLogAnalyzer> { +/** + * Used to find competitors of a race. Checks whether the competitors for the given race are registered on the RaceLog + * via {@link RaceLogUsesOwnCompetitorsAnalyzer} or on the RegattaLog and fetches the competitors appropriately. + * + * @author D056848 + * + */ + +public class RegisteredCompetitorsAnalyzer extends RaceLogAnalyzer> { private RegattaLog regattaLog; - public RegisteredCompetitorsFinder(RaceLog raceLog, RegattaLog regattaLog) { + public RegisteredCompetitorsAnalyzer(RaceLog raceLog, RegattaLog regattaLog) { super(raceLog); this.regattaLog = regattaLog; } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/CompetitorsInLogAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/CompetitorsInLogAnalyzer.java index 75631bd4af6..7001fda0406 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/CompetitorsInLogAnalyzer.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/CompetitorsInLogAnalyzer.java @@ -8,14 +8,14 @@ import com.sap.sailing.domain.abstractlog.AbstractLogEvent; import com.sap.sailing.domain.abstractlog.BaseLogAnalyzer; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogRegisteredCompetitorsAnalyzer; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RegisteredCompetitorsFinder; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RegisteredCompetitorsAnalyzer; import com.sap.sailing.domain.abstractlog.shared.events.RegisterCompetitorEvent; import com.sap.sailing.domain.base.Competitor; /** * This class searches for RegisterCompetitorEvents in the given log. * - * TLDR: It's likely, that you shouldn't use this, but you might want to use {@link RegisteredCompetitorsFinder} or {@link RaceLogRegisteredCompetitorsAnalyzer} + * TLDR: It's likely, that you shouldn't use this, but you might want to use {@link RegisteredCompetitorsAnalyzer} or {@link RaceLogRegisteredCompetitorsAnalyzer} * * Note that solemnly analyzing a certain race or RegattaLog my not lead the correct registered competitors for the race * corresponding to the RaceLog/the races corresponding to the RegattaLog. diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/CompetitorProviderFromRaceColumnsAndRegattaLike.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/CompetitorProviderFromRaceColumnsAndRegattaLike.java index f1143798fa3..d18d417b55a 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/CompetitorProviderFromRaceColumnsAndRegattaLike.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/CompetitorProviderFromRaceColumnsAndRegattaLike.java @@ -12,7 +12,7 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogRevokeEvent; import com.sap.sailing.domain.abstractlog.race.impl.BaseRaceLogEventVisitor; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RegisteredCompetitorsFinder; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RegisteredCompetitorsAnalyzer; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogRegisterCompetitorEvent; @@ -194,7 +194,7 @@ public class CompetitorProviderFromRaceColumnsAndRegattaLike { } private Set getCompetitorsForRaceAndRegisterAsRegattaLogListener(RaceLog racelog) { - Set viaLog = new RegisteredCompetitorsFinder(racelog, provider.getRegattaLike().getRegattaLog()) + Set viaLog = new RegisteredCompetitorsAnalyzer(racelog, provider.getRegattaLike().getRegattaLog()) .analyze(); // note: adding listeners is idempotent; at most one occurrence of this listener exists in the regatta log's // listeners set 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 9c9ae67cf9a..fb32b5cfa7a 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 @@ -83,7 +83,7 @@ import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFro import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogOpenEndedDeviceMappingCloser; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogUsesOwnCompetitorsAnalyzer; -import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RegisteredCompetitorsFinder; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RegisteredCompetitorsAnalyzer; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogUseCompetitorsFromRaceLogEventImpl; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; @@ -2313,7 +2313,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S boolean raceLogTrackerExists = raceLog == null ? false : getService().getRaceTrackerById(raceLog.getId()) != null; boolean competitorRegistrationsExist; try { - competitorRegistrationsExist = raceLog == null ? false : ! new RegisteredCompetitorsFinder(raceLog, getRegattaLogInternal(leaderboard.getName())).analyze().isEmpty(); + competitorRegistrationsExist = raceLog == null ? false : ! new RegisteredCompetitorsAnalyzer(raceLog, getRegattaLogInternal(leaderboard.getName())).analyze().isEmpty(); } catch (DoesNotHaveRegattaLogException e) { competitorRegistrationsExist = false; } @@ -5835,7 +5835,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S String fleetName) throws DoesNotHaveRegattaLogException { RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); RegattaLog regattaLog = getRegattaLogInternal(leaderboardName); - return convertToCompetitorDTOs(new RegisteredCompetitorsFinder(raceLog, regattaLog).analyze()); + return convertToCompetitorDTOs(new RegisteredCompetitorsAnalyzer(raceLog, regattaLog).analyze()); } @Override From 06b9f9c358954f55276682c2e99a8a16e3f3adcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Wed, 18 Nov 2015 18:46:47 +0100 Subject: [PATCH 019/165] Remove unused imports --- .../domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java index 99502eed3ac..f592228cc2f 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java @@ -29,7 +29,6 @@ import com.sap.sailing.domain.abstractlog.impl.AllEventsOfTypeFinder; import com.sap.sailing.domain.abstractlog.impl.LastEventOfTypeFinder; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.LastPublishedCourseDesignFinder; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogCourseDesignChangedEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent; From 437d1bcb3d60cb593d2ca9902aa6646a411a26f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Fri, 20 Nov 2015 15:30:04 +0100 Subject: [PATCH 020/165] Only allow to select competitors registered on regatta for race --- ...AbstractCompetitorRegistrationsDialog.java | 13 ++---------- .../RaceLogCompetitorRegistrationDialog.java | 21 +++++++++++++++---- ...egattaLogCompetitorRegistrationDialog.java | 15 +++++++++++++ 3 files changed, 34 insertions(+), 15 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java index 8da2cd29e66..b76950434f4 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java @@ -6,7 +6,6 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import com.google.gwt.core.client.Callback; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.rpc.AsyncCallback; @@ -199,19 +198,11 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia protected void refreshCompetitors() { registeredCompetitorsTable.getDataProvider().getList().clear(); - allCompetitorsTable.refreshCompetitorList(null, new Callback, Throwable>() { - @Override - public void onSuccess(Iterable result) { - setRegisteredCompetitors(); - } - - @Override - public void onFailure(Throwable reason) { - } - }); + setRegisterableCompetitors(); } protected abstract void setRegisteredCompetitors(); + protected abstract void setRegisterableCompetitors(); public void deactivateRegistrationButtons(String tooltip){ registerBtn.setEnabled(false); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java index 8e22307994a..5b2280cd72d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java @@ -3,6 +3,7 @@ package com.sap.sailing.gwt.ui.adminconsole; import java.util.Collection; import java.util.Set; +import com.google.gwt.core.client.Callback; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.rpc.AsyncCallback; @@ -82,12 +83,11 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis String message; if (competitorRegistrationInRaceLogCheckBox.getValue()) { - title = stringMessages.doYouWantToDisableCompetitorsRegistrationsOnTheRace(); - message = stringMessages.warningRegattaCompetitorRegistration(); - - } else { title = stringMessages.doYouWantToRegisterCompetitorsDirectlyOnTheRace(); message = stringMessages.warningDirectCompetitorRegistration(); + } else { + title = stringMessages.doYouWantToDisableCompetitorsRegistrationsOnTheRace(); + message = stringMessages.warningRegattaCompetitorRegistration(); } new DataEntryDialog(title, message, stringMessages.ok(), stringMessages.cancel(), null, false, @@ -146,4 +146,17 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis }); } + @Override + protected void setRegisterableCompetitors() { + allCompetitorsTable.refreshCompetitorList(leaderboardName, new Callback, Throwable>() { + @Override + public void onSuccess(Iterable result) { + setRegisteredCompetitors(); + } + + @Override + public void onFailure(Throwable reason) { + } + }); + } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogCompetitorRegistrationDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogCompetitorRegistrationDialog.java index dcb4784fabd..9f5b0e692be 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogCompetitorRegistrationDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogCompetitorRegistrationDialog.java @@ -3,6 +3,7 @@ package com.sap.sailing.gwt.ui.adminconsole; import java.util.Collection; import java.util.Set; +import com.google.gwt.core.client.Callback; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.FlowPanel; import com.sap.sailing.domain.common.dto.CompetitorDTO; @@ -41,4 +42,18 @@ public class RegattaLogCompetitorRegistrationDialog extends AbstractCompetitorRe @Override public void addAdditionalWidgets(FlowPanel mainPanel) { } + + @Override + protected void setRegisterableCompetitors() { + allCompetitorsTable.refreshCompetitorList(null, new Callback, Throwable>() { + @Override + public void onSuccess(Iterable result) { + setRegisteredCompetitors(); + } + + @Override + public void onFailure(Throwable reason) { + } + }); + } } From a9e5c693f659baf13ef21205486dc0215188793d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Fri, 20 Nov 2015 16:06:10 +0100 Subject: [PATCH 021/165] Surpress warnings for deprecation in test cases --- .../test/AbstractGPSFixStoreTest.java | 1 + .../test/DeviceMappingFinderTest.java | 1 + .../test/StoreAndLoadRaceLogEventsTest.java | 1 + .../mongodb/test/StoreGPSFixTrackTest.java | 18 +++++++++--------- .../racelog/RaceLogEventSerializerTest.java | 1 + 5 files changed, 13 insertions(+), 9 deletions(-) diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java index f48a27959ec..e696a5cf9b5 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java @@ -33,6 +33,7 @@ import com.sap.sailing.server.gateway.deserialization.impl.DeviceAndSessionIdent import com.sap.sailing.server.impl.RacingEventServiceImpl; import com.sap.sse.common.impl.MillisecondsTimePoint; +@SuppressWarnings("deprecation") public class AbstractGPSFixStoreTest { protected RacingEventService service; protected final MockSmartphoneImeiServiceFinderFactory serviceFinderFactory = new MockSmartphoneImeiServiceFinderFactory(); diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/DeviceMappingFinderTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/DeviceMappingFinderTest.java index 212503f37c7..e6ce4f2410d 100644 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/DeviceMappingFinderTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/DeviceMappingFinderTest.java @@ -23,6 +23,7 @@ import com.sap.sailing.domain.racelogtracking.DeviceMapping; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; +@SuppressWarnings("deprecation") public class DeviceMappingFinderTest extends AbstractRaceLogTrackingTest { private final Competitor competitor = new CompetitorImpl("comp", "Comp", null, null, null, null, null, /* timeOnTimeFactor */ null, /* timeOnDistanceAllowancePerNauticalMile */ null); private final Competitor competitor2 = new CompetitorImpl("comp2", "Comp2", null, null, null, null, null, /* timeOnTimeFactor */ null, /* timeOnDistanceAllowancePerNauticalMile */ null); diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java index 7310f41b3ca..625085bc44d 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java @@ -63,6 +63,7 @@ import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; +@SuppressWarnings("deprecation") public class StoreAndLoadRaceLogEventsTest extends AbstractMongoDBTest { protected MongoObjectFactoryImpl mongoFactory = (MongoObjectFactoryImpl) PersistenceFactory.INSTANCE diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreGPSFixTrackTest.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreGPSFixTrackTest.java index c281b7d4f4c..400ab63fffd 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreGPSFixTrackTest.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreGPSFixTrackTest.java @@ -12,10 +12,10 @@ import com.mongodb.DB; import com.mongodb.MongoException; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; -import com.sap.sailing.domain.abstractlog.race.RaceLog; -import com.sap.sailing.domain.abstractlog.race.impl.RaceLogImpl; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceCompetitorMappingEventImpl; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceMarkMappingEventImpl; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; +import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceCompetitorMappingEventImpl; +import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceMarkMappingEventImpl; +import com.sap.sailing.domain.abstractlog.regatta.impl.RegattaLogImpl; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.DomainFactory; import com.sap.sailing.domain.base.Mark; @@ -86,14 +86,14 @@ public class StoreGPSFixTrackTest extends AbstractMongoDBTest { DeviceIdentifier device2 = new SmartphoneImeiIdentifier("b"); store.storeFix(device2, fix4); - RaceLog raceLog = new RaceLogImpl("racelog"); - raceLog.add(new RaceLogDeviceCompetitorMappingEventImpl(time0, author, 0, comp, device1, time0, time1)); - raceLog.add(new RaceLogDeviceMarkMappingEventImpl(time0, author, 0, mark, device2, time0, time1)); + RegattaLog regattaLog = new RegattaLogImpl("racelog"); + regattaLog.add(new RegattaLogDeviceCompetitorMappingEventImpl(time0, author, comp, device1, time0, time1)); + regattaLog.add(new RegattaLogDeviceMarkMappingEventImpl(time0, author, mark, device2, time0, time1)); DynamicGPSFixMovingTrackImpl track1 = new DynamicGPSFixMovingTrackImpl<>(comp, 0); - store.loadCompetitorTrack(track1, raceLog, comp); + store.loadCompetitorTrack(track1, regattaLog, comp); DynamicGPSFixTrackImpl track2 = new DynamicGPSFixTrackImpl<>(mark, 0); - store.loadMarkTrack(track2, raceLog, mark); + store.loadMarkTrack(track2, regattaLog, mark); track1.lockForRead(); assertEquals(2, Util.size(track1.getRawFixes())); assertTrue(track1.getFirstRawFix() instanceof GPSFixMoving); diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java index 784f69f64d1..be640e01fc7 100644 --- a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java +++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java @@ -39,6 +39,7 @@ import com.sap.sailing.server.gateway.serialization.JsonSerializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogEventSerializer; import com.sap.sse.common.impl.MillisecondsTimePoint; +@SuppressWarnings("deprecation") public class RaceLogEventSerializerTest { private RaceLogEventSerializer serializer; From 34cb677b5e4812c599b09b346bce11fe54b4f40a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Mon, 23 Nov 2015 13:47:30 +0100 Subject: [PATCH 022/165] Removes duplicate CompetitorInLogFinder COde --- .../impl/RegisteredCompetitorsAnalyzer.java | 34 +------------------ 1 file changed, 1 insertion(+), 33 deletions(-) diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RegisteredCompetitorsAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RegisteredCompetitorsAnalyzer.java index c908e5698aa..1cf2b5e22c4 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RegisteredCompetitorsAnalyzer.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RegisteredCompetitorsAnalyzer.java @@ -1,15 +1,11 @@ package com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl; -import java.util.HashSet; import java.util.Set; -import com.sap.sailing.domain.abstractlog.AbstractLog; -import com.sap.sailing.domain.abstractlog.AbstractLogEvent; -import com.sap.sailing.domain.abstractlog.BaseLogAnalyzer; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogAnalyzer; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; -import com.sap.sailing.domain.abstractlog.shared.events.RegisterCompetitorEvent; +import com.sap.sailing.domain.abstractlog.shared.analyzing.CompetitorsInLogAnalyzer; import com.sap.sailing.domain.base.Competitor; /** @@ -38,32 +34,4 @@ public class RegisteredCompetitorsAnalyzer extends RaceLogAnalyzer(regattaLog).analyze(); } } - - - /** - * Uses the {@link RegisterCompetitorEvent}s in the provided {@link AbstractLog} to determine the competitors registered in the given log. - * - * @author Fredrik Teschke - * - */ - private class CompetitorsInLogAnalyzer, EventT extends AbstractLogEvent, VisitorT> - extends BaseLogAnalyzer> { - - public CompetitorsInLogAnalyzer(LogT log) { - super(log); - } - - @Override - protected Set performAnalysis() { - Set result = new HashSet(); - - for (EventT event : getLog().getUnrevokedEvents()) { - if (event instanceof RegisterCompetitorEvent) { - result.add(((RegisterCompetitorEvent) event).getCompetitor()); - } - } - - return result; - } - } } From 45ebf28856ff999c7f43cf3983b1921e90629849 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Mon, 23 Nov 2015 14:01:36 +0100 Subject: [PATCH 023/165] Refactor RaceLogDefinedMarkFinder --- .../analyzing/impl/DefinedMarkFinder.java | 44 +++++++++++++++++++ .../impl/RaceLogDefinedMarkFinder.java | 39 ---------------- .../shared/events/DeviceMappingEvent.java | 4 +- .../domain/tracking/impl/TrackedRaceImpl.java | 4 +- .../impl/rc/MarksJsonExportServlet.java | 4 +- .../jaxrs/api/LeaderboardsResource.java | 6 +-- 6 files changed, 53 insertions(+), 48 deletions(-) create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/DefinedMarkFinder.java delete mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceLogDefinedMarkFinder.java diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/DefinedMarkFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/DefinedMarkFinder.java new file mode 100644 index 00000000000..5098218d5a9 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/DefinedMarkFinder.java @@ -0,0 +1,44 @@ +package com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import com.sap.sailing.domain.abstractlog.AbstractLog; +import com.sap.sailing.domain.abstractlog.AbstractLogEvent; +import com.sap.sailing.domain.abstractlog.BaseLogAnalyzer; +import com.sap.sailing.domain.abstractlog.LogAnalyzer; +import com.sap.sailing.domain.abstractlog.MultiLogAnalyzer.AnalyzerFactory; +import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDefineMarkEvent; +import com.sap.sailing.domain.base.Mark; + +public class DefinedMarkFinder, EventT extends AbstractLogEvent, VisitorT> + extends BaseLogAnalyzer> { + + public static class Factory implements AnalyzerFactory> { + @Override + public LogAnalyzer> createAnalyzer(AbstractLog log) { + return new DefinedMarkFinder<>(log); + } + } + + public DefinedMarkFinder(LogT log) { + super(log); + } + + @Override + protected Collection performAnalysis() { + List result = new ArrayList(); + for (AbstractLogEvent event : getLog().getUnrevokedEvents()) { + if (event instanceof RaceLogDefineMarkEvent) { + RaceLogDefineMarkEvent dME = (RaceLogDefineMarkEvent) event; + result.add(dME.getMark()); + } else if (event instanceof RegattaLogDefineMarkEvent) { + RegattaLogDefineMarkEvent dME = (RegattaLogDefineMarkEvent) event; + result.add(dME.getMark()); + } + } + return result; + } +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceLogDefinedMarkFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceLogDefinedMarkFinder.java deleted file mode 100644 index 2a717a1ca0c..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceLogDefinedMarkFinder.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -import com.sap.sailing.domain.abstractlog.AbstractLog; -import com.sap.sailing.domain.abstractlog.MultiLogAnalyzer.AnalyzerFactory; -import com.sap.sailing.domain.abstractlog.race.RaceLog; -import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogAnalyzer; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent; -import com.sap.sailing.domain.base.Mark; - -@Deprecated //bug2851 -public class RaceLogDefinedMarkFinder extends RaceLogAnalyzer> { - public RaceLogDefinedMarkFinder(RaceLog raceLog) { - super(raceLog); - } - - public static class Factory implements AnalyzerFactory> { - @Override - public RaceLogAnalyzer> createAnalyzer(AbstractLog log) { - return new RaceLogDefinedMarkFinder((RaceLog) log); - } - } - - @Override - protected Collection performAnalysis() { - List result = new ArrayList(); - for (RaceLogEvent event : getLog().getUnrevokedEvents()) { - if (event instanceof RaceLogDefineMarkEvent) { - RaceLogDefineMarkEvent dME = (RaceLogDefineMarkEvent) event; - result.add(dME.getMark()); - } - } - return result; - } -} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/DeviceMappingEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/DeviceMappingEvent.java index ed69b2cb35d..2a31b71140e 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/DeviceMappingEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/DeviceMappingEvent.java @@ -2,7 +2,7 @@ package com.sap.sailing.domain.abstractlog.shared.events; import com.sap.sailing.domain.abstractlog.AbstractLogEvent; import com.sap.sailing.domain.abstractlog.Revokable; -import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogDefinedMarkFinder; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.DefinedMarkFinder; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; @@ -19,7 +19,7 @@ import com.sap.sse.common.WithID; * If one end of the time range enclosed by {@link #getFrom()} and {@link #getTo()} is open, this can be closed * by a {@link CloseOpenEndedDeviceMappingEvent}. * - * @see RaceLogDefinedMarkFinder for rules by which {@link DeviceMapping}s are derived from these events. + * @see DefinedMarkFinder for rules by which {@link DeviceMapping}s are derived from these events. * @author Fredrik Teschke */ public interface DeviceMappingEvent extends AbstractLogEvent, Revokable { 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 db9cbbe03cc..b3ec81726f9 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 @@ -54,7 +54,7 @@ import com.sap.sailing.domain.abstractlog.race.impl.RaceLogGateLineOpeningTimeEv import com.sap.sailing.domain.abstractlog.race.state.ReadonlyRaceState; import com.sap.sailing.domain.abstractlog.race.state.impl.RaceStateImpl; import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ReadonlyRacingProcedure; -import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogDefinedMarkFinder; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.DefinedMarkFinder; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.shared.analyzing.DeviceMarkMappingFinder; import com.sap.sailing.domain.base.BoatClass; @@ -3930,7 +3930,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl new MapWithValueCollectionReducer<>(), allLogs).analyze(); final Set result = new HashSet<>(); result.addAll(markMappings.keySet()); - final AnalyzerFactory> analyzerFactory = new RaceLogDefinedMarkFinder.Factory(); + final AnalyzerFactory> analyzerFactory = new DefinedMarkFinder.Factory(); Set marksDefinedInRaceLog = new MultiLogAnalyzer<>(analyzerFactory, new SetReducer(), raceLogs).analyze(); result.addAll(marksDefinedInRaceLog); return result; diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarksJsonExportServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarksJsonExportServlet.java index d38dc9d95ae..d9a36dcd159 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarksJsonExportServlet.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarksJsonExportServlet.java @@ -11,7 +11,7 @@ import javax.servlet.http.HttpServletResponse; import org.json.simple.JSONArray; -import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogDefinedMarkFinder; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.DefinedMarkFinder; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.base.RaceColumn; @@ -69,7 +69,7 @@ public class MarksJsonExportServlet extends AbstractJsonHttpServlet { } else { final List marksList = new ArrayList<>(); // no tracked race associated yet; grab the mark definitions from the race log: - for (Mark markDefinitionFromRaceLog : new RaceLogDefinedMarkFinder(raceColumn.getRaceLog(fleet)).analyze()) { + for (Mark markDefinitionFromRaceLog : new DefinedMarkFinder<>(raceColumn.getRaceLog(fleet)).analyze()) { marksList.add(markDefinitionFromRaceLog); } marks = marksList; diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java index 328b0b0d573..60d8eba0b33 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java @@ -36,7 +36,7 @@ import org.json.simple.parser.ParseException; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; import com.sap.sailing.domain.abstractlog.race.RaceLog; -import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogDefinedMarkFinder; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.DefinedMarkFinder; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogCloseOpenEndedDeviceMappingEventImpl; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceCompetitorMappingEventImpl; @@ -556,7 +556,7 @@ public class LeaderboardsResource extends AbstractSailingServerResource { for (Fleet fleet : raceColumn.getFleets()) { RaceLog raceLog = raceColumn.getRaceLog(fleet); TrackedRace trackedRace = raceColumn.getTrackedRace(fleet); // might not yet be attached - Util.addAll(new RaceLogDefinedMarkFinder(raceLog).analyze(), marks); + Util.addAll(new DefinedMarkFinder<>(raceLog).analyze(), marks); if (trackedRace != null) { Util.addAll(trackedRace.getMarks(), marks); } @@ -605,7 +605,7 @@ public class LeaderboardsResource extends AbstractSailingServerResource { RaceLog raceLog = raceColumn.getRaceLog(fleet); TrackedRace trackedRace = raceColumn.getTrackedRace(fleet); // might not yet be attached Set marks = new HashSet<>(); - Util.addAll(new RaceLogDefinedMarkFinder(raceLog).analyze(), marks); + Util.addAll(new DefinedMarkFinder<>(raceLog).analyze(), marks); if (trackedRace != null) { Util.addAll(trackedRace.getMarks(), marks); } From 4addae99f1378b5534a9b5a78a8fed352334eea1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Mon, 23 Nov 2015 14:39:59 +0100 Subject: [PATCH 024/165] Use fully qualified classname and ignore deprecation warnings --- .../impl/DomainObjectFactoryImpl.java | 22 ++++++------ .../impl/MongoObjectFactoryImpl.java | 29 ++++++++------- .../impl/MongoRaceLogStoreVisitor.java | 12 +++---- .../impl/RaceLogRaceTracker.java | 6 ++-- .../impl/RaceLogTrackingAdapterImpl.java | 5 +-- .../abstractlog/race/RaceLogEventVisitor.java | 12 +++---- .../impl/AbstractRaceLogChangedVisitor.java | 12 +++---- .../race/impl/BaseRaceLogEventVisitor.java | 12 +++---- .../analyzing/impl/DefinedMarkFinder.java | 6 ++-- .../impl/RaceColumnRaceLogReplicator.java | 12 +++---- .../masterdataimport/TopLevelMasterData.java | 4 +-- .../adminconsole/CourseManagementWidget.java | 1 - .../gwt/ui/server/SailingServiceImpl.java | 7 ++-- ...enEndedDeviceMappingEventDeserializer.java | 4 +-- .../RaceLogDefineMarkEventDeserializer.java | 4 +-- ...LogDeviceMarkMappingEventDeserializer.java | 36 +++++++++---------- ...OpenEndedDeviceMappingEventSerializer.java | 4 +-- .../RaceLogDefineMarkEventSerializer.java | 7 ++-- .../racelog/impl/RaceLogEventSerializer.java | 12 +++---- 19 files changed, 102 insertions(+), 105 deletions(-) diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java index cbc041b93db..8e2df31309d 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java @@ -82,19 +82,13 @@ import com.sap.sailing.domain.abstractlog.race.impl.SimpleRaceLogIdentifierImpl; import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationType; import com.sap.sailing.domain.abstractlog.race.scoring.RaceLogAdditionalScoringInformationEvent; import com.sap.sailing.domain.abstractlog.race.scoring.impl.RaceLogAdditionalScoringInformationEventImpl; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorMappingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogCloseOpenEndedDeviceMappingEventImpl; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDefineMarkEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDenoteForTrackingEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceCompetitorMappingEventImpl; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceMarkMappingEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogRegisterCompetitorEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogStartTrackingEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogUseCompetitorsFromRaceLogEventImpl; @@ -1311,6 +1305,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { return result; } + @SuppressWarnings("deprecation") /*TODO: remove deprecated RaceLogEvents when migrated*/ public RaceLogEvent loadRaceLogEvent(DBObject dbObject) { TimePoint logicalTimePoint = loadTimePoint(dbObject); TimePoint createdAt = loadTimePoint(dbObject, FieldNames.RACE_LOG_EVENT_CREATED_AT); @@ -1362,7 +1357,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { return loadRaceLogWindFixEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(RaceLogDeviceCompetitorMappingEvent.class.getSimpleName())) { return loadRaceLogDeviceCompetitorMappingEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); - } else if (eventClass.equals(RaceLogDeviceMarkMappingEvent.class.getSimpleName())) { + } else if (eventClass.equals(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent.class.getSimpleName())) { return loadRaceLogDeviceMarkMappingEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(RaceLogDenoteForTrackingEvent.class.getSimpleName())) { return loadRaceLogDenoteForTrackingEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); @@ -1372,9 +1367,9 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { return loadRaceLogRevokeEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(RaceLogRegisterCompetitorEvent.class.getSimpleName())) { return loadRaceLogRegisterCompetitorEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); - } else if (eventClass.equals(RaceLogDefineMarkEvent.class.getSimpleName())) { + } else if (eventClass.equals(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent.class.getSimpleName())) { return loadRaceLogDefineMarkEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); - } else if (eventClass.equals(RaceLogCloseOpenEndedDeviceMappingEvent.class.getSimpleName())) { + } else if (eventClass.equals(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent.class.getSimpleName())) { return loadRaceLogCloseOpenEndedDeviceMappingEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(RaceLogAdditionalScoringInformationEvent.class.getSimpleName())) { return loadRaceLogAdditionalScoringInformationEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); @@ -1418,6 +1413,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { return new RaceLogDeviceCompetitorMappingEventImpl(createdAt, logicalTimePoint, author, id, passId, mappedTo, device, from, to); } + @SuppressWarnings("deprecation") private RaceLogEvent loadRaceLogDeviceMarkMappingEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { DeviceIdentifier device = null; @@ -1432,7 +1428,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { Mark mappedTo = loadMark((DBObject) dbObject.get(FieldNames.MARK.name())); TimePoint from = loadTimePoint(dbObject, FieldNames.RACE_LOG_FROM); TimePoint to = loadTimePoint(dbObject, FieldNames.RACE_LOG_TO); - return new RaceLogDeviceMarkMappingEventImpl(createdAt, logicalTimePoint, author, id, passId, mappedTo, device, from, to); + return new com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceMarkMappingEventImpl(createdAt, logicalTimePoint, author, id, passId, mappedTo, device, from, to); } private RaceLogEvent loadRaceLogDenoteForTrackingEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, @@ -1466,17 +1462,19 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { return new RaceLogRegisterCompetitorEventImpl(createdAt, logicalTimePoint, author, id, passId, comp); } + @SuppressWarnings("deprecation") private RaceLogEvent loadRaceLogDefineMarkEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { Mark mark = loadMark((DBObject) dbObject.get(FieldNames.RACE_LOG_MARK.name())); - return new RaceLogDefineMarkEventImpl(createdAt, author, logicalTimePoint, id, passId, mark); + return new com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDefineMarkEventImpl(createdAt, author, logicalTimePoint, id, passId, mark); } + @SuppressWarnings("deprecation") private RaceLogEvent loadRaceLogCloseOpenEndedDeviceMappingEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { Serializable deviceMappingEventId = Helpers.tryUuidConversion((Serializable) dbObject.get(FieldNames.RACE_LOG_DEVICE_MAPPING_EVENT_ID.name())); TimePoint closingTimePoint = loadTimePoint(dbObject, FieldNames.RACE_LOG_CLOSING_TIMEPOINT); - return new RaceLogCloseOpenEndedDeviceMappingEventImpl(createdAt, logicalTimePoint, author, id, passId, + return new com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogCloseOpenEndedDeviceMappingEventImpl(createdAt, logicalTimePoint, author, id, passId, deviceMappingEventId, closingTimePoint); } diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java index 31143f3819d..1db81025b0d 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java @@ -40,11 +40,8 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogSuppressedMarkPassingsEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; import com.sap.sailing.domain.abstractlog.race.scoring.RaceLogAdditionalScoringInformationEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorMappingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; @@ -854,7 +851,8 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { return result; } - public DBObject storeRaceLogEntry(RaceLogIdentifier raceLogIdentifier, RaceLogDeviceMarkMappingEvent event) { + @SuppressWarnings("deprecation") + public DBObject storeRaceLogEntry(RaceLogIdentifier raceLogIdentifier, com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent event) { BasicDBObject result = new BasicDBObject(); storeRaceLogIdentifier(raceLogIdentifier, result); result.put(FieldNames.RACE_LOG_EVENT.name(), storeRaceLogDeviceMarkMappingEvent(event)); @@ -888,15 +886,17 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { result.put(FieldNames.RACE_LOG_EVENT.name(), storeRaceLogRegisterCompetitorEvent(event)); return result; } - - public DBObject storeRaceLogEntry(RaceLogIdentifier raceLogIdentifier, RaceLogDefineMarkEvent event) { + + @SuppressWarnings("deprecation") + public DBObject storeRaceLogEntry(RaceLogIdentifier raceLogIdentifier, com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent event) { BasicDBObject result = new BasicDBObject(); storeRaceLogIdentifier(raceLogIdentifier, result); result.put(FieldNames.RACE_LOG_EVENT.name(), storeRaceLogDefineMarkEvent(event)); return result; } - public DBObject storeRaceLogEntry(RaceLogIdentifier raceLogIdentifier, RaceLogCloseOpenEndedDeviceMappingEvent event) { + @SuppressWarnings("deprecation") + public DBObject storeRaceLogEntry(RaceLogIdentifier raceLogIdentifier, com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent event) { BasicDBObject result = new BasicDBObject(); storeRaceLogIdentifier(raceLogIdentifier, result); result.put(FieldNames.RACE_LOG_EVENT.name(), storeRaceLogCloseOpenEndedDeviceMappingEvent(event)); @@ -1016,10 +1016,11 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { return result; } - private Object storeRaceLogDeviceMarkMappingEvent(RaceLogDeviceMarkMappingEvent event) { + @SuppressWarnings("deprecation") + private Object storeRaceLogDeviceMarkMappingEvent(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent event) { DBObject result = new BasicDBObject(); storeRaceLogEventProperties(event, result); - result.put(FieldNames.RACE_LOG_EVENT_CLASS.name(), RaceLogDeviceMarkMappingEvent.class.getSimpleName()); + result.put(FieldNames.RACE_LOG_EVENT_CLASS.name(), com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent.class.getSimpleName()); storeDeviceMappingEvent(event, result, FieldNames.RACE_LOG_FROM, FieldNames.RACE_LOG_TO); result.put(FieldNames.MARK.name(), storeMark(event.getMappedTo())); return result; @@ -1061,18 +1062,20 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { return result; } - private Object storeRaceLogDefineMarkEvent(RaceLogDefineMarkEvent event) { + @SuppressWarnings("deprecation") + private Object storeRaceLogDefineMarkEvent(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent event) { DBObject result = new BasicDBObject(); storeRaceLogEventProperties(event, result); - result.put(FieldNames.RACE_LOG_EVENT_CLASS.name(), RaceLogDefineMarkEvent.class.getSimpleName()); + result.put(FieldNames.RACE_LOG_EVENT_CLASS.name(), com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent.class.getSimpleName()); result.put(FieldNames.RACE_LOG_MARK.name(), storeMark(event.getMark())); return result; } - private Object storeRaceLogCloseOpenEndedDeviceMappingEvent(RaceLogCloseOpenEndedDeviceMappingEvent event) { + @SuppressWarnings("deprecation") + private Object storeRaceLogCloseOpenEndedDeviceMappingEvent(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent event) { DBObject result = new BasicDBObject(); storeRaceLogEventProperties(event, result); - result.put(FieldNames.RACE_LOG_EVENT_CLASS.name(), RaceLogCloseOpenEndedDeviceMappingEvent.class.getSimpleName()); + result.put(FieldNames.RACE_LOG_EVENT_CLASS.name(), com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent.class.getSimpleName()); result.put(FieldNames.RACE_LOG_DEVICE_MAPPING_EVENT_ID.name(), event.getDeviceMappingEventId()); storeTimePoint(event.getClosingTimePoint(), result, FieldNames.RACE_LOG_CLOSING_TIMEPOINT); return result; diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java index c1cc603ae10..0bc12285ac6 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java @@ -24,11 +24,8 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogSuppressedMarkPassingsEvent; import com.sap.sailing.domain.abstractlog.race.scoring.RaceLogAdditionalScoringInformationEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorMappingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; @@ -132,8 +129,9 @@ public class MongoRaceLogStoreVisitor implements RaceLogEventVisitor { mongoObjectFactory.storeRaceLogEventEvent(object); } + @SuppressWarnings("deprecation") @Override - public void visit(RaceLogDeviceMarkMappingEvent event) { + public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent event) { DBObject object = mongoObjectFactory.storeRaceLogEntry(raceLogIdentifier, event); mongoObjectFactory.storeRaceLogEventEvent(object); } @@ -162,14 +160,16 @@ public class MongoRaceLogStoreVisitor implements RaceLogEventVisitor { mongoObjectFactory.storeRaceLogEventEvent(object); } + @SuppressWarnings("deprecation") @Override - public void visit(RaceLogDefineMarkEvent event) { + public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent event) { DBObject object = mongoObjectFactory.storeRaceLogEntry(raceLogIdentifier, event); mongoObjectFactory.storeRaceLogEventEvent(object); } + @SuppressWarnings("deprecation") @Override - public void visit(RaceLogCloseOpenEndedDeviceMappingEvent event) { + public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent event) { DBObject object = mongoObjectFactory.storeRaceLogEntry(raceLogIdentifier, event); mongoObjectFactory.storeRaceLogEventEvent(object); } diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java index dab4e72c880..f505eab155d 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java @@ -24,10 +24,8 @@ import com.sap.sailing.domain.abstractlog.race.analyzing.impl.LastPublishedCours import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogRegisteredCompetitorsAnalyzer; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver; import com.sap.sailing.domain.abstractlog.race.impl.BaseRaceLogEventVisitor; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorMappingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceInformationFinder; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer; @@ -138,12 +136,12 @@ public class RaceLogRaceTracker implements RaceTracker, GPSFixReceivedListener { } @Override - public void visit(RaceLogDeviceMarkMappingEvent event) { + public void visit(@SuppressWarnings("deprecation") com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent event) { RaceLogRaceTracker.this.onDeviceMarkMappingEvent(event); } @Override - public void visit(RaceLogDefineMarkEvent event) { + public void visit(@SuppressWarnings("deprecation") com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent event) { RaceLogRaceTracker.this.onDefineMarkEvent(event); } diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java index f592228cc2f..23d7c0c7869 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java @@ -31,7 +31,6 @@ import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.LastPublishedCourseDesignFinder; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogCourseDesignChangedEventImpl; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer; @@ -195,9 +194,11 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter { return new RaceLogTrackingStateAnalyzer(raceColumn.getRaceLog(fleet)).analyze(); } + /* TODO: delete as soon as there are no marks in RaceLogs anymore */ private void revokeAlreadyDefinedMarks(RaceLog raceLog, AbstractLogEventAuthor author) { + @SuppressWarnings("deprecation") List markEvents = new AllEventsOfTypeFinder<>(raceLog, /* only unrevoked */true, - RaceLogDefineMarkEvent.class).analyze(); + com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent.class).analyze(); for (RaceLogEvent event : markEvents) { try { raceLog.revokeEvent(author, event, "removing mark that was already defined"); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventVisitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventVisitor.java index bb161350d9e..d4b3b705620 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventVisitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventVisitor.java @@ -1,11 +1,8 @@ package com.sap.sailing.domain.abstractlog.race; import com.sap.sailing.domain.abstractlog.race.scoring.RaceLogAdditionalScoringInformationEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorMappingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; @@ -42,7 +39,8 @@ public interface RaceLogEventVisitor { public void visit(RaceLogDeviceCompetitorMappingEvent event); - public void visit(RaceLogDeviceMarkMappingEvent event); + @SuppressWarnings("deprecation") + public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent event); public void visit(RaceLogDenoteForTrackingEvent event); @@ -50,9 +48,11 @@ public interface RaceLogEventVisitor { public void visit(RaceLogRegisterCompetitorEvent event); - public void visit(RaceLogDefineMarkEvent event); + @SuppressWarnings("deprecation") + public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent event); - public void visit(RaceLogCloseOpenEndedDeviceMappingEvent event); + @SuppressWarnings("deprecation") + public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent event); public void visit(RaceLogAdditionalScoringInformationEvent additionalScoringInformation); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/AbstractRaceLogChangedVisitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/AbstractRaceLogChangedVisitor.java index 33de5dd8dd7..7108b743183 100755 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/AbstractRaceLogChangedVisitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/AbstractRaceLogChangedVisitor.java @@ -22,11 +22,8 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogSuppressedMarkPassingsEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; import com.sap.sailing.domain.abstractlog.race.scoring.RaceLogAdditionalScoringInformationEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorMappingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; @@ -98,8 +95,9 @@ public abstract class AbstractRaceLogChangedVisitor implements RaceLogEventVisit notifyListenerAboutEventAdded(event); } + @SuppressWarnings("deprecation") @Override - public void visit(RaceLogDeviceMarkMappingEvent event) { + public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent event) { notifyListenerAboutEventAdded(event); } @@ -123,13 +121,15 @@ public abstract class AbstractRaceLogChangedVisitor implements RaceLogEventVisit notifyListenerAboutEventAdded(event); } + @SuppressWarnings("deprecation") @Override - public void visit(RaceLogDefineMarkEvent event) { + public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent event) { notifyListenerAboutEventAdded(event); } + @SuppressWarnings("deprecation") @Override - public void visit(RaceLogCloseOpenEndedDeviceMappingEvent event) { + public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent event) { notifyListenerAboutEventAdded(event); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/BaseRaceLogEventVisitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/BaseRaceLogEventVisitor.java index f59e1b2dccb..f180dff737a 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/BaseRaceLogEventVisitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/BaseRaceLogEventVisitor.java @@ -21,11 +21,8 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogSuppressedMarkPassingsEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; import com.sap.sailing.domain.abstractlog.race.scoring.RaceLogAdditionalScoringInformationEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorMappingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; @@ -105,8 +102,9 @@ public abstract class BaseRaceLogEventVisitor implements RaceLogEventVisitor { } + @SuppressWarnings("deprecation") @Override - public void visit(RaceLogDeviceMarkMappingEvent event) { + public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent event) { } @@ -130,13 +128,15 @@ public abstract class BaseRaceLogEventVisitor implements RaceLogEventVisitor { } + @SuppressWarnings("deprecation") @Override - public void visit(RaceLogDefineMarkEvent event) { + public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent event) { } + @SuppressWarnings("deprecation") @Override - public void visit(RaceLogCloseOpenEndedDeviceMappingEvent event) { + public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent event) { } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/DefinedMarkFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/DefinedMarkFinder.java index 5098218d5a9..2edc23e0343 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/DefinedMarkFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/DefinedMarkFinder.java @@ -9,7 +9,6 @@ import com.sap.sailing.domain.abstractlog.AbstractLogEvent; import com.sap.sailing.domain.abstractlog.BaseLogAnalyzer; import com.sap.sailing.domain.abstractlog.LogAnalyzer; import com.sap.sailing.domain.abstractlog.MultiLogAnalyzer.AnalyzerFactory; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDefineMarkEvent; import com.sap.sailing.domain.base.Mark; @@ -27,12 +26,13 @@ public class DefinedMarkFinder, Event super(log); } + @SuppressWarnings("deprecation") @Override protected Collection performAnalysis() { List result = new ArrayList(); for (AbstractLogEvent event : getLog().getUnrevokedEvents()) { - if (event instanceof RaceLogDefineMarkEvent) { - RaceLogDefineMarkEvent dME = (RaceLogDefineMarkEvent) event; + if (event instanceof com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent) { + com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent dME = (com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent) event; result.add(dME.getMark()); } else if (event instanceof RegattaLogDefineMarkEvent) { RegattaLogDefineMarkEvent dME = (RegattaLogDefineMarkEvent) event; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java index b9654b1626d..76244a2fda4 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java @@ -24,11 +24,8 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogSuppressedMarkPassingsEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; import com.sap.sailing.domain.abstractlog.race.scoring.RaceLogAdditionalScoringInformationEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorMappingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; @@ -123,8 +120,9 @@ public class RaceColumnRaceLogReplicator implements RaceLogEventVisitor, Seriali notifyOnAdd(event); } + @SuppressWarnings("deprecation") @Override - public void visit(RaceLogDeviceMarkMappingEvent event) { + public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent event) { notifyOnAdd(event); } @@ -148,13 +146,15 @@ public class RaceColumnRaceLogReplicator implements RaceLogEventVisitor, Seriali notifyOnAdd(event); } + @SuppressWarnings("deprecation") @Override - public void visit(RaceLogDefineMarkEvent event) { + public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent event) { notifyOnAdd(event); } + @SuppressWarnings("deprecation") @Override - public void visit(RaceLogCloseOpenEndedDeviceMappingEvent event) { + public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent event) { notifyOnAdd(event); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/masterdataimport/TopLevelMasterData.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/masterdataimport/TopLevelMasterData.java index 4a461b1dcaa..d4d3a5c7742 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/masterdataimport/TopLevelMasterData.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/masterdataimport/TopLevelMasterData.java @@ -13,7 +13,6 @@ import java.util.logging.Logger; import com.sap.sailing.domain.abstractlog.AbstractLogEvent; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMarkMappingEvent; @@ -157,9 +156,10 @@ public class TopLevelMasterData implements Serializable { } } + @SuppressWarnings("deprecation") private boolean isMarkMappingEvent(DeviceMappingEvent mappingEvent) { boolean isMarkMappingEvent = false; - if (mappingEvent instanceof RaceLogDeviceMarkMappingEvent || mappingEvent instanceof RegattaLogDeviceMarkMappingEvent) { + if (mappingEvent instanceof com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent || mappingEvent instanceof RegattaLogDeviceMarkMappingEvent) { isMarkMappingEvent = true; } return isMarkMappingEvent; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CourseManagementWidget.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CourseManagementWidget.java index 0d4eee446e1..088a236ceb0 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CourseManagementWidget.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CourseManagementWidget.java @@ -23,7 +23,6 @@ import com.google.gwt.view.client.SetSelectionModel; import com.google.gwt.view.client.SingleSelectionModel; import com.sap.sailing.domain.common.PassingInstruction; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; -import com.sap.sailing.gwt.ui.client.SelectionChangeListener; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.shared.ControlPointDTO; import com.sap.sailing.gwt.ui.shared.GateDTO; 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 847928f3605..5d8dcaaa76b 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 @@ -80,9 +80,7 @@ import com.sap.sailing.domain.abstractlog.race.state.impl.ReadonlyRaceStateImpl; import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.FlagPoleState; import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.ReadonlyGateStartRacingProcedure; import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.ReadonlyRRS26RacingProcedure; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogOpenEndedDeviceMappingCloser; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogUsesOwnCompetitorsAnalyzer; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RegisteredCompetitorsAnalyzer; @@ -5381,8 +5379,9 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S } } else if (abstractLog instanceof RaceLog) { RaceLog raceLog = (RaceLog) abstractLog; - List closingEvents = - new RaceLogOpenEndedDeviceMappingCloser(raceLog, mapping, getService().getServerAuthor(), + @SuppressWarnings("deprecation") + List closingEvents = + new com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogOpenEndedDeviceMappingCloser(raceLog, mapping, getService().getServerAuthor(), new MillisecondsTimePoint(closingTimePoint)).analyze(); for (RaceLogEvent closingEvent : closingEvents) { raceLog.add(closingEvent); diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogCloseOpenEndedDeviceMappingEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogCloseOpenEndedDeviceMappingEventDeserializer.java index 6b5e267c27a..70da19617f1 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogCloseOpenEndedDeviceMappingEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogCloseOpenEndedDeviceMappingEventDeserializer.java @@ -7,7 +7,6 @@ import org.json.simple.JSONObject; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogCloseOpenEndedDeviceMappingEventImpl; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; @@ -23,13 +22,14 @@ public class RaceLogCloseOpenEndedDeviceMappingEventDeserializer extends BaseRac super(competitorDeserializer); } + @SuppressWarnings("deprecation") @Override protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, AbstractLogEventAuthor author, TimePoint timePoint, int passId, List competitors) throws JsonDeserializationException { Serializable deviceMappingEventId = Helpers.tryUuidConversion((Serializable) object.get(FIELD_DEVICE_MAPPING_EVENT_ID)); TimePoint closingTimePoint = new MillisecondsTimePoint((Long) object.get(FIELD_CLOSING_TIMEPOINT_MILLIS)); - return new RaceLogCloseOpenEndedDeviceMappingEventImpl(createdAt, timePoint, author, id, passId, + return new com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogCloseOpenEndedDeviceMappingEventImpl(createdAt, timePoint, author, id, passId, deviceMappingEventId, closingTimePoint); } } diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDefineMarkEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDefineMarkEventDeserializer.java index 90eb3eb8fa5..c7c9ce89245 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDefineMarkEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDefineMarkEventDeserializer.java @@ -7,7 +7,6 @@ import org.json.simple.JSONObject; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDefineMarkEventImpl; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Mark; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; @@ -24,11 +23,12 @@ public class RaceLogDefineMarkEventDeserializer extends BaseRaceLogEventDeserial this.markDeserializer = markDeserializer; } + @SuppressWarnings("deprecation") @Override protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, AbstractLogEventAuthor author, TimePoint timePoint, int passId, List competitors) throws JsonDeserializationException { Mark mark = markDeserializer.deserialize(Helpers.getNestedObjectSafe(object, RaceLogDefineMarkEventSerializer.FIELD_MARK)); - return new RaceLogDefineMarkEventImpl(createdAt, author, timePoint, id, passId, mark); + return new com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDefineMarkEventImpl(createdAt, author, timePoint, id, passId, mark); } } diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDeviceMarkMappingEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDeviceMarkMappingEventDeserializer.java index 1823dcbe870..cccd763371c 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDeviceMarkMappingEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDeviceMarkMappingEventDeserializer.java @@ -6,7 +6,6 @@ import org.json.simple.JSONObject; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceMarkMappingEventImpl; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; @@ -14,24 +13,23 @@ import com.sap.sailing.server.gateway.deserialization.JsonDeserializationExcepti import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; import com.sap.sse.common.TimePoint; -public class RaceLogDeviceMarkMappingEventDeserializer extends - RaceLogDeviceMappingEventDeserializer { - private final JsonDeserializer markDeserializer; - - public RaceLogDeviceMarkMappingEventDeserializer( - JsonDeserializer competitorDeserializer, JsonDeserializer markDeserializer, - JsonDeserializer deviceDeserializer) { - super(competitorDeserializer, deviceDeserializer); - this.markDeserializer = markDeserializer; - } +public class RaceLogDeviceMarkMappingEventDeserializer extends RaceLogDeviceMappingEventDeserializer { + private final JsonDeserializer markDeserializer; - @Override - protected RaceLogEvent furtherDeserialize(JSONObject itemObject, TimePoint from, TimePoint to, - DeviceIdentifier device, Serializable id, TimePoint createdAt, - AbstractLogEventAuthor author, TimePoint timePoint, int passId) throws JsonDeserializationException { - Mark mappedTo = (Mark) markDeserializer.deserialize(itemObject); - return new RaceLogDeviceMarkMappingEventImpl(createdAt, timePoint, author, id, passId, - mappedTo, device, from, to); - } + public RaceLogDeviceMarkMappingEventDeserializer(JsonDeserializer competitorDeserializer, + JsonDeserializer markDeserializer, JsonDeserializer deviceDeserializer) { + super(competitorDeserializer, deviceDeserializer); + this.markDeserializer = markDeserializer; + } + + @SuppressWarnings("deprecation") + @Override + protected RaceLogEvent furtherDeserialize(JSONObject itemObject, TimePoint from, TimePoint to, + DeviceIdentifier device, Serializable id, TimePoint createdAt, AbstractLogEventAuthor author, + TimePoint timePoint, int passId) throws JsonDeserializationException { + Mark mappedTo = (Mark) markDeserializer.deserialize(itemObject); + return new com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceMarkMappingEventImpl(createdAt, + timePoint, author, id, passId, mappedTo, device, from, to); + } } diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogCloseOpenEndedDeviceMappingEventSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogCloseOpenEndedDeviceMappingEventSerializer.java index dc7648ade71..8975a845a01 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogCloseOpenEndedDeviceMappingEventSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogCloseOpenEndedDeviceMappingEventSerializer.java @@ -3,7 +3,6 @@ package com.sap.sailing.server.gateway.serialization.racelog.impl; import org.json.simple.JSONObject; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent; import com.sap.sailing.domain.abstractlog.shared.events.CloseOpenEndedDeviceMappingEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.server.gateway.deserialization.racelog.impl.RaceLogCloseOpenEndedDeviceMappingEventDeserializer; @@ -21,9 +20,10 @@ public class RaceLogCloseOpenEndedDeviceMappingEventSerializer extends BaseRaceL return VALUE_CLASS; } + @SuppressWarnings("deprecation") @Override public JSONObject serialize(RaceLogEvent object) { - RaceLogCloseOpenEndedDeviceMappingEvent event = (RaceLogCloseOpenEndedDeviceMappingEvent) object; + com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent event = (com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent) object; JSONObject result = super.serialize(event); result.put(RaceLogCloseOpenEndedDeviceMappingEventDeserializer.FIELD_DEVICE_MAPPING_EVENT_ID, event.getDeviceMappingEventId()); diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogDefineMarkEventSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogDefineMarkEventSerializer.java index 6085a0674b6..dcdedbff500 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogDefineMarkEventSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogDefineMarkEventSerializer.java @@ -3,13 +3,13 @@ package com.sap.sailing.server.gateway.serialization.racelog.impl; import org.json.simple.JSONObject; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.ControlPoint; import com.sap.sailing.server.gateway.serialization.JsonSerializer; public class RaceLogDefineMarkEventSerializer extends BaseRaceLogEventSerializer { - public static final String VALUE_CLASS = RaceLogDefineMarkEvent.class.getSimpleName(); + @SuppressWarnings("deprecation") + public static final String VALUE_CLASS = com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent.class.getSimpleName(); public static final String FIELD_MARK = "mark"; private final JsonSerializer markSerializer; @@ -25,9 +25,10 @@ public class RaceLogDefineMarkEventSerializer extends BaseRaceLogEventSerializer return VALUE_CLASS; } + @SuppressWarnings("deprecation") @Override public JSONObject serialize(RaceLogEvent object) { - RaceLogDefineMarkEvent event = (RaceLogDefineMarkEvent) object; + com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent event = (com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent) object; JSONObject result = super.serialize(event); result.put(FIELD_MARK, markSerializer.serialize(event.getMark())); diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java index 0ac4f565a84..95f9c475cab 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java @@ -24,11 +24,8 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogSuppressedMarkPassingsEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; import com.sap.sailing.domain.abstractlog.race.scoring.RaceLogAdditionalScoringInformationEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorMappingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; @@ -271,8 +268,9 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac chosenSerializer = deviceCompetitorMappingSerializer; } + @SuppressWarnings("deprecation") @Override - public void visit(RaceLogDeviceMarkMappingEvent event) { + public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent event) { chosenSerializer = deviceMarkMappingSerializer; } @@ -293,13 +291,15 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac chosenSerializer = registerCompetitorSerializer; } + @SuppressWarnings("deprecation") @Override - public void visit(RaceLogDefineMarkEvent event) { + public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent event) { chosenSerializer = defineMarkSerializer; } + @SuppressWarnings("deprecation") @Override - public void visit(RaceLogCloseOpenEndedDeviceMappingEvent event) { + public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent event) { chosenSerializer = closeOpenEndedDeviceMappingEventSerializer; } From 70609813f088bc9a129d79d55b8adca692d8f759 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Fri, 27 Nov 2015 14:38:40 +0100 Subject: [PATCH 025/165] Service for getting marks now returns marks defined on Regatta --- .../gateway/jaxrs/api/LeaderboardsResource.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java index 60d8eba0b33..4dc01fadc41 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java @@ -543,7 +543,18 @@ public class LeaderboardsResource extends AbstractSailingServerResource { .entity("Could not find a leaderboard with name '" + leaderboardName + "'.") .type(MediaType.TEXT_PLAIN).build(); } - final Set marks; + + if (! (leaderboard instanceof HasRegattaLike)) { + return Response.status(Status.NOT_FOUND) + .entity("Leaderboard with name '"+ leaderboardName+ "'does not contain a RegattaLog'.") + .type(MediaType.TEXT_PLAIN).build(); + } + LeaderboardThatHasRegattaLike regattaLikeLeaderboard = (LeaderboardThatHasRegattaLike) leaderboard; + RegattaLog regattaLog = ((HasRegattaLike) regattaLikeLeaderboard).getRegattaLike().getRegattaLog(); + + final Set marks = new HashSet(); + Util.addAll(new DefinedMarkFinder<>(regattaLog).analyze(), marks); + if (raceColumnName == null) { if (fleetName != null) { return Response @@ -551,7 +562,6 @@ public class LeaderboardsResource extends AbstractSailingServerResource { .entity("Either specify neither raceColumnName nor fleetName, only raceColumnName, or raceColumnName and fleetName but not only fleetName") .type(MediaType.TEXT_PLAIN).build(); } else { - marks = new HashSet(); for (RaceColumn raceColumn : leaderboard.getRaceColumns()) { for (Fleet fleet : raceColumn.getFleets()) { RaceLog raceLog = raceColumn.getRaceLog(fleet); @@ -578,11 +588,10 @@ public class LeaderboardsResource extends AbstractSailingServerResource { .entity("Could not find fleet '" + fleetName + "' in leaderboard '" + leaderboardName + "'.").type(MediaType.TEXT_PLAIN).build(); } else { - marks = getMarksForFleet(raceColumn, fleet); + marks.addAll(getMarksForFleet(raceColumn, fleet)); } } else { // Return all marks for a certain race column - marks = new HashSet(); for (Fleet fleet : raceColumn.getFleets()) { Util.addAll(getMarksForFleet(raceColumn, fleet), marks); } From dfe73bfc9e4c1e9733ceceef2e7df1dc848cd1b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Fri, 27 Nov 2015 15:05:38 +0100 Subject: [PATCH 026/165] Provide getRegattaLog method on RaceColumn and use RegattaLog to determine competitor set --- .../com/sap/sailing/domain/base/RaceColumn.java | 8 ++++++++ .../domain/base/impl/AbstractRaceColumn.java | 17 +++++++++++------ .../base/impl/RaceColumnInSeriesImpl.java | 7 +++++++ .../domain/leaderboard/FlexibleRaceColumn.java | 2 ++ .../impl/FlexibleLeaderboardImpl.java | 1 + .../domain/leaderboard/impl/RaceColumnImpl.java | 17 +++++++++++++++++ .../leaderboard/meta/MetaLeaderboardColumn.java | 7 +++++++ 7 files changed, 53 insertions(+), 6 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java index 73d88aa7405..23879260016 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java @@ -46,6 +46,14 @@ public interface RaceColumn extends Named { */ RaceLog getRaceLog(Fleet fleet); + /** + * Gets the regatta log associated with race column's race and the passed fleet. Note that the result may be null + * particularly for columns in a {@link MetaLeaderboard}. + * + * @return the regatta log or null in case this column belongs to a {@link MetaLeaderboard} + */ + RegattaLog getRegattaLog(); + /** * @return the fleets for each of which this column has a single race and therefore optionally a {@link TrackedRace}, in * ascending order; best fleets first diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java index 5c9a47212f2..45cc2bb348e 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java @@ -10,7 +10,8 @@ import java.util.Set; import java.util.logging.Logger; import com.sap.sailing.domain.abstractlog.race.RaceLog; -import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogRegisteredCompetitorsAnalyzer; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RegisteredCompetitorsAnalyzer; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; @@ -56,7 +57,7 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem return raceLogs.get(fleet); } } - + @Override public RaceLogIdentifier getRaceLogIdentifier(Fleet fleet) { return new RaceLogIdentifierImpl(regattaLikeParent, getName(), fleet); @@ -227,11 +228,13 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem if (trackedRace != null) { Util.addAll(trackedRace.getRace().getCompetitors(), result); } else { - // if no tracked race is found, use competitors from race log; this assumes that if a tracked + // if no tracked race is found, use competitors from race/regatta log depending on whether + // the mapping event is present or not; this assumes that if a tracked // race exists, its competitors set takes precedence over what's in the race log. Usually, // the tracked race will have the same competitors as those in the race log, or more because // those from the regatta log are added to the tracked race as well. - Set viaRaceLog = new RaceLogRegisteredCompetitorsAnalyzer(getRaceLog(fleet)).analyze(); + RegattaLog regattaLog = getRegattaLog(); + Set viaRaceLog = new RegisteredCompetitorsAnalyzer(getRaceLog(fleet), regattaLog).analyze(); result.addAll(viaRaceLog); } } @@ -245,11 +248,13 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem if (trackedRace != null) { result = trackedRace.getRace().getCompetitors(); } else { - // if no tracked race is found, use competitors from race log; this assumes that if a tracked + // if no tracked race is found, use competitors from race/regatta log depending on whether + // the mapping event is present or not; this assumes that if a tracked // race exists, its competitors set takes precedence over what's in the race log. Usually, // the tracked race will have the same competitors as those in the race log, or more because // those from the regatta log are added to the tracked race as well. - Set viaRaceLog = new RaceLogRegisteredCompetitorsAnalyzer(getRaceLog(fleet)).analyze(); + RegattaLog regattaLog = getRegattaLog(); + Set viaRaceLog = new RegisteredCompetitorsAnalyzer(getRaceLog(fleet), regattaLog).analyze(); result = viaRaceLog; } return result; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnInSeriesImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnInSeriesImpl.java index 2554e5d157d..435111bb2fb 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnInSeriesImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnInSeriesImpl.java @@ -3,6 +3,7 @@ package com.sap.sailing.domain.base.impl; import java.util.Iterator; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumnInSeries; import com.sap.sailing.domain.base.RaceDefinition; @@ -131,4 +132,10 @@ public class RaceColumnInSeriesImpl extends AbstractRaceColumn implements RaceCo } return result; } + + @Override + public RegattaLog getRegattaLog() { + Regatta regatta = getRegatta(); + return regatta.getRegattaLog(); + } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/FlexibleRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/FlexibleRaceColumn.java index 5f8bfbb45a7..e5a599e61dc 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/FlexibleRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/FlexibleRaceColumn.java @@ -1,8 +1,10 @@ package com.sap.sailing.domain.leaderboard; import com.sap.sailing.domain.base.RaceColumn; +import com.sap.sailing.domain.regattalike.IsRegattaLike; public interface FlexibleRaceColumn extends RaceColumn { void setName(String newName); void setIsMedalRace(boolean isMedalRace); + void setRegattaLikeHelper(IsRegattaLike regattaLikeHelper); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java index ab37c03d57d..9124f8bba72 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java @@ -151,6 +151,7 @@ public class FlexibleLeaderboardImpl extends AbstractLeaderboardImpl implements column.addRaceColumnListener(this); races.add(column); column.setRaceLogInformation(raceLogStore, new FlexibleLeaderboardAsRegattaLikeIdentifier(this)); + column.setRegattaLikeHelper(regattaLikeHelper); getRaceColumnListeners().notifyListenersAboutRaceColumnAddedToContainer(column); } return column; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RaceColumnImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RaceColumnImpl.java index 12709513ea8..d128c2be3e7 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RaceColumnImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RaceColumnImpl.java @@ -2,9 +2,11 @@ package com.sap.sailing.domain.leaderboard.impl; import java.util.Collections; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.impl.AbstractRaceColumn; import com.sap.sailing.domain.leaderboard.FlexibleRaceColumn; +import com.sap.sailing.domain.regattalike.IsRegattaLike; import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; public class RaceColumnImpl extends AbstractRaceColumn implements FlexibleRaceColumn { @@ -13,6 +15,7 @@ public class RaceColumnImpl extends AbstractRaceColumn implements FlexibleRaceCo private boolean medalRace; private final RaceExecutionOrderProvider raceExecutionOrderProvider; + private IsRegattaLike regattaLikeHelper; public RaceColumnImpl(String name, boolean medalRace, RaceExecutionOrderProvider raceExecutionOrderProvider) { super(); @@ -51,4 +54,18 @@ public class RaceColumnImpl extends AbstractRaceColumn implements FlexibleRaceCo public RaceExecutionOrderProvider getRaceExecutionOrderProvider() { return raceExecutionOrderProvider; } + + @Override + public void setRegattaLikeHelper(IsRegattaLike regattaLikeHelper) { + this.regattaLikeHelper = regattaLikeHelper; + } + + @Override + public RegattaLog getRegattaLog() { + if (regattaLikeHelper != null){ + return regattaLikeHelper.getRegattaLog(); + } else { + return null; + } + } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java index 491b73ff655..52a31ca4670 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java @@ -4,6 +4,7 @@ import java.util.Collections; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; @@ -41,6 +42,12 @@ public class MetaLeaderboardColumn extends SimpleAbstractRaceColumn implements R public RaceLog getRaceLog(Fleet fleet) { return null; } + + @Override + public RegattaLog getRegattaLog(Fleet fleet) { + return null; + } + public Leaderboard getLeaderboard() { return leaderboard; From a5717714dfc72bbfa72acc2d2f7792284b000618 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Fri, 27 Nov 2015 15:20:58 +0100 Subject: [PATCH 027/165] Fixes bug 3392: Marks now fetchable from RaceColumn --- .../sap/sailing/domain/base/RaceColumn.java | 18 +++- .../domain/base/impl/AbstractRaceColumn.java | 85 +++++++++++++++---- 2 files changed, 85 insertions(+), 18 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java index 23879260016..365f83e52b7 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java @@ -240,9 +240,8 @@ public interface RaceColumn extends Named { /** * Provides the combined set of competitors from all {@link #getTrackedRace(Fleet) tracked races attached to this * column} or, in case a fleet does not have a tracked race attached, the competitors registered through the - * respective {@link RaceLog} {@link #getRaceLog(Fleet) attached to this column for that fleet}. Note that this does - * not include competitors registered through any {@link RegattaLog} on the structure owning (directly or - * transitively) this column. + * respective {@link RaceLog} {@link #getRaceLog(Fleet)} or {@link RegattaLog} {@link #getRegattaLog()} attached to + * this column for that fleet. */ Iterable getAllCompetitors(); @@ -250,4 +249,17 @@ public interface RaceColumn extends Named { * Same as {@link #getAllCompetitors()}, but restricted to the single race identified by the fleet parameter. */ Iterable getAllCompetitors(Fleet fleet); + + /** + * Provides the combined set of marks from all {@link #getTrackedRace(Fleet) tracked races attached to this + * column} or, in case a fleet does not have a tracked race attached, the competitors registered through the + * respective {@link RaceLog} {@link #getRaceLog(Fleet)} or {@link RegattaLog} {@link #getRegattaLog()} attached to + * this column for that fleet. + */ + Iterable getAllMarks(); + + /** + * Same as {@link #getAllCompetitors()}, but restricted to the single race identified by the fleet parameter. + */ + Iterable getAllMarks(Fleet fleet); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java index 45cc2bb348e..5f4fedca584 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java @@ -2,6 +2,7 @@ package com.sap.sailing.domain.base.impl; import java.io.IOException; import java.io.ObjectInputStream; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -10,11 +11,14 @@ import java.util.Set; import java.util.logging.Logger; import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.DefinedMarkFinder; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RegisteredCompetitorsAnalyzer; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Fleet; +import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.base.RaceColumn; +import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.racelog.RaceLogStore; @@ -25,14 +29,14 @@ import com.sap.sse.common.Util; public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implements RaceColumn { private static final long serialVersionUID = -7801617988982540470L; - + private static final Logger logger = Logger.getLogger(AbstractRaceColumn.class.getName()); private TrackedRaces trackedRaces; private Map raceIdentifiers; private Map raceLogs; - + private transient RaceLogStore raceLogStore; private RegattaLikeIdentifier regattaLikeParent; @@ -47,7 +51,7 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem this.raceLogStore = raceLogStore; this.regattaLikeParent = regattaLikeParent; for (final Fleet fleet : getFleets()) { - reloadRaceLog(fleet); + reloadRaceLog(fleet); } } @@ -57,7 +61,7 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem return raceLogs.get(fleet); } } - + @Override public RaceLogIdentifier getRaceLogIdentifier(Fleet fleet) { return new RaceLogIdentifierImpl(regattaLikeParent, getName(), fleet); @@ -115,13 +119,13 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem getRaceColumnListeners().notifyListenersAboutTrackedRaceUnlinked(this, fleet, previouslyLinkedRace); } } - + @Override public void removeRaceIdentifier(Fleet fleet) { releaseTrackedRace(fleet); this.raceIdentifiers.remove(fleet); } - + @Override public Fleet getFleetOfCompetitor(Competitor competitor) { for (final Fleet fleet : getFleets()) { @@ -156,7 +160,7 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem } return null; } - + @Override public String toString() { return getName(); @@ -164,14 +168,16 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem @Override public void reloadRaceLog(Fleet fleet) { - synchronized(raceLogs) { + synchronized (raceLogs) { RaceLogIdentifier identifier = getRaceLogIdentifier(fleet); - RaceLog newOrLoadedRaceLog = raceLogStore.getRaceLog(identifier, /*ignoreCache*/ true); + RaceLog newOrLoadedRaceLog = raceLogStore.getRaceLog(identifier, /* ignoreCache */true); RaceLog raceLogAvailable = raceLogs.get(fleet); if (raceLogAvailable == null) { RaceColumnRaceLogReplicator listener = new RaceColumnRaceLogReplicator(this, identifier); - // FIXME Wouldn't this skip any listener notifications that a merge below would trigger if the race log already existed? - // FIXME For example, how about the race log-provided score corrections that need application to the leaderboard and replication? + // FIXME Wouldn't this skip any listener notifications that a merge below would trigger if the race log + // already existed? + // FIXME For example, how about the race log-provided score corrections that need application to the + // leaderboard and replication? newOrLoadedRaceLog.addListener(listener); raceLogs.put(fleet, newOrLoadedRaceLog); final TrackedRace trackedRace = getTrackedRace(fleet); @@ -206,7 +212,7 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem if (trackedRace != null) { trackedRace.attachRaceLog(raceLog); } - }, /* prio */ 0); + }, /* prio */0); // because this will add the race log to the tracked race's attachedRaceLogs collection again, and // the new DynamicTrackedRaceLogListener that the readObject(...) method had constructed for the // tracked race will be added as a listener to the race log whose listeners collection otherwise would @@ -219,7 +225,6 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem trackedRaces.setMasterDataExportOngoingThreadFlag(flagValue); } - @Override public Iterable getAllCompetitors() { Set result = new HashSet<>(); @@ -228,7 +233,7 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem if (trackedRace != null) { Util.addAll(trackedRace.getRace().getCompetitors(), result); } else { - // if no tracked race is found, use competitors from race/regatta log depending on whether + // if no tracked race is found, use competitors from race/regatta log depending on whether // the mapping event is present or not; this assumes that if a tracked // race exists, its competitors set takes precedence over what's in the race log. Usually, // the tracked race will have the same competitors as those in the race log, or more because @@ -248,15 +253,65 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem if (trackedRace != null) { result = trackedRace.getRace().getCompetitors(); } else { - // if no tracked race is found, use competitors from race/regatta log depending on whether + // if no tracked race is found, use competitors from race/regatta log depending on whether // the mapping event is present or not; this assumes that if a tracked // race exists, its competitors set takes precedence over what's in the race log. Usually, // the tracked race will have the same competitors as those in the race log, or more because // those from the regatta log are added to the tracked race as well. RegattaLog regattaLog = getRegattaLog(); + //FIXME: soon to be removed, as RaceLogDefineMarkEvent is deprecated Set viaRaceLog = new RegisteredCompetitorsAnalyzer(getRaceLog(fleet), regattaLog).analyze(); result = viaRaceLog; } return result; } + + @Override + public Iterable getAllMarks() { + Set result = new HashSet<>(); + for (Fleet fleet : getFleets()) { + TrackedRace trackedRace = getTrackedRace(fleet); + if (trackedRace != null) { + for (Waypoint waypoint : trackedRace.getRace().getCourse().getWaypoints()) { + Util.addAll(waypoint.getMarks(), result); + } + } else { + // if no tracked race is found, use competitors from race/regatta log depending on whether + // the mapping event is present or not; this assumes that if a tracked + // race exists, its competitors set takes precedence over what's in the race log. Usually, + // the tracked race will have the same competitors as those in the race log, or more because + // those from the regatta log are added to the tracked race as well. + RegattaLog regattaLog = getRegattaLog(); + Collection viaRegattaLog = new DefinedMarkFinder<>(regattaLog).analyze(); + //FIXME: soon to be removed, as RaceLogDefineMarkEvent is deprecated + Collection viaRaceLog = new DefinedMarkFinder<>(getRaceLog(fleet)).analyze(); + result.addAll(viaRaceLog); + result.addAll(viaRegattaLog); + } + } + return result; + } + + @Override + public Iterable getAllMarks(Fleet fleet) { + Set result = new HashSet<>(); + TrackedRace trackedRace = getTrackedRace(fleet); + if (trackedRace != null) { + for (Waypoint waypoint : trackedRace.getRace().getCourse().getWaypoints()) { + Util.addAll(waypoint.getMarks(), result); + } + } else { + // if no tracked race is found, use competitors from race/regatta log depending on whether + // the mapping event is present or not; this assumes that if a tracked + // race exists, its competitors set takes precedence over what's in the race log. Usually, + // the tracked race will have the same competitors as those in the race log, or more because + // those from the regatta log are added to the tracked race as well. + RegattaLog regattaLog = getRegattaLog(); + Collection viaRegattaLog = new DefinedMarkFinder<>(regattaLog).analyze(); + Collection viaRaceLog = new DefinedMarkFinder<>(getRaceLog(fleet)).analyze(); + result.addAll(viaRaceLog); + result.addAll(viaRegattaLog); + } + return result; + } } \ No newline at end of file From 4e1d0bcbd7ad26eaefbb0148845d828a3fd6db01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Sat, 28 Nov 2015 11:48:37 +0100 Subject: [PATCH 028/165] Refrain from direct usage of RegisteredCompetitorsAnalyzer in CompeitorProvider --- ...ProviderFromRaceColumnsAndRegattaLike.java | 35 +++++-------------- 1 file changed, 8 insertions(+), 27 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/CompetitorProviderFromRaceColumnsAndRegattaLike.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/CompetitorProviderFromRaceColumnsAndRegattaLike.java index d18d417b55a..a0368b356a1 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/CompetitorProviderFromRaceColumnsAndRegattaLike.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/CompetitorProviderFromRaceColumnsAndRegattaLike.java @@ -12,13 +12,11 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogRevokeEvent; import com.sap.sailing.domain.abstractlog.race.impl.BaseRaceLogEventVisitor; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RegisteredCompetitorsAnalyzer; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogRevokeEvent; import com.sap.sailing.domain.abstractlog.regatta.impl.BaseRegattaLogEventVisitor; -import com.sap.sailing.domain.abstractlog.shared.analyzing.CompetitorsInLogAnalyzer; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; @@ -159,10 +157,11 @@ public class CompetitorProviderFromRaceColumnsAndRegattaLike { rc.getRaceLog(fleet).addListener(raceLogCompetitorsCacheInvalidationListener); } } + // note: adding listeners is idempotent; at most one occurrence of this listener exists in the race/regatta log's + // listeners set provider.addRaceColumnListener(raceColumnListener); - // consider {@link RegattaLog} - Set viaLog = getCompetitorsFromRegattaLogAndRegisterAsRegattaLogListener(); - result.addAll(viaLog); + // consider {@link RegattaLog} competitor changes + provider.getRegattaLike().getRegattaLog().addListener(regattaLogCompetitorsCacheInvalidationListener); allCompetitorsCache = result; } return allCompetitorsCache; @@ -178,38 +177,20 @@ public class CompetitorProviderFromRaceColumnsAndRegattaLike { Iterable result = allCompetitorsCacheByRace.get(key); if (result == null) { final Set resultSet = new HashSet<>(); + //raceColumn already considers trackedRace, RaceLog and RegattaLog Util.addAll(raceColumn.getAllCompetitors(fleet), resultSet); - // note: adding listeners is idempotent; at most one occurrence of this listener exists in the race log's + // note: adding listeners is idempotent; at most one occurrence of this listener exists in the race/regatta log's // listeners set raceColumn.getRaceLog(fleet).addListener(raceLogCompetitorsCacheInvalidationListener); provider.addRaceColumnListener(raceColumnListener); - // consider {@link RegattaLog} - Set viaLog = getCompetitorsForRaceAndRegisterAsRegattaLogListener(raceColumn - .getRaceLog(fleet)); - resultSet.addAll(viaLog); + // consider {@link RegattaLog} competitor changes + provider.getRegattaLike().getRegattaLog().addListener(regattaLogCompetitorsCacheInvalidationListener); result = resultSet; allCompetitorsCacheByRace.put(key, result); } return result; } - private Set getCompetitorsForRaceAndRegisterAsRegattaLogListener(RaceLog racelog) { - Set viaLog = new RegisteredCompetitorsAnalyzer(racelog, provider.getRegattaLike().getRegattaLog()) - .analyze(); - // note: adding listeners is idempotent; at most one occurrence of this listener exists in the regatta log's - // listeners set - provider.getRegattaLike().getRegattaLog().addListener(regattaLogCompetitorsCacheInvalidationListener); - return viaLog; - } - - private Set getCompetitorsFromRegattaLogAndRegisterAsRegattaLogListener() { - Set viaLog = new CompetitorsInLogAnalyzer<>(provider.getRegattaLike().getRegattaLog()).analyze(); - // note: adding listeners is idempotent; at most one occurrence of this listener exists in the regatta log's - // listeners set - provider.getRegattaLike().getRegattaLog().addListener(regattaLogCompetitorsCacheInvalidationListener); - return viaLog; - } - private void invalidateAllCompetitorsCaches() { allCompetitorsCache = null; // note: adding listeners was idempotent; at most one occurrence of this listener exists in the regatta log's From 3dbfa39cc974d82cd9be5fad45f9ef76bc8c32d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Sat, 28 Nov 2015 12:00:23 +0100 Subject: [PATCH 029/165] Add getMarks implementation for MetaLeaderboardColumn --- .../meta/MetaLeaderboardColumn.java | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java index 52a31ca4670..90ee7060f11 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java @@ -1,12 +1,15 @@ package com.sap.sailing.domain.leaderboard.meta; import java.util.Collections; +import java.util.HashSet; +import java.util.Set; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Fleet; +import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.RaceColumnListener; import com.sap.sailing.domain.base.impl.SimpleAbstractRaceColumn; @@ -18,6 +21,7 @@ import com.sap.sailing.domain.racelog.RaceLogStore; import com.sap.sailing.domain.regattalike.RegattaLikeIdentifier; import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; import com.sap.sailing.domain.tracking.TrackedRace; +import com.sap.sse.common.Util; /** * All {@link RaceColumnListener} events received from the underlying leaderboard's race columns @@ -42,12 +46,6 @@ public class MetaLeaderboardColumn extends SimpleAbstractRaceColumn implements R public RaceLog getRaceLog(Fleet fleet) { return null; } - - @Override - public RegattaLog getRegattaLog(Fleet fleet) { - return null; - } - public Leaderboard getLeaderboard() { return leaderboard; @@ -226,4 +224,25 @@ public class MetaLeaderboardColumn extends SimpleAbstractRaceColumn implements R } return result; } + + @Override + public RegattaLog getRegattaLog() { + return null; + } + + @Override + public Iterable getAllMarks() { + Set marks = new HashSet(); + for (Fleet fleet: getFleets()) { + TrackedRace trackedRace = getTrackedRace(fleet); + Util.addAll(trackedRace.getMarks(), marks); + } + return marks; + } + + @Override + public Iterable getAllMarks(Fleet fleet) { + TrackedRace trackedRace = getTrackedRace(fleet); + return trackedRace.getMarks(); + } } From ca3537a463d68a7acee438234097b105a8ab2a73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Sat, 28 Nov 2015 12:11:59 +0100 Subject: [PATCH 030/165] Refrain from using RegisteredCompetitorsAnalyzer outside of RaceColumn --- .../impl/RaceLogRaceTracker.java | 17 +---------------- .../impl/RegisteredCompetitorsAnalyzer.java | 3 +++ .../gwt/ui/server/SailingServiceImpl.java | 16 ++++++++-------- 3 files changed, 12 insertions(+), 24 deletions(-) diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java index f505eab155d..5d824010587 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java @@ -21,7 +21,6 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogEndOfTrackingEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; import com.sap.sailing.domain.abstractlog.race.RaceLogStartOfTrackingEvent; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.LastPublishedCourseDesignFinder; -import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogRegisteredCompetitorsAnalyzer; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver; import com.sap.sailing.domain.abstractlog.race.impl.BaseRaceLogEventVisitor; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; @@ -29,7 +28,6 @@ import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorM import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceInformationFinder; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer; -import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RegisteredCompetitorsAnalyzer; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDefineMarkEvent; @@ -60,7 +58,6 @@ import com.sap.sailing.domain.common.PassingInstruction; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.TrackedRaceStatusEnum; import com.sap.sailing.domain.common.abstractlog.NotRevokableException; -import com.sap.sailing.domain.common.racelog.tracking.DoesNotHaveRegattaLogException; import com.sap.sailing.domain.common.racelog.tracking.RaceLogTrackingState; import com.sap.sailing.domain.common.racelog.tracking.RaceNotCreatedException; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; @@ -474,19 +471,7 @@ public class RaceLogRaceTracker implements RaceTracker, GPSFixReceivedListener { } throw new RaceNotCreatedException(String.format("Race for racelog (%s) has already been created", raceLog)); } - // check both the racelog and regattalog for registered competitors - - Set competitors; - try { - RegattaLog regattaLog = params.getRegattaLog(); - competitors = new RegisteredCompetitorsAnalyzer(raceLog, regattaLog).analyze(); - } catch (DoesNotHaveRegattaLogException e) { - logger.warning(params.getLeaderboard().getName()+" doesn't have an attached RegattaLog"); - competitors = new RaceLogRegisteredCompetitorsAnalyzer(raceLog).analyze(); - } - - - + Iterable competitors = raceColumn.getAllCompetitors(params.getFleet()); Serializable raceId = denoteEvent.getRaceId(); final RaceDefinition raceDef = new RaceDefinitionImpl(raceName, course, boatClass, competitors, raceId); Iterable sidelines = Collections. emptyList(); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RegisteredCompetitorsAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RegisteredCompetitorsAnalyzer.java index 1cf2b5e22c4..f710c2736b5 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RegisteredCompetitorsAnalyzer.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RegisteredCompetitorsAnalyzer.java @@ -12,6 +12,9 @@ import com.sap.sailing.domain.base.Competitor; * Used to find competitors of a race. Checks whether the competitors for the given race are registered on the RaceLog * via {@link RaceLogUsesOwnCompetitorsAnalyzer} or on the RegattaLog and fetches the competitors appropriately. * + * Should not be used. Instead get the competitor set from the RaceColumn, which automatically checks wether a + * tracked race is present, which has precedence over the Race/RegattaLog + * * @author D056848 * */ 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 5d8dcaaa76b..340ef2fa9a8 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 @@ -56,6 +56,7 @@ import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceReference; import org.osgi.util.tracker.ServiceTracker; +import com.google.gwt.thirdparty.guava.common.collect.Iterables; import com.sap.sailing.domain.abstractlog.AbstractLog; import com.sap.sailing.domain.abstractlog.AbstractLogEvent; import com.sap.sailing.domain.abstractlog.MultiLogAnalyzer; @@ -2389,12 +2390,10 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S RaceLogTrackingState raceLogTrackingState = raceLog == null ? RaceLogTrackingState.NOT_A_RACELOG_TRACKED_RACE : new RaceLogTrackingStateAnalyzer(raceLog).analyze(); boolean raceLogTrackerExists = raceLog == null ? false : getService().getRaceTrackerById(raceLog.getId()) != null; + boolean competitorRegistrationsExist; - try { - competitorRegistrationsExist = raceLog == null ? false : ! new RegisteredCompetitorsAnalyzer(raceLog, getRegattaLogInternal(leaderboard.getName())).analyze().isEmpty(); - } catch (DoesNotHaveRegattaLogException e) { - competitorRegistrationsExist = false; - } + competitorRegistrationsExist = raceLog == null ? false : Iterables.size(raceColumn.getAllCompetitors(fleet)) > 0 ; + RaceLogTrackingInfoDTO raceLogTrackingInfo = new RaceLogTrackingInfoDTO(raceLogTrackerExists, competitorRegistrationsExist, raceLogTrackingState); raceColumnDTO.setRaceLogTrackingInfo(fleetDTO, raceLogTrackingInfo); @@ -5874,9 +5873,10 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S @Override public Collection getCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName) throws DoesNotHaveRegattaLogException { - RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); - RegattaLog regattaLog = getRegattaLogInternal(leaderboardName); - return convertToCompetitorDTOs(new RegisteredCompetitorsAnalyzer(raceLog, regattaLog).analyze()); + Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName); + RaceColumn raceColumn = leaderboard.getRaceColumnByName(raceColumnName); + Fleet fleet = raceColumn.getFleetByName(fleetName); + return convertToCompetitorDTOs(raceColumn.getAllCompetitors(fleet)); } @Override From 770377d75d70793cb42be9f60b35c25acfee3ac4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Sat, 28 Nov 2015 12:12:30 +0100 Subject: [PATCH 031/165] Organize imports --- .../java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java | 1 - 1 file changed, 1 deletion(-) 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 340ef2fa9a8..6d090f0fd99 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 @@ -84,7 +84,6 @@ import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.Reado import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogUsesOwnCompetitorsAnalyzer; -import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RegisteredCompetitorsAnalyzer; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogUseCompetitorsFromRaceLogEventImpl; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; From 919623f0b6e17c0721d0de65b548bbc7765245b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Sat, 28 Nov 2015 12:50:08 +0100 Subject: [PATCH 032/165] Adds the ability to get only the comeptitors registered in the Racelog --- .../sap/sailing/domain/base/RaceColumn.java | 15 ++++++++++ .../base/impl/SimpleAbstractRaceColumn.java | 28 +++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java index 365f83e52b7..0a85b8db7e9 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java @@ -262,4 +262,19 @@ public interface RaceColumn extends Named { * Same as {@link #getAllCompetitors()}, but restricted to the single race identified by the fleet parameter. */ Iterable getAllMarks(Fleet fleet); + + /** + * Returns the competitor set registered in the race column's race log associated to the passed fleet. + * If competitor registration in RaceLog is disabled or in case of a MetaLeaderboardColumn an empty set is returned. + * @param fleet + * @return competitors in RaceLog if registration enabled or empty set in case this column belongs to a {@link MetaLeaderboard} + */ + Iterable getCompetitorsRegisteredInRacelog(Fleet fleet); + + /** + * Checks whether competitor registration on RaceLog is enabled. + * @param fleet + * @return boolean if competitor registration on the RaceLog is enabled, false in case this column belongs to a {@link MetaLeaderboard} + */ + boolean isCompetitorRegistrationInRacelogEnabled(Fleet fleet); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SimpleAbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SimpleAbstractRaceColumn.java index df31a14f4ae..65a0b9f6992 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SimpleAbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SimpleAbstractRaceColumn.java @@ -1,5 +1,10 @@ package com.sap.sailing.domain.base.impl; +import java.util.Collections; + +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogRegisteredCompetitorsAnalyzer; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogUsesOwnCompetitorsAnalyzer; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; @@ -114,5 +119,28 @@ public abstract class SimpleAbstractRaceColumn implements RaceColumn { public boolean hasSplitFleets() { return Util.size(getFleets()) > 1; } + + @Override + public Iterable getCompetitorsRegisteredInRacelog(final Fleet fleet) { + RaceLog raceLog = getRaceLog(fleet); + if (raceLog == null){ + return Collections.emptySet(); + } else { + RaceLogRegisteredCompetitorsAnalyzer analyzer = new RaceLogRegisteredCompetitorsAnalyzer(raceLog); + return analyzer.analyze(); + } + } + + @Override + public boolean isCompetitorRegistrationInRacelogEnabled(final Fleet fleet) { + RaceLog raceLog = getRaceLog(fleet); + + if (raceLog == null){ + return false; + } else { + RaceLogUsesOwnCompetitorsAnalyzer analyzer = new RaceLogUsesOwnCompetitorsAnalyzer(raceLog); + return analyzer.analyze(); + } + } } From 26cf9fb84e3842ce199df19ab339ef3bb32e16ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Sat, 28 Nov 2015 12:58:46 +0100 Subject: [PATCH 033/165] Add the ability to fetch competitors registered on Regatta to HasRegattaLike --- .../sailing/domain/test/mock/MockedTrackedRace.java | 5 +++++ .../com/sap/sailing/domain/base/impl/RegattaImpl.java | 10 ++++++++++ .../leaderboard/impl/AbstractLeaderboardImpl.java | 10 ++++++++++ .../sap/sailing/domain/regattalike/HasRegattaLike.java | 3 +++ .../regattalike/LeaderboardThatHasRegattaLike.java | 2 ++ 5 files changed, 30 insertions(+) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java index 50d85683056..d2a130850b9 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java @@ -487,6 +487,11 @@ public class MockedTrackedRace implements DynamicTrackedRace { public Iterable getRaceColumns() { return null; } + + @Override + public Iterable getCompetitorsRegisteredInRegattaLog() { + return null; + } }; } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java index cf30214a41b..00e09bddf2a 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java @@ -19,6 +19,9 @@ import java.util.logging.Logger; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; +import com.sap.sailing.domain.abstractlog.shared.analyzing.CompetitorsInLogAnalyzer; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseArea; @@ -726,4 +729,11 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene } return result; } + + @Override + public Iterable getCompetitorsRegisteredInRegattaLog() { + RegattaLog regattaLog = getRegattaLog(); + CompetitorsInLogAnalyzer analyzer = new CompetitorsInLogAnalyzer<>(regattaLog); + return analyzer.analyze(); + } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java index e5947108d43..d837620bd7e 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java @@ -7,6 +7,10 @@ import java.util.List; import java.util.Set; import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; +import com.sap.sailing.domain.abstractlog.shared.analyzing.CompetitorsInLogAnalyzer; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; @@ -172,4 +176,10 @@ public abstract class AbstractLeaderboardImpl extends AbstractSimpleLeaderboardI return raceColumn.getRaceLog(fleet); } + @Override + public Iterable getCompetitorsRegisteredInRegattaLog() { + RegattaLog regattaLog = getRegattaLike().getRegattaLog(); + CompetitorsInLogAnalyzer analyzer = new CompetitorsInLogAnalyzer<>(regattaLog); + return analyzer.analyze(); + } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/HasRegattaLike.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/HasRegattaLike.java index b246fb87258..6a1589b9c8e 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/HasRegattaLike.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/HasRegattaLike.java @@ -1,6 +1,7 @@ package com.sap.sailing.domain.regattalike; import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; @@ -15,4 +16,6 @@ public interface HasRegattaLike { IsRegattaLike getRegattaLike(); RaceLog getRacelog(String raceColumnName, String fleetName); + + Iterable getCompetitorsRegisteredInRegattaLog(); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/LeaderboardThatHasRegattaLike.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/LeaderboardThatHasRegattaLike.java index 1731a2710c3..a245e7d2f86 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/LeaderboardThatHasRegattaLike.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/LeaderboardThatHasRegattaLike.java @@ -1,7 +1,9 @@ package com.sap.sailing.domain.regattalike; +import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.leaderboard.HasRaceColumnsAndRegattaLike; import com.sap.sailing.domain.leaderboard.Leaderboard; public interface LeaderboardThatHasRegattaLike extends Leaderboard, HasRaceColumnsAndRegattaLike { + Iterable getCompetitorsRegisteredInRegattaLog(); } From 233b2b909f9ba3b886677ddd4ed9ab70c432bfe2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Sat, 28 Nov 2015 13:45:19 +0100 Subject: [PATCH 034/165] Refrain from using CompetitorsInLogAnalyer and RaceLogUsesOwnCompetitorsAnalyzer --- .../sailing/gwt/ui/client/SailingService.java | 44 ++++--- .../gwt/ui/server/SailingServiceImpl.java | 108 ++++++++++++------ .../server/exceptions/NotFoundException.java | 10 ++ .../jaxrs/api/LeaderboardsResource.java | 9 +- 4 files changed, 111 insertions(+), 60 deletions(-) create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/exceptions/NotFoundException.java 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 a6bc8e79a75..36485f872cf 100755 --- 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 @@ -45,6 +45,7 @@ import com.sap.sailing.domain.racelog.tracking.GPSFixStore; import com.sap.sailing.domain.racelogtracking.RaceLogTrackingAdapter; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.gwt.ui.adminconsole.RaceLogSetTrackingTimesDTO; +import com.sap.sailing.gwt.ui.server.exceptions.NotFoundException; import com.sap.sailing.gwt.ui.shared.BulkScoreCorrectionDTO; import com.sap.sailing.gwt.ui.shared.CompactRaceMapDataDTO; import com.sap.sailing.gwt.ui.shared.CompetitorsRaceDataDTO; @@ -448,10 +449,11 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS /** * Revoke the {@link RaceLogDenoteForTrackingEvent}. This does not affect an existing {@code RaceLogRaceTracker} * or {@link TrackedRace} for this {@code RaceLog}. + * @throws NotFoundException * * @see RaceLogTrackingAdapter#removeDenotationForRaceLogTracking */ - void removeDenotationForRaceLogTracking(String leaderboardName, String raceColumnName, String fleetName); + void removeDenotationForRaceLogTracking(String leaderboardName, String raceColumnName, String fleetName) throws NotFoundException; void denoteForRaceLogTracking(String leaderboardName) throws Exception; @@ -464,15 +466,16 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS void startRaceLogTracking(String leaderboardName, String raceColumnName, String fleetName, boolean trackWind, boolean correctWindByDeclination) throws NotDenotedForRaceLogTrackingException, Exception; - void setCompetitorRegistrationsInRaceLog(String leaderboardName, String raceColumnName, String fleetName, Set competitors) throws CompetitorRegistrationOnRaceLogDisabledException; + void setCompetitorRegistrationsInRaceLog(String leaderboardName, String raceColumnName, String fleetName, Set competitors) throws CompetitorRegistrationOnRaceLogDisabledException, NotFoundException; /** * Adds the course definition to the racelog, while trying to reuse existing marks, controlpoints and waypoints * from the previous course definition in the racelog. + * @throws NotFoundException */ - void addCourseDefinitionToRaceLog(String leaderboardName, String raceColumnName, String fleetName, List> course); + void addCourseDefinitionToRaceLog(String leaderboardName, String raceColumnName, String fleetName, List> course) throws NotFoundException; - RaceCourseDTO getLastCourseDefinitionInRaceLog(String leaderboardName, String raceColumnName, String fleetName); + RaceCourseDTO getLastCourseDefinitionInRaceLog(String leaderboardName, String raceColumnName, String fleetName) throws NotFoundException; /** * Adds a fix to the {@link GPSFixStore}, and creates a mapping with a virtual device for exactly the current timepoint. @@ -481,16 +484,17 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS void pingMark(String leaderboardName, MarkDTO mark, Position position) throws DoesNotHaveRegattaLogException; List getDeviceMappingsFromRaceLog(String leaderboardName, String raceColumnName, String fleetName) - throws TransformationException; + throws TransformationException, NotFoundException; List getDeserializableDeviceIdentifierTypes(); /** * Revoke the events in the {@code RaceLog} that are identified by the {@code eventIds}. * This only affects such events that implement {@link Revokable}. + * @throws NotFoundException */ void revokeRaceAndRegattaLogEvents(String leaderboardName, String raceColumnName, String fleetName, List eventIds) - throws NotRevokableException; + throws NotRevokableException, NotFoundException; Collection getGPSFixImporterTypes(); @@ -543,7 +547,7 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS Integer getStructureImportOperationProgress(); List getDeviceMappingsFromLogHierarchy(String leaderboardName, String raceColumnName, - String fleetName) throws TransformationException; + String fleetName) throws TransformationException, NotFoundException; void inviteCompetitorsForTrackingViaEmail(String serverUrlWithoutTrailingSlash, EventDTO event, String leaderboardName, Collection competitors, String localeInfo) throws MailException; @@ -566,44 +570,46 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS boolean doesRegattaLogContainCompetitors(String name) throws DoesNotHaveRegattaLogException; RegattaAndRaceIdentifier getRaceIdentifier(String regattaLikeName, String raceColumnName, String fleetName); - void setTrackingTimes(RaceLogSetTrackingTimesDTO dto); + void setTrackingTimes(RaceLogSetTrackingTimesDTO dto) throws NotFoundException; - Pair getTrackingTimes(String leaderboardName, String raceColumnName, String fleetName); + Pair getTrackingTimes(String leaderboardName, String raceColumnName, String fleetName) throws NotFoundException; /** * @param raceLogFrom identifies the race log to copy from by its leaderboard name, race column name and fleet name * @param raceLogsTo identifies the race log to copy from by their leaderboard name, race column name and fleet name + * @throws NotFoundException */ void copyCompetitorsToOtherRaceLogs(Triple fromTriple, - Set> toTriples); + Set> toTriples) throws NotFoundException; /** * @param raceLogFrom identifies the race log to copy from by its leaderboard name, race column name and fleet name * @param raceLogsTo identifies the race log to copy from by their leaderboard name, race column name and fleet name + * @throws NotFoundException */ void copyCourseToOtherRaceLogs(Triple fromTriple, - Set> toTriples); + Set> toTriples) throws NotFoundException; /** * Get the competitors registered for a certain race. This automatically checks, whether competitors are registered - * in the raceLog (in case of e.g. splitFleets) or in the RegattaLog (default) - * @throws DoesNotHaveRegattaLogException + * in the raceLog (in case of e.g. splitFleets) or in the RegattaLog (default) + * @throws NotFoundException */ Collection getCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, - String fleetName) throws DoesNotHaveRegattaLogException; + String fleetName) throws DoesNotHaveRegattaLogException, NotFoundException; void addMarkToRegattaLog(String leaderboardName, MarkDTO mark) throws DoesNotHaveRegattaLogException; void revokeMarkDefinitionEventInRegattaLog(String leaderboardName, MarkDTO markDTO) throws DoesNotHaveRegattaLogException; - Collection getCompetitorRegistrationsInRegattaLog(String leaderboardName) throws DoesNotHaveRegattaLogException; + Collection getCompetitorRegistrationsInRegattaLog(String leaderboardName) throws DoesNotHaveRegattaLogException, NotFoundException; - boolean areCompetitorRegistrationsEnabledForRace(String leaderboardName, String raceColumnName, String fleetName); + Boolean areCompetitorRegistrationsEnabledForRace(String leaderboardName, String raceColumnName, String fleetName) throws NotFoundException; - void deactivateCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName) throws NotRevokableException; + void deactivateCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName) throws NotRevokableException, NotFoundException; - void activateCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName); + void activateCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName) throws IllegalArgumentException, NotFoundException; Pair checkIfMarksAreUsedInOtherRaceLogs(String leaderboardName, String raceColumnName, - String fleetName, Set marksToRemove); + String fleetName, Set marksToRemove) throws NotFoundException; } 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 6d090f0fd99..9ac0525b7a2 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 @@ -83,7 +83,6 @@ import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.Readon import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.ReadonlyRRS26RacingProcedure; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer; -import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogUsesOwnCompetitorsAnalyzer; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogUseCompetitorsFromRaceLogEventImpl; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; @@ -95,7 +94,6 @@ import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceCo import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceMarkMappingEventImpl; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogRevokeEventImpl; import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogOpenEndedDeviceMappingCloser; -import com.sap.sailing.domain.abstractlog.shared.analyzing.CompetitorsInLogAnalyzer; import com.sap.sailing.domain.abstractlog.shared.analyzing.DeviceCompetitorMappingFinder; import com.sap.sailing.domain.abstractlog.shared.analyzing.DeviceMarkMappingFinder; import com.sap.sailing.domain.base.Boat; @@ -289,6 +287,7 @@ import com.sap.sailing.domain.tractracadapter.TracTracConfiguration; import com.sap.sailing.domain.tractracadapter.TracTracConnectionConstants; import com.sap.sailing.gwt.ui.adminconsole.RaceLogSetTrackingTimesDTO; import com.sap.sailing.gwt.ui.client.SailingService; +import com.sap.sailing.gwt.ui.server.exceptions.NotFoundException; import com.sap.sailing.gwt.ui.shared.BulkScoreCorrectionDTO; import com.sap.sailing.gwt.ui.shared.CompactRaceMapDataDTO; import com.sap.sailing.gwt.ui.shared.CompetitorRaceDataDTO; @@ -4812,7 +4811,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S } @Override - public void setTrackingTimes(RaceLogSetTrackingTimesDTO dto) { + public void setTrackingTimes(RaceLogSetTrackingTimesDTO dto) throws NotFoundException { RaceLog raceLog = getRaceLog(dto.leaderboardName, dto.raceColumnName, dto.fleetName); // TODO If new is null and current is not, current should be revoked. if (!Util.equalsWithNull(dto.newStartOfTracking, dto.currentStartOfTracking)) { @@ -4828,7 +4827,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S } @Override - public Util.Pair getTrackingTimes(String leaderboardName, String raceColumnName, String fleetName) { + public Util.Pair getTrackingTimes(String leaderboardName, String raceColumnName, String fleetName) throws NotFoundException { final RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); final Pair times = new TrackingTimesFinder(raceLog).analyze(); return times == null ? null : new Pair(times.getA(), times.getB()); @@ -4963,15 +4962,15 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S @Override public void denoteForRaceLogTracking(String leaderboardName, String raceColumnName, String fleetName) throws Exception { - Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName); - RaceColumn raceColumn = getService().getLeaderboardByName(leaderboardName).getRaceColumnByName(raceColumnName); - Fleet fleet = raceColumn.getFleetByName(fleetName); + Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName); + RaceColumn raceColumn = getRaceColumn(leaderboardName, raceColumnName); + Fleet fleet = getFleetByName(raceColumn, fleetName); getRaceLogTrackingAdapter().denoteRaceForRaceLogTracking(getService(), leaderboard, raceColumn, fleet, null); } @Override - public void removeDenotationForRaceLogTracking(String leaderboardName, String raceColumnName, String fleetName) { + public void removeDenotationForRaceLogTracking(String leaderboardName, String raceColumnName, String fleetName) throws NotFoundException { RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); getRaceLogTrackingAdapter().removeDenotationForRaceLogTracking(getService(), raceLog); } @@ -4985,8 +4984,9 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S /** * @param triple leaderboard and racecolumn and fleet names * @return + * @throws NotFoundException */ - private RaceLog getRaceLog(com.sap.sse.common.Util.Triple triple) { + private RaceLog getRaceLog(com.sap.sse.common.Util.Triple triple) throws NotFoundException { return getRaceLog(triple.getA(), triple.getB(), triple.getC()); } @@ -4998,9 +4998,9 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S return ((HasRegattaLike) l).getRegattaLike().getRegattaLog(); } - private RaceLog getRaceLog(String leaderboardName, String raceColumnName, String fleetName) { - RaceColumn raceColumn = getService().getLeaderboardByName(leaderboardName).getRaceColumnByName(raceColumnName); - Fleet fleet = raceColumn.getFleetByName(fleetName); + private RaceLog getRaceLog(String leaderboardName, String raceColumnName, String fleetName) throws NotFoundException { + RaceColumn raceColumn = getRaceColumn(leaderboardName, raceColumnName); + Fleet fleet = getFleetByName(raceColumn, fleetName); return raceColumn.getRaceLog(fleet); } @@ -5010,7 +5010,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S @Override public void setCompetitorRegistrationsInRaceLog(String leaderboardName, String raceColumnName, String fleetName, - Set competitorDTOs) throws CompetitorRegistrationOnRaceLogDisabledException { + Set competitorDTOs) throws CompetitorRegistrationOnRaceLogDisabledException, NotFoundException { RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); Set competitors = new HashSet(); for (CompetitorDTO dto : competitorDTOs) { @@ -5086,7 +5086,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S @Override public void addCourseDefinitionToRaceLog(String leaderboardName, String raceColumnName, String fleetName, - List> courseDTO) { + List> courseDTO) throws NotFoundException { RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); String name = String.format("Course for %s - %s - %s", leaderboardName, raceColumnName, fleetName); @@ -5155,7 +5155,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S } @Override - public RaceCourseDTO getLastCourseDefinitionInRaceLog(String leaderboardName, String raceColumnName, String fleetName) { + public RaceCourseDTO getLastCourseDefinitionInRaceLog(String leaderboardName, String raceColumnName, String fleetName) throws NotFoundException { RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); CourseBase lastPublishedCourse = new LastPublishedCourseDesignFinder(raceLog).analyze(); if (lastPublishedCourse == null) { @@ -5178,7 +5178,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S @Override public void copyCourseToOtherRaceLogs(com.sap.sse.common.Util.Triple fromTriple, - Set> toTriples) { + Set> toTriples) throws NotFoundException { RaceLog fromRaceLog = getRaceLog(fromTriple); Set toRaceLogs = new HashSet<>(); for (com.sap.sse.common.Util.Triple toTriple : toTriples) { @@ -5189,7 +5189,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S @Override public void copyCompetitorsToOtherRaceLogs(com.sap.sse.common.Util.Triple fromTriple, - Set> toTriples) { + Set> toTriples) throws NotFoundException { RaceLog fromRaceLog = getRaceLog(fromTriple); Set toRaceLogs = new HashSet<>(); for (com.sap.sse.common.Util.Triple toTriple : toTriples) { @@ -5251,7 +5251,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S } private List> getLogHierarchy(String leaderboardName, String raceColumnName, - String fleetName) { + String fleetName) throws NotFoundException { List> result = new ArrayList<>(); RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); @@ -5290,13 +5290,13 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S @Override public List getDeviceMappingsFromLogHierarchy(String leaderboardName, String raceColumnName, - String fleetName) throws TransformationException { + String fleetName) throws TransformationException, NotFoundException { return getDeviceMappingsFromLogs(getLogHierarchy(leaderboardName, raceColumnName, fleetName)); } @Override public List getDeviceMappingsFromRaceLog(String leaderboardName, String raceColumnName, - String fleetName) throws TransformationException { + String fleetName) throws TransformationException, NotFoundException { RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); return getDeviceMappingsFromLogs(Collections.>singletonList(raceLog)); } @@ -5395,7 +5395,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S @Override public void revokeRaceAndRegattaLogEvents(String leaderboardName, String raceColumnName, String fleetName, - List eventIds) throws NotRevokableException { + List eventIds) throws NotRevokableException, NotFoundException { List> logs = getLogHierarchy(leaderboardName, raceColumnName, fleetName); revokeEventsFromLogs(logs, eventIds); } @@ -5871,30 +5871,66 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S @Override public Collection getCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, - String fleetName) throws DoesNotHaveRegattaLogException { - Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName); - RaceColumn raceColumn = leaderboard.getRaceColumnByName(raceColumnName); - Fleet fleet = raceColumn.getFleetByName(fleetName); + String fleetName) throws NotFoundException { + RaceColumn raceColumn = getRaceColumn(leaderboardName, raceColumnName); + Fleet fleet = getFleetByName(raceColumn, fleetName); return convertToCompetitorDTOs(raceColumn.getAllCompetitors(fleet)); } @Override - public Collection getCompetitorRegistrationsInRegattaLog(String leaderboardName) throws DoesNotHaveRegattaLogException { - RegattaLog regattaLog = getRegattaLogInternal(leaderboardName); + public Collection getCompetitorRegistrationsInRegattaLog(String leaderboardName) throws DoesNotHaveRegattaLogException, NotFoundException { + Leaderboard leaderboard = getLeaderboardByName(leaderboardName); - return convertToCompetitorDTOs(new CompetitorsInLogAnalyzer<>(regattaLog).analyze()); + if (! (leaderboard instanceof HasRegattaLike)) { + throw new DoesNotHaveRegattaLogException(); + } + HasRegattaLike regattaLikeLeaderboard = ((HasRegattaLike) leaderboard); + + return convertToCompetitorDTOs(regattaLikeLeaderboard.getCompetitorsRegisteredInRegattaLog()); } @Override - public boolean areCompetitorRegistrationsEnabledForRace(String leaderboardName, String raceColumnName, - String fleetName) { - RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); - RaceLogUsesOwnCompetitorsAnalyzer analyzer = new RaceLogUsesOwnCompetitorsAnalyzer(raceLog); - return analyzer.analyze(); + public Boolean areCompetitorRegistrationsEnabledForRace(String leaderboardName, String raceColumnName, + String fleetName) throws NotFoundException { + RaceColumn raceColumn = getRaceColumn(leaderboardName, raceColumnName); + Fleet fleet = getFleetByName(raceColumn, fleetName); + return raceColumn.isCompetitorRegistrationInRacelogEnabled(fleet); + } + + private Fleet getFleetByName(RaceColumn raceColumn, String fleetName) throws NotFoundException{ + Fleet fleet = raceColumn.getFleetByName(fleetName); + if (fleet == null){ + throw new NotFoundException("fleet with name "+fleetName+" not found"); + } + + return fleet; + } + + private Leaderboard getLeaderboardByName(String leaderboardName) throws NotFoundException{ + Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName); + if (leaderboard == null){ + throw new NotFoundException("Leaderboard with name "+leaderboardName+" not found"); + } + + return leaderboard; + } + + private RaceColumn getRaceColumn(String leaderboardName, String raceColumnName) throws NotFoundException{ + Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName); + if (leaderboard == null){ + throw new NotFoundException("leaderboard with name "+leaderboardName+" not found"); + } + + RaceColumn raceColumn = leaderboard.getRaceColumnByName(raceColumnName); + if (raceColumn == null){ + throw new NotFoundException("raceColumn with name "+raceColumnName+" not found"); + } + + return raceColumn; } @Override - public void deactivateCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName) throws NotRevokableException { + public void deactivateCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName) throws NotRevokableException, NotFoundException { if (areCompetitorRegistrationsEnabledForRace(leaderboardName, raceColumnName, fleetName)){ RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); @@ -5906,7 +5942,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S } @Override - public void activateCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName) { + public void activateCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName) throws IllegalArgumentException, NotFoundException { if (!areCompetitorRegistrationsEnabledForRace(leaderboardName, raceColumnName, fleetName)){ RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); int passId = raceLog.getCurrentPassId(); @@ -5918,7 +5954,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S @Override public Pair checkIfMarksAreUsedInOtherRaceLogs(String leaderboardName, String raceColumnName, - String fleetName, Set marksToRemove) { + String fleetName, Set marksToRemove) throws NotFoundException { Set markIds = new HashSet(); for (MarkDTO markDTO : marksToRemove) { markIds.add(markDTO.getIdAsString()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/exceptions/NotFoundException.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/exceptions/NotFoundException.java new file mode 100644 index 00000000000..55feda843d9 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/exceptions/NotFoundException.java @@ -0,0 +1,10 @@ +package com.sap.sailing.gwt.ui.server.exceptions; + +public class NotFoundException extends Exception{ + + private static final long serialVersionUID = 1690510580423647161L; + + public NotFoundException(String message) { + super(message); + } +} diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java index 4dc01fadc41..2bbc6d03c05 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java @@ -42,7 +42,6 @@ import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogCloseOpe import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceCompetitorMappingEventImpl; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogRegisterCompetitorEventImpl; import com.sap.sailing.domain.abstractlog.regatta.impl.OpenEndedDeviceMappingFinder; -import com.sap.sailing.domain.abstractlog.shared.analyzing.CompetitorsInLogAnalyzer; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.DomainFactory; import com.sap.sailing.domain.base.Fleet; @@ -367,7 +366,7 @@ public class LeaderboardsResource extends AbstractSailingServerResource { .entity("Leaderboard does not exist or does not hold a RegattaLog").type(MediaType.TEXT_PLAIN) .build(); } - IsRegattaLike isRegattaLike = ((HasRegattaLike) leaderboard).getRegattaLike(); + HasRegattaLike hasRegattaLike = (HasRegattaLike) leaderboard; DomainFactory domainFactory = getService().getDomainObjectFactory().getBaseDomainFactory(); AbstractLogEventAuthor author = new LogEventAuthorImpl(AbstractLogEventAuthor.NAME_COMPATIBILITY, AbstractLogEventAuthor.PRIORITY_COMPATIBILITY); @@ -406,16 +405,16 @@ public class LeaderboardsResource extends AbstractSailingServerResource { .type(MediaType.TEXT_PLAIN).build(); } // add registration if necessary - Set registered = new CompetitorsInLogAnalyzer<>(isRegattaLike.getRegattaLog()).analyze(); + Set registered = (Set) hasRegattaLike.getCompetitorsRegisteredInRegattaLog(); if (!registered.contains(mappedTo)) { - isRegattaLike.getRegattaLog().add( + hasRegattaLike.getRegattaLike().getRegattaLog().add( new RegattaLogRegisterCompetitorEventImpl(now, now, author, UUID.randomUUID(), mappedTo)); } DeviceIdentifier device = new SmartphoneUUIDIdentifierImpl(UUID.fromString(deviceUuid)); TimePoint from = new MillisecondsTimePoint(fromMillis); event = new RegattaLogDeviceCompetitorMappingEventImpl(now, now, author, UUID.randomUUID(), mappedTo, device, from, null); - isRegattaLike.getRegattaLog().add(event); + hasRegattaLike.getRegattaLike().getRegattaLog().add(event); logger.fine("Successfully checked in competitor " + mappedTo.getName()); return Response.status(Status.OK).build(); } From ffe0a94c605911ac3219fcdebc7aa4cef7da2443 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Sat, 28 Nov 2015 15:29:42 +0100 Subject: [PATCH 035/165] Register competitors on RaceColumn/HasRegattaLike --- .../domain/test/mock/MockedTrackedRace.java | 4 + .../sap/sailing/domain/base/RaceColumn.java | 10 ++ .../domain/base/impl/AbstractRaceColumn.java | 22 +++ .../sailing/domain/base/impl/RegattaImpl.java | 165 +++++++++++------- .../impl/AbstractLeaderboardImpl.java | 63 ++++--- .../meta/MetaLeaderboardColumn.java | 7 + .../domain/regattalike/HasRegattaLike.java | 2 + 7 files changed, 186 insertions(+), 87 deletions(-) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java index d2a130850b9..60cdcdc7931 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java @@ -492,6 +492,10 @@ public class MockedTrackedRace implements DynamicTrackedRace { public Iterable getCompetitorsRegisteredInRegattaLog() { return null; } + + @Override + public void registerCompetitor(Competitor competitor) { + } }; } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java index 0a85b8db7e9..fb7bd5b540b 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java @@ -3,6 +3,7 @@ package com.sap.sailing.domain.base; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.common.RaceIdentifier; +import com.sap.sailing.domain.common.racelog.tracking.CompetitorRegistrationOnRaceLogDisabledException; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.MetaLeaderboard; import com.sap.sailing.domain.racelog.RaceLogIdentifier; @@ -277,4 +278,13 @@ public interface RaceColumn extends Named { * @return boolean if competitor registration on the RaceLog is enabled, false in case this column belongs to a {@link MetaLeaderboard} */ boolean isCompetitorRegistrationInRacelogEnabled(Fleet fleet); + + /** + * Registers a competitor on the the race column's race log associated to the passed fleet. + * @param competitor + * @param fleet + * @throws CompetitorRegistrationOnRaceLogDisabledException + * thrown if competitor registration is disabled on racelog as well as if RaceColumn belongs to a {@link MetaLeaderboard} + */ + void registerCompetitor(Competitor competitor, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException; } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java index 5f4fedca584..e7df9e7459e 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java @@ -8,11 +8,15 @@ import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.UUID; import java.util.logging.Logger; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.DefinedMarkFinder; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RegisteredCompetitorsAnalyzer; +import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogRegisterCompetitorEventImpl; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Fleet; @@ -20,17 +24,22 @@ import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.common.RaceIdentifier; +import com.sap.sailing.domain.common.racelog.tracking.CompetitorRegistrationOnRaceLogDisabledException; import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.racelog.RaceLogStore; import com.sap.sailing.domain.racelog.impl.RaceLogIdentifierImpl; import com.sap.sailing.domain.regattalike.RegattaLikeIdentifier; import com.sap.sailing.domain.tracking.TrackedRace; +import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; +import com.sap.sse.common.impl.MillisecondsTimePoint; public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implements RaceColumn { private static final long serialVersionUID = -7801617988982540470L; private static final Logger logger = Logger.getLogger(AbstractRaceColumn.class.getName()); + private final AbstractLogEventAuthor raceLogEventAuthorForRaceColumn = new LogEventAuthorImpl( + AbstractRaceColumn.class.getName(), 0); private TrackedRaces trackedRaces; private Map raceIdentifiers; @@ -265,6 +274,19 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem } return result; } + + @Override + public void registerCompetitor(Competitor competitor, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException { + if (isCompetitorRegistrationInRacelogEnabled(fleet)){ + throw new CompetitorRegistrationOnRaceLogDisabledException(); + } + + TimePoint now = MillisecondsTimePoint.now(); + RaceLog raceLog = getRaceLog(fleet); + int passId = raceLog.getCurrentPassId(); + raceLog.add(new RaceLogRegisterCompetitorEventImpl(now, now, raceLogEventAuthorForRaceColumn, + UUID.randomUUID(), passId, competitor)); + } @Override public Iterable getAllMarks() { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java index 00e09bddf2a..b697079da0a 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java @@ -12,15 +12,19 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Level; import java.util.logging.Logger; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; +import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogRegisterCompetitorEventImpl; import com.sap.sailing.domain.abstractlog.shared.analyzing.CompetitorsInLogAnalyzer; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; @@ -43,6 +47,7 @@ import com.sap.sailing.domain.common.RegattaName; import com.sap.sailing.domain.common.RegattaNameAndRaceName; import com.sap.sailing.domain.leaderboard.ResultDiscardingRule; import com.sap.sailing.domain.leaderboard.ScoringScheme; +import com.sap.sailing.domain.leaderboard.impl.AbstractLeaderboardImpl; import com.sap.sailing.domain.leaderboard.impl.CompetitorProviderFromRaceColumnsAndRegattaLike; import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.racelog.RaceLogStore; @@ -64,6 +69,7 @@ import com.sap.sailing.util.impl.RaceColumnListeners; import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; +import com.sap.sse.common.impl.MillisecondsTimePoint; import com.sap.sse.common.impl.NamedImpl; public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListener { @@ -96,48 +102,54 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene private transient RaceLogStore raceLogStore; private final IsRegattaLike regattaLikeHelper; private final RankingMetricConstructor rankingMetricConstructor; - + private CourseArea defaultCourseArea; private RegattaConfiguration configuration; private RaceExecutionOrderCache raceExecutionOrderCache; - + /** - * Regattas may be constructed as implicit default regattas in which case they won't need to be stored - * durably and don't contain valuable information worth being preserved; or they are constructed explicitly - * with series and race columns in which case this data needs to be protected. This flag indicates whether - * the data of this regatta needs to be maintained persistently. + * Regattas may be constructed as implicit default regattas in which case they won't need to be stored durably and + * don't contain valuable information worth being preserved; or they are constructed explicitly with series and race + * columns in which case this data needs to be protected. This flag indicates whether the data of this regatta needs + * to be maintained persistently. * * @see #isPersistent */ private final boolean persistent; - + /** * Defaults to true. See {@link Regatta#useStartTimeInference()}. */ private boolean useStartTimeInference; - + private transient CompetitorProviderFromRaceColumnsAndRegattaLike competitorsProvider; - + private AbstractLogEventAuthor regattaLogEventAuthorForRegatta = new LogEventAuthorImpl( + AbstractLeaderboardImpl.class.getName(), 0);; + /** * Constructs a regatta with an empty {@link RaceLogStore}. */ - public RegattaImpl(String name, BoatClass boatClass, TimePoint startDate, TimePoint endDate, Iterable series, boolean persistent, - ScoringScheme scoringScheme, Serializable id, CourseArea courseArea) { - this(name, boatClass, startDate, endDate, series, persistent, scoringScheme, id, courseArea, OneDesignRankingMetric::new); + public RegattaImpl(String name, BoatClass boatClass, TimePoint startDate, TimePoint endDate, + Iterable series, boolean persistent, ScoringScheme scoringScheme, Serializable id, + CourseArea courseArea) { + this(name, boatClass, startDate, endDate, series, persistent, scoringScheme, id, courseArea, + OneDesignRankingMetric::new); } - + /** * Constructs a regatta with an empty {@link RaceLogStore}. */ - public RegattaImpl(String name, BoatClass boatClass, TimePoint startDate, TimePoint endDate, Iterable series, boolean persistent, - ScoringScheme scoringScheme, Serializable id, CourseArea courseArea, RankingMetricConstructor rankingMetricConstructor) { - this(EmptyRaceLogStore.INSTANCE, EmptyRegattaLogStore.INSTANCE, name, boatClass, startDate, endDate, series, persistent, - scoringScheme, id, courseArea, /* useStartTimeInference */ true, rankingMetricConstructor); + public RegattaImpl(String name, BoatClass boatClass, TimePoint startDate, TimePoint endDate, + Iterable series, boolean persistent, ScoringScheme scoringScheme, Serializable id, + CourseArea courseArea, RankingMetricConstructor rankingMetricConstructor) { + this(EmptyRaceLogStore.INSTANCE, EmptyRegattaLogStore.INSTANCE, name, boatClass, startDate, endDate, series, + persistent, scoringScheme, id, courseArea, /* useStartTimeInference */true, rankingMetricConstructor); } - + /** * Constructs a regatta with a single default series with empty race column list, and a single default fleet which * is not {@link #isPersistent() marked for persistence}. + * * @param trackedRegattaRegistry * used to find the {@link TrackedRegatta} for this column's series' {@link Series#getRegatta() regatta} * in order to re-associate a {@link TrackedRace} passed to {@link #setTrackedRace(Fleet, TrackedRace)} @@ -145,9 +157,9 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene * this column's series {@link Regatta}, respectively. If null, the re-association won't be * carried out. */ - public RegattaImpl(RaceLogStore raceLogStore, RegattaLogStore regattaLogStore, String name, BoatClass boatClass, TimePoint startDate, TimePoint endDate, - TrackedRegattaRegistry trackedRegattaRegistry, ScoringScheme scoringScheme, Serializable id, - CourseArea courseArea) { + public RegattaImpl(RaceLogStore raceLogStore, RegattaLogStore regattaLogStore, String name, BoatClass boatClass, + TimePoint startDate, TimePoint endDate, TrackedRegattaRegistry trackedRegattaRegistry, + ScoringScheme scoringScheme, Serializable id, CourseArea courseArea) { this(raceLogStore, regattaLogStore, name, boatClass, startDate, endDate, trackedRegattaRegistry, scoringScheme, id, courseArea, OneDesignRankingMetric::new); } @@ -165,12 +177,14 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene */ public RegattaImpl(RaceLogStore raceLogStore, RegattaLogStore regattaLogStore, String name, BoatClass boatClass, TimePoint startDate, TimePoint endDate, TrackedRegattaRegistry trackedRegattaRegistry, - ScoringScheme scoringScheme, Serializable id, CourseArea courseArea, RankingMetricConstructor rankingMetricConstructor) { + ScoringScheme scoringScheme, Serializable id, CourseArea courseArea, + RankingMetricConstructor rankingMetricConstructor) { this(raceLogStore, regattaLogStore, name, boatClass, startDate, endDate, Collections .singletonList(new SeriesImpl(LeaderboardNameConstants.DEFAULT_SERIES_NAME, - /* isMedal */false, Collections.singletonList(new FleetImpl(LeaderboardNameConstants.DEFAULT_FLEET_NAME)), + /* isMedal */false, Collections + .singletonList(new FleetImpl(LeaderboardNameConstants.DEFAULT_FLEET_NAME)), /* race column names */new ArrayList(), trackedRegattaRegistry)), /* persistent */false, - scoringScheme, id, courseArea, /* useStartTimeInference */ true, rankingMetricConstructor); + scoringScheme, id, courseArea, /* useStartTimeInference */true, rankingMetricConstructor); } /** @@ -178,9 +192,10 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene * all {@link Series} in this iterable will have their {@link Series#setRegatta(Regatta) regatta set} to * this new regatta. */ - public RegattaImpl(RaceLogStore raceLogStore, RegattaLogStore regattaLogStore, - String name, BoatClass boatClass, TimePoint startDate, TimePoint endDate, Iterable series, boolean persistent, ScoringScheme scoringScheme, - Serializable id, CourseArea courseArea, boolean useStartTimeInference, RankingMetricConstructor rankingMetricConstructor) { + public RegattaImpl(RaceLogStore raceLogStore, RegattaLogStore regattaLogStore, String name, + BoatClass boatClass, TimePoint startDate, TimePoint endDate, Iterable series, boolean persistent, + ScoringScheme scoringScheme, Serializable id, CourseArea courseArea, boolean useStartTimeInference, + RankingMetricConstructor rankingMetricConstructor) { super(name); this.rankingMetricConstructor = rankingMetricConstructor; this.useStartTimeInference = useStartTimeInference; @@ -244,19 +259,19 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene } public static String getDefaultName(String baseName, String boatClassName) { - return baseName+(boatClassName==null?"":" ("+boatClassName+")").replace('/', '_'); + return baseName + (boatClassName == null ? "" : " (" + boatClassName + ")").replace('/', '_'); } - + @Override public boolean isPersistent() { return persistent; } - + /** * When de-serializing, a possibly remote {@link #raceLogStore} is ignored because it is transient. Instead, an * {@link EmptyRaceLogStore} is used for the de-serialized instance. A new {@link RaceLogInformation} is assembled - * for this empty race log and applied to all columns. - * Make sure to call {@link #initializeSeriesAfterDeserialize()} after the object graph has been de-serialized. + * for this empty race log and applied to all columns. Make sure to call {@link #initializeSeriesAfterDeserialize()} + * after the object graph has been de-serialized. */ private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { ois.defaultReadObject(); @@ -269,17 +284,16 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene raceLogStore = EmptyRaceLogStore.INSTANCE; } } - + protected Object readResolve() throws ObjectStreamException { raceExecutionOrderCache.triggerUpdate(); // now we're fully initialized and the cache can do its job return this; } - + /** - * {@link RaceColumnListeners} may not be de-serialized (yet) when the regatta - * is de-serialized. To avoid re-registering empty objects most probably leading - * to null pointer exception one needs to initialize all listeners after - * all objects have been read. + * {@link RaceColumnListeners} may not be de-serialized (yet) when the regatta is de-serialized. To avoid + * re-registering empty objects most probably leading to null pointer exception one needs to initialize all + * listeners after all objects have been read. */ public void initializeSeriesAfterDeserialize() { for (Series series : getSeries()) { @@ -291,7 +305,7 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene } else { logger.warning("Race Columns were null during deserialization. This should not happen."); } - } + } } @Override @@ -304,7 +318,7 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene } return result; } - + @Override public Series getSeriesByName(String name) { for (Series s : getSeries()) { @@ -319,12 +333,12 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene public Iterable getAllRaces() { return races.values(); } - + @Override public RegattaIdentifier getRegattaIdentifier() { return new RegattaName(getName()); } - + @Override public RegattaAndRaceIdentifier getRaceIdentifier(RaceDefinition race) { return new RegattaNameAndRaceName(getName(), race.getName()); @@ -334,12 +348,13 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene public RaceDefinition getRaceByName(String raceName) { return races.get(raceName); } - + @Override public void addRace(RaceDefinition race) { - logger.info("Adding race "+race.getName()+" to regatta "+getName()+" ("+hashCode()+")"); + logger.info("Adding race " + race.getName() + " to regatta " + getName() + " (" + hashCode() + ")"); if (getBoatClass() != null && race.getBoatClass() != getBoatClass()) { - throw new IllegalArgumentException("Boat class "+race.getBoatClass()+" doesn't match regatta's boat class "+getBoatClass()); + throw new IllegalArgumentException("Boat class " + race.getBoatClass() + + " doesn't match regatta's boat class " + getBoatClass()); } races.put(race.getName(), race); synchronized (regattaListeners) { @@ -348,10 +363,10 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene } } } - + @Override public void removeRace(RaceDefinition race) { - logger.info("Removing race "+race.getName()+" from regatta "+getName()+" ("+hashCode()+")"); + logger.info("Removing race " + race.getName() + " from regatta " + getName() + " (" + hashCode() + ")"); races.remove(race.getName()); synchronized (regattaListeners) { for (RegattaListener l : regattaListeners) { @@ -403,25 +418,28 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene public void trackedRaceUnlinked(RaceColumn raceColumn, Fleet fleet, TrackedRace trackedRace) { raceColumnListeners.notifyListenersAboutTrackedRaceUnlinked(raceColumn, fleet, trackedRace); } - + @Override public void isMedalRaceChanged(RaceColumn raceColumn, boolean newIsMedalRace) { raceColumnListeners.notifyListenersAboutIsMedalRaceChanged(raceColumn, newIsMedalRace); } - + @Override public void isStartsWithZeroScoreChanged(RaceColumn raceColumn, boolean newIsStartsWithZeroScore) { raceColumnListeners.notifyListenersAboutIsStartsWithZeroScoreChanged(raceColumn, newIsStartsWithZeroScore); } @Override - public void isFirstColumnIsNonDiscardableCarryForwardChanged(RaceColumn raceColumn, boolean firstColumnIsNonDiscardableCarryForward) { - raceColumnListeners.notifyListenersAboutIsFirstColumnIsNonDiscardableCarryForwardChanged(raceColumn, firstColumnIsNonDiscardableCarryForward); + public void isFirstColumnIsNonDiscardableCarryForwardChanged(RaceColumn raceColumn, + boolean firstColumnIsNonDiscardableCarryForward) { + raceColumnListeners.notifyListenersAboutIsFirstColumnIsNonDiscardableCarryForwardChanged(raceColumn, + firstColumnIsNonDiscardableCarryForward); } @Override public void hasSplitFleetContiguousScoringChanged(RaceColumn raceColumn, boolean hasSplitFleetContiguousScoring) { - raceColumnListeners.notifyListenersAboutHasSplitFleetContiguousScoringChanged(raceColumn, hasSplitFleetContiguousScoring); + raceColumnListeners.notifyListenersAboutHasSplitFleetContiguousScoringChanged(raceColumn, + hasSplitFleetContiguousScoring); } @Override @@ -460,7 +478,8 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene } @Override - public void resultDiscardingRuleChanged(ResultDiscardingRule oldDiscardingRule, ResultDiscardingRule newDiscardingRule) { + public void resultDiscardingRuleChanged(ResultDiscardingRule oldDiscardingRule, + ResultDiscardingRule newDiscardingRule) { raceColumnListeners.notifyListenersAboutResultDiscardingRuleChanged(oldDiscardingRule, newDiscardingRule); } @@ -483,7 +502,7 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene public void raceLogEventAdded(RaceColumn raceColumn, RaceLogIdentifier raceLogIdentifier, RaceLogEvent event) { raceColumnListeners.notifyListenersAboutRaceLogEventAdded(raceColumn, raceLogIdentifier, event); } - + @Override public ScoringScheme getScoringScheme() { return scoringScheme; @@ -518,17 +537,17 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene public void setDefaultCourseArea(CourseArea newCourseArea) { this.defaultCourseArea = newCourseArea; } - + @Override public void setUseStartTimeInference(boolean useStartTimeInference) { this.useStartTimeInference = useStartTimeInference; } - + @Override public RegattaConfiguration getRegattaConfiguration() { return configuration; } - + @Override public void setRegattaConfiguration(RegattaConfiguration configuration) { this.configuration = configuration; @@ -536,8 +555,8 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene /** * @return whether this regatta defines its local per-series result discarding rules; if so, any leaderboard based - * on the regatta has to respect this and has to use a result discarding rule implementation that - * keeps discards local to each series rather than spreading them across the entire leaderboard. + * on the regatta has to respect this and has to use a result discarding rule implementation that keeps + * discards local to each series rather than spreading them across the entire leaderboard. */ @Override public boolean definesSeriesDiscardThresholds() { @@ -548,7 +567,7 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene } return false; } - + public String toString() { return getId() + " " + getName() + " " + getScoringScheme().getType().name(); } @@ -597,7 +616,7 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene } this.series = newSeriesList; } - } + } } @Override @@ -624,7 +643,7 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene public void removeListener(RegattaLikeListener listener) { regattaLikeHelper.removeListener(listener); } - + @Override public Double getTimeOnTimeFactor(Competitor competitor) { return regattaLikeHelper.getTimeOnTimeFactor(competitor); @@ -652,7 +671,7 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene public RaceExecutionOrderProvider getRaceExecutionOrderProvider() { return raceExecutionOrderCache; } - + private class RaceExecutionOrderCache extends AbstractRaceExecutionOrderProvider { private static final long serialVersionUID = 1658153438012186894L; @@ -680,10 +699,13 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene } } catch (ConcurrentModificationException e) { // getSeries() returns a live collection, and Series.getRaceColumns() does so, too. - // In the unlikely event of a modification is applied to either of these structures while iterating, an exception + // In the unlikely event of a modification is applied to either of these structures while + // iterating, an exception // will be thrown. We catch and log it here and try again. - logger.log(Level.INFO, - "Got a ConcurrentModificationException while trying to update the RaceExecutionOrderCache", e); + logger.log( + Level.INFO, + "Got a ConcurrentModificationException while trying to update the RaceExecutionOrderCache", + e); concurrentlyModified = true; } } while (concurrentlyModified); @@ -733,7 +755,16 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene @Override public Iterable getCompetitorsRegisteredInRegattaLog() { RegattaLog regattaLog = getRegattaLog(); - CompetitorsInLogAnalyzer analyzer = new CompetitorsInLogAnalyzer<>(regattaLog); + CompetitorsInLogAnalyzer analyzer = new CompetitorsInLogAnalyzer<>( + regattaLog); return analyzer.analyze(); } + + @Override + public void registerCompetitor(Competitor competitor) { + RegattaLog regattaLog = getRegattaLike().getRegattaLog(); + TimePoint now = MillisecondsTimePoint.now(); + regattaLog.add(new RegattaLogRegisterCompetitorEventImpl(now, now, regattaLogEventAuthorForRegatta , + UUID.randomUUID(), competitor)); + } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java index d837620bd7e..4d19a01a25d 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java @@ -5,11 +5,15 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; +import java.util.UUID; +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; +import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogRegisterCompetitorEventImpl; import com.sap.sailing.domain.abstractlog.shared.analyzing.CompetitorsInLogAnalyzer; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Fleet; @@ -21,34 +25,41 @@ import com.sap.sailing.domain.leaderboard.ScoreCorrection; import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sse.common.TimePoint; +import com.sap.sse.common.impl.MillisecondsTimePoint; /** - * Abstract leaderboard implementation that already knows about carried points, competitor display name re-keying, - * score corrections and result discarding rules. It manages a set of registered {@link RaceColumnListener}s and - * is itself one. All events received this way are forwarded to all {@link RaceColumnListener}s subscribed. This can - * be used to subscribe a concrete leaderboard implementation to the data structure providing the actual race columns - * in order to be notified whenever the set of {@link TrackedRace}s attached to the leaderboard changes. + * Abstract leaderboard implementation that already knows about carried points, competitor display name re-keying, score + * corrections and result discarding rules. It manages a set of registered {@link RaceColumnListener}s and is itself + * one. All events received this way are forwarded to all {@link RaceColumnListener}s subscribed. This can be used to + * subscribe a concrete leaderboard implementation to the data structure providing the actual race columns in order to + * be notified whenever the set of {@link TrackedRace}s attached to the leaderboard changes. * * @author Axel Uhl (D043530) * */ -public abstract class AbstractLeaderboardImpl extends AbstractSimpleLeaderboardImpl implements HasRaceColumnsAndRegattaLike { +public abstract class AbstractLeaderboardImpl extends AbstractSimpleLeaderboardImpl implements + HasRaceColumnsAndRegattaLike { private static final long serialVersionUID = -328091952760083438L; - + /** * Cache for the combined competitors of this leaderboard; taken from the {@link TrackedRace#getRace() races of the * tracked races} associated with this leaderboard. Updated when the set of tracked races changes. */ private transient CompetitorProviderFromRaceColumnsAndRegattaLike competitorsProvider; + private final AbstractLogEventAuthor regattaLogEventAuthorForAbstraceLeaderboard = new LogEventAuthorImpl( + AbstractLeaderboardImpl.class.getName(), 0); + /** - * @param scoreComparator the comparator to use to compare basic scores, such as net points - * @param name must not be null + * @param scoreComparator + * the comparator to use to compare basic scores, such as net points + * @param name + * must not be null */ public AbstractLeaderboardImpl(ThresholdBasedResultDiscardingRule resultDiscardingRule) { super(resultDiscardingRule); } - + @Override public Fleet getFleet(String fleetName) { for (RaceColumn raceColumn : getRaceColumns()) { @@ -83,7 +94,7 @@ public abstract class AbstractLeaderboardImpl extends AbstractSimpleLeaderboardI public Iterable getAllCompetitors() { return getOrCreateCompetitorsProvider().getAllCompetitors(); } - + @Override public Iterable getAllCompetitors(RaceColumn raceColumn, Fleet fleet) { return getOrCreateCompetitorsProvider().getAllCompetitors(raceColumn, fleet); @@ -110,8 +121,8 @@ public abstract class AbstractLeaderboardImpl extends AbstractSimpleLeaderboardI public int getTrackedRank(Competitor competitor, RaceColumn race, TimePoint timePoint) { final TrackedRace trackedRace = race.getTrackedRace(competitor); return trackedRace == null ? 0 - : trackedRace.hasStarted(timePoint) ? improveByDisqualificationsOfBetterRankedCompetitors(race, trackedRace, timePoint, trackedRace - .getRank(competitor, timePoint)) : 0; + : trackedRace.hasStarted(timePoint) ? improveByDisqualificationsOfBetterRankedCompetitors(race, + trackedRace, timePoint, trackedRace.getRank(competitor, timePoint)) : 0; } /** @@ -139,9 +150,11 @@ public abstract class AbstractLeaderboardImpl extends AbstractSimpleLeaderboardI Iterator ci = competitorsFromBestToWorst.iterator(); while (betterCompetitorRank < rank && ci.hasNext()) { Competitor betterTrackedCompetitor = ci.next(); - MaxPointsReason maxPointsReasonForBetterCompetitor = getScoreCorrection().getMaxPointsReason(betterTrackedCompetitor, raceColumn, timePoint); - if (maxPointsReasonForBetterCompetitor != null && maxPointsReasonForBetterCompetitor != MaxPointsReason.NONE && - maxPointsReasonForBetterCompetitor.isAdvanceCompetitorsTrackedWorse()) { + MaxPointsReason maxPointsReasonForBetterCompetitor = getScoreCorrection().getMaxPointsReason( + betterTrackedCompetitor, raceColumn, timePoint); + if (maxPointsReasonForBetterCompetitor != null + && maxPointsReasonForBetterCompetitor != MaxPointsReason.NONE + && maxPointsReasonForBetterCompetitor.isAdvanceCompetitorsTrackedWorse()) { correctedRank--; } betterCompetitorRank++; @@ -160,7 +173,8 @@ public abstract class AbstractLeaderboardImpl extends AbstractSimpleLeaderboardI TrackedRace trackedRace = raceColumn.getTrackedRace(fleet); if (trackedRace != null) { if (startOfLatestRace == null - || (trackedRace.getStartOfRace() != null && trackedRace.getStartOfRace().compareTo(startOfLatestRace) > 0)) { + || (trackedRace.getStartOfRace() != null && trackedRace.getStartOfRace().compareTo( + startOfLatestRace) > 0)) { delayToLiveInMillisForLatestRace = trackedRace.getDelayToLiveInMillis(); } } @@ -168,9 +182,9 @@ public abstract class AbstractLeaderboardImpl extends AbstractSimpleLeaderboardI } return delayToLiveInMillisForLatestRace; } - + @Override - public RaceLog getRacelog(String raceColumnName, String fleetName){ + public RaceLog getRacelog(String raceColumnName, String fleetName) { RaceColumn raceColumn = getRaceColumnByName(raceColumnName); Fleet fleet = raceColumn.getFleetByName(fleetName); return raceColumn.getRaceLog(fleet); @@ -179,7 +193,16 @@ public abstract class AbstractLeaderboardImpl extends AbstractSimpleLeaderboardI @Override public Iterable getCompetitorsRegisteredInRegattaLog() { RegattaLog regattaLog = getRegattaLike().getRegattaLog(); - CompetitorsInLogAnalyzer analyzer = new CompetitorsInLogAnalyzer<>(regattaLog); + CompetitorsInLogAnalyzer analyzer = new CompetitorsInLogAnalyzer<>( + regattaLog); return analyzer.analyze(); } + + @Override + public void registerCompetitor(Competitor competitor) { + RegattaLog regattaLog = getRegattaLike().getRegattaLog(); + TimePoint now = MillisecondsTimePoint.now(); + regattaLog.add(new RegattaLogRegisterCompetitorEventImpl(now, now, regattaLogEventAuthorForAbstraceLeaderboard, + UUID.randomUUID(), competitor)); + } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java index 90ee7060f11..45452551737 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java @@ -14,6 +14,7 @@ import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.RaceColumnListener; import com.sap.sailing.domain.base.impl.SimpleAbstractRaceColumn; import com.sap.sailing.domain.common.RaceIdentifier; +import com.sap.sailing.domain.common.racelog.tracking.CompetitorRegistrationOnRaceLogDisabledException; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.ResultDiscardingRule; import com.sap.sailing.domain.racelog.RaceLogIdentifier; @@ -245,4 +246,10 @@ public class MetaLeaderboardColumn extends SimpleAbstractRaceColumn implements R TrackedRace trackedRace = getTrackedRace(fleet); return trackedRace.getMarks(); } + + @Override + public void registerCompetitor(Competitor competitor, Fleet fleet) + throws CompetitorRegistrationOnRaceLogDisabledException { + throw new CompetitorRegistrationOnRaceLogDisabledException(); + } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/HasRegattaLike.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/HasRegattaLike.java index 6a1589b9c8e..93b1fe1a870 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/HasRegattaLike.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/HasRegattaLike.java @@ -18,4 +18,6 @@ public interface HasRegattaLike { RaceLog getRacelog(String raceColumnName, String fleetName); Iterable getCompetitorsRegisteredInRegattaLog(); + + void registerCompetitor(Competitor competitor); } From 433a3c0dd0a1fcba8751f837f33308233b9304c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Sat, 28 Nov 2015 16:17:13 +0100 Subject: [PATCH 036/165] Remove unnecessary constructor --- .../com/sap/sailing/domain/base/impl/RegattaImpl.java | 10 ---------- .../sailing/server/impl/MediaMasterDataExportTest.java | 3 ++- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java index b697079da0a..8f072e913b7 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java @@ -126,16 +126,6 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene private AbstractLogEventAuthor regattaLogEventAuthorForRegatta = new LogEventAuthorImpl( AbstractLeaderboardImpl.class.getName(), 0);; - /** - * Constructs a regatta with an empty {@link RaceLogStore}. - */ - public RegattaImpl(String name, BoatClass boatClass, TimePoint startDate, TimePoint endDate, - Iterable series, boolean persistent, ScoringScheme scoringScheme, Serializable id, - CourseArea courseArea) { - this(name, boatClass, startDate, endDate, series, persistent, scoringScheme, id, courseArea, - OneDesignRankingMetric::new); - } - /** * Constructs a regatta with an empty {@link RaceLogStore}. */ diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/impl/MediaMasterDataExportTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/impl/MediaMasterDataExportTest.java index 3cf24c8da1f..455cd856500 100644 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/impl/MediaMasterDataExportTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/impl/MediaMasterDataExportTest.java @@ -47,6 +47,7 @@ import com.sap.sailing.domain.leaderboard.impl.RegattaLeaderboardImpl; import com.sap.sailing.domain.leaderboard.impl.ThresholdBasedResultDiscardingRuleImpl; import com.sap.sailing.domain.masterdataimport.TopLevelMasterData; import com.sap.sailing.domain.racelog.tracking.GPSFixStore; +import com.sap.sailing.domain.ranking.OneDesignRankingMetric; import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; @@ -181,7 +182,7 @@ public class MediaMasterDataExportTest { TrackedRegattaRegistry trackedRegattaRegistry = mock(TrackedRegattaRegistry.class); Series series = new SeriesImpl("series name", isMedal, regattaFleets, raceColumnNames, trackedRegattaRegistry); Iterable regattaSeries = Collections.singleton(series); - return new RegattaImpl(regattaName, boatClass, startDate, endDate, regattaSeries, persistent, scoringScheme, regatteId , courseArea); + return new RegattaImpl(regattaName, boatClass, startDate, endDate, regattaSeries, persistent, scoringScheme, regatteId , courseArea, OneDesignRankingMetric::new); } From e753390b0f76217c2156e4dd8a5f3b01758dee52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Sat, 28 Nov 2015 18:33:33 +0100 Subject: [PATCH 037/165] Fix test case, behavior is different from what was tested --- .../test/CompetitorProviderCacheInvalidationTest.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CompetitorProviderCacheInvalidationTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CompetitorProviderCacheInvalidationTest.java index ad3364457e1..3ed1729fe17 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CompetitorProviderCacheInvalidationTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CompetitorProviderCacheInvalidationTest.java @@ -179,11 +179,9 @@ public class CompetitorProviderCacheInvalidationTest extends AbstractLeaderboard for (Competitor c : compLists[1]) { raceLog.add(new RaceLogRegisterCompetitorEventImpl(MillisecondsTimePoint.now(), new LogEventAuthorImpl("Me", 0), 1, c)); } - //expected are all competitors, because the getAllCopmetitors method is called - //this includes competitors Registered in the RaceLogs, for which the RaceLog - //is denoted with the RaceLogUseCompetitorsFromRaceLogEvent as well as the competitors in the RegattaLog - Set expected = new HashSet<>(compLists[0]); - expected.addAll(compLists[1]); + //expected are only the competitors in the RaceLog, because only one RaceColumn is + //registered, which has the competitors registered in the RaceLog. + Set expected = new HashSet<>(compLists[1]); Set actual = new HashSet<>(); Util.addAll(competitorProviderFlexibleLeaderboard.getAllCompetitors(), actual); assertEquals(expected, actual); From 2f75c64c45cfdcd3173e3963237f94d79388ca8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Sat, 28 Nov 2015 19:17:37 +0100 Subject: [PATCH 038/165] Provide competitor registration and deregistration methods on RaeColumn and HasRegattaLike --- .../domain/test/mock/MockedTrackedRace.java | 13 ++++++ .../sap/sailing/domain/base/RaceColumn.java | 13 ++++++ .../domain/base/impl/AbstractRaceColumn.java | 46 ++++++++++++++++++- .../sailing/domain/base/impl/RegattaImpl.java | 40 ++++++++++++++-- .../impl/AbstractLeaderboardImpl.java | 43 ++++++++++++++++- .../meta/MetaLeaderboardColumn.java | 19 ++++++++ .../domain/regattalike/HasRegattaLike.java | 6 +++ 7 files changed, 173 insertions(+), 7 deletions(-) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java index 60cdcdc7931..e663a5e5c1c 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java @@ -1,6 +1,7 @@ package com.sap.sailing.domain.test.mock; import java.io.Serializable; +import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.NavigableSet; @@ -496,6 +497,18 @@ public class MockedTrackedRace implements DynamicTrackedRace { @Override public void registerCompetitor(Competitor competitor) { } + + @Override + public void registerCompetitors(Collection competitor) { + } + + @Override + public void deregisterCompetitor(Competitor competitor) { + } + + @Override + public void deregisterCompetitors(Collection competitor) { + } }; } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java index fb7bd5b540b..1561e639c2c 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java @@ -1,5 +1,7 @@ package com.sap.sailing.domain.base; +import java.util.Collection; + import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.common.RaceIdentifier; @@ -287,4 +289,15 @@ public interface RaceColumn extends Named { * thrown if competitor registration is disabled on racelog as well as if RaceColumn belongs to a {@link MetaLeaderboard} */ void registerCompetitor(Competitor competitor, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException; + void registerCompetitors(Collection competitor, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException; + + /** + * Deregisters a competitor on the the race column's race log associated to the passed fleet. + * @param competitor + * @param fleet + * @throws CompetitorRegistrationOnRaceLogDisabledException + * thrown if competitor registration is disabled on racelog as well as if RaceColumn belongs to a {@link MetaLeaderboard} + */ + void deRegisterCompetitor(Competitor competitors, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException; + void deRegisterCompetitors(Collection competitors, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException; } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java index e7df9e7459e..33a2f8b8e50 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java @@ -3,27 +3,32 @@ package com.sap.sailing.domain.base.impl; import java.io.IOException; import java.io.ObjectInputStream; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.UUID; +import java.util.logging.Level; import java.util.logging.Logger; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.DefinedMarkFinder; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RegisteredCompetitorsAnalyzer; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogRegisterCompetitorEventImpl; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; +import com.sap.sailing.domain.abstractlog.shared.events.RegisterCompetitorEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.common.RaceIdentifier; +import com.sap.sailing.domain.common.abstractlog.NotRevokableException; import com.sap.sailing.domain.common.racelog.tracking.CompetitorRegistrationOnRaceLogDisabledException; import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.racelog.RaceLogStore; @@ -277,6 +282,12 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem @Override public void registerCompetitor(Competitor competitor, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException { + registerCompetitors(Collections.singleton(competitor), fleet); + } + + @Override + public void registerCompetitors(Collection competitors, Fleet fleet) + throws CompetitorRegistrationOnRaceLogDisabledException { if (isCompetitorRegistrationInRacelogEnabled(fleet)){ throw new CompetitorRegistrationOnRaceLogDisabledException(); } @@ -284,8 +295,39 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem TimePoint now = MillisecondsTimePoint.now(); RaceLog raceLog = getRaceLog(fleet); int passId = raceLog.getCurrentPassId(); - raceLog.add(new RaceLogRegisterCompetitorEventImpl(now, now, raceLogEventAuthorForRaceColumn, - UUID.randomUUID(), passId, competitor)); + for (Competitor competitor: competitors){ + raceLog.add(new RaceLogRegisterCompetitorEventImpl(now, now, raceLogEventAuthorForRaceColumn, + UUID.randomUUID(), passId, competitor)); + } + } + + @Override + public void deRegisterCompetitor(Competitor competitor, Fleet fleet) + throws CompetitorRegistrationOnRaceLogDisabledException { + deRegisterCompetitors(Collections.singleton(competitor), fleet); + } + + @Override + public void deRegisterCompetitors(Collection competitors, Fleet fleet) + throws CompetitorRegistrationOnRaceLogDisabledException { + if (isCompetitorRegistrationInRacelogEnabled(fleet)){ + throw new CompetitorRegistrationOnRaceLogDisabledException(); + } + + RaceLog raceLog = getRaceLog(fleet); + for (RaceLogEvent event : raceLog.getUnrevokedEventsDescending()) { + if (event instanceof RegisterCompetitorEvent) { + RegisterCompetitorEvent registerEvent = (RegisterCompetitorEvent) event; + if (competitors.contains(registerEvent.getCompetitor())) { + try { + raceLog.revokeEvent(raceLogEventAuthorForRaceColumn, event, + "unregistering competitor because no longer selected for registration"); + } catch (NotRevokableException e) { + logger.log(Level.WARNING, "could not unregister competitor by adding RevokeEvent", e); + } + } + } + } } @Override diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java index 8f072e913b7..fdc4323dd98 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java @@ -5,6 +5,7 @@ import java.io.ObjectInputStream; import java.io.ObjectStreamException; import java.io.Serializable; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.ConcurrentModificationException; import java.util.HashMap; @@ -26,6 +27,7 @@ import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogRegisterCompetitorEventImpl; import com.sap.sailing.domain.abstractlog.shared.analyzing.CompetitorsInLogAnalyzer; +import com.sap.sailing.domain.abstractlog.shared.events.RegisterCompetitorEvent; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseArea; @@ -45,6 +47,7 @@ import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.RegattaIdentifier; import com.sap.sailing.domain.common.RegattaName; import com.sap.sailing.domain.common.RegattaNameAndRaceName; +import com.sap.sailing.domain.common.abstractlog.NotRevokableException; import com.sap.sailing.domain.leaderboard.ResultDiscardingRule; import com.sap.sailing.domain.leaderboard.ScoringScheme; import com.sap.sailing.domain.leaderboard.impl.AbstractLeaderboardImpl; @@ -749,12 +752,43 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene regattaLog); return analyzer.analyze(); } - + @Override public void registerCompetitor(Competitor competitor) { + registerCompetitors(Collections.singleton(competitor)); + } + + @Override + public void registerCompetitors(Collection competitors) { RegattaLog regattaLog = getRegattaLike().getRegattaLog(); TimePoint now = MillisecondsTimePoint.now(); - regattaLog.add(new RegattaLogRegisterCompetitorEventImpl(now, now, regattaLogEventAuthorForRegatta , - UUID.randomUUID(), competitor)); + + for (Competitor competitor : competitors) { + regattaLog.add(new RegattaLogRegisterCompetitorEventImpl(now, now, regattaLogEventAuthorForRegatta, + UUID.randomUUID(), competitor)); + } + } + + @Override + public void deregisterCompetitor(Competitor competitor) { + deregisterCompetitors(Collections.singleton(competitor)); + } + + @Override + public void deregisterCompetitors(Collection competitors) { + RegattaLog regattaLog = getRegattaLike().getRegattaLog(); + for (RegattaLogEvent event : regattaLog.getUnrevokedEventsDescending()) { + if (event instanceof RegisterCompetitorEvent) { + RegisterCompetitorEvent registerEvent = (RegisterCompetitorEvent) event; + if (competitors.contains(registerEvent.getCompetitor())) { + try { + regattaLog.revokeEvent(regattaLogEventAuthorForRegatta, event, + "unregistering competitor because no longer selected for registration"); + } catch (NotRevokableException e) { + logger.log(Level.WARNING, "could not unregister competitor by adding RevokeEvent", e); + } + } + } + } } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java index 4d19a01a25d..50974add064 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java @@ -1,11 +1,14 @@ package com.sap.sailing.domain.leaderboard.impl; +import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.UUID; +import java.util.logging.Level; +import java.util.logging.Logger; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; @@ -15,11 +18,13 @@ import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogRegisterCompetitorEventImpl; import com.sap.sailing.domain.abstractlog.shared.analyzing.CompetitorsInLogAnalyzer; +import com.sap.sailing.domain.abstractlog.shared.events.RegisterCompetitorEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.RaceColumnListener; import com.sap.sailing.domain.common.MaxPointsReason; +import com.sap.sailing.domain.common.abstractlog.NotRevokableException; import com.sap.sailing.domain.leaderboard.HasRaceColumnsAndRegattaLike; import com.sap.sailing.domain.leaderboard.ScoreCorrection; import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule; @@ -49,6 +54,9 @@ public abstract class AbstractLeaderboardImpl extends AbstractSimpleLeaderboardI private final AbstractLogEventAuthor regattaLogEventAuthorForAbstraceLeaderboard = new LogEventAuthorImpl( AbstractLeaderboardImpl.class.getName(), 0); + + private static final Logger logger = Logger.getLogger(AbstractLeaderboardImpl.class.getName()); + /** * @param scoreComparator @@ -200,9 +208,40 @@ public abstract class AbstractLeaderboardImpl extends AbstractSimpleLeaderboardI @Override public void registerCompetitor(Competitor competitor) { + registerCompetitors(Collections.singleton(competitor)); + } + + @Override + public void registerCompetitors(Collection competitors) { RegattaLog regattaLog = getRegattaLike().getRegattaLog(); TimePoint now = MillisecondsTimePoint.now(); - regattaLog.add(new RegattaLogRegisterCompetitorEventImpl(now, now, regattaLogEventAuthorForAbstraceLeaderboard, - UUID.randomUUID(), competitor)); + + for (Competitor competitor : competitors) { + regattaLog.add(new RegattaLogRegisterCompetitorEventImpl(now, now, regattaLogEventAuthorForAbstraceLeaderboard, + UUID.randomUUID(), competitor)); + } + } + + @Override + public void deregisterCompetitor(Competitor competitor) { + deregisterCompetitors(Collections.singleton(competitor)); + } + + @Override + public void deregisterCompetitors(Collection competitors) { + RegattaLog regattaLog = getRegattaLike().getRegattaLog(); + for (RegattaLogEvent event : regattaLog.getUnrevokedEventsDescending()) { + if (event instanceof RegisterCompetitorEvent) { + RegisterCompetitorEvent registerEvent = (RegisterCompetitorEvent) event; + if (competitors.contains(registerEvent.getCompetitor())) { + try { + regattaLog.revokeEvent(regattaLogEventAuthorForAbstraceLeaderboard, event, + "unregistering competitor because no longer selected for registration"); + } catch (NotRevokableException e) { + logger.log(Level.WARNING, "could not unregister competitor by adding RevokeEvent", e); + } + } + } + } } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java index 45452551737..217af722e3f 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java @@ -1,5 +1,6 @@ package com.sap.sailing.domain.leaderboard.meta; +import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Set; @@ -252,4 +253,22 @@ public class MetaLeaderboardColumn extends SimpleAbstractRaceColumn implements R throws CompetitorRegistrationOnRaceLogDisabledException { throw new CompetitorRegistrationOnRaceLogDisabledException(); } + + @Override + public void registerCompetitors(Collection competitor, Fleet fleet) + throws CompetitorRegistrationOnRaceLogDisabledException { + throw new CompetitorRegistrationOnRaceLogDisabledException(); + } + + @Override + public void deRegisterCompetitor(Competitor competitors, Fleet fleet) + throws CompetitorRegistrationOnRaceLogDisabledException { + throw new CompetitorRegistrationOnRaceLogDisabledException(); + } + + @Override + public void deRegisterCompetitors(Collection competitors, Fleet fleet) + throws CompetitorRegistrationOnRaceLogDisabledException { + throw new CompetitorRegistrationOnRaceLogDisabledException(); + } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/HasRegattaLike.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/HasRegattaLike.java index 93b1fe1a870..79a010a11b0 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/HasRegattaLike.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/HasRegattaLike.java @@ -1,5 +1,7 @@ package com.sap.sailing.domain.regattalike; +import java.util.Collection; + import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Regatta; @@ -20,4 +22,8 @@ public interface HasRegattaLike { Iterable getCompetitorsRegisteredInRegattaLog(); void registerCompetitor(Competitor competitor); + void registerCompetitors(Collection competitor); + + void deregisterCompetitor(Competitor competitor); + void deregisterCompetitors(Collection competitor); } From 96c6a19847807f1aba6e802f5d2e85ceaadc5e39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Sat, 28 Nov 2015 19:59:11 +0100 Subject: [PATCH 039/165] Disable/Enable competitor registrations on RaceColumn --- .../RaceLogTrackingAdapter.java | 26 ------ .../impl/RaceLogTrackingAdapterImpl.java | 82 ----------------- .../domain/test/mock/MockedTrackedRace.java | 5 +- .../sap/sailing/domain/base/RaceColumn.java | 20 +++- .../domain/base/impl/AbstractRaceColumn.java | 42 ++++++++- .../sailing/domain/base/impl/RegattaImpl.java | 9 +- .../impl/AbstractLeaderboardImpl.java | 11 ++- .../meta/MetaLeaderboardColumn.java | 13 ++- .../domain/regattalike/HasRegattaLike.java | 6 +- .../RaceLogCompetitorRegistrationDialog.java | 4 +- .../sailing/gwt/ui/client/SailingService.java | 6 +- .../gwt/ui/client/SailingServiceAsync.java | 4 +- .../gwt/ui/server/SailingServiceImpl.java | 92 ++++++++++++------- 13 files changed, 149 insertions(+), 171 deletions(-) diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java index fc1a209f9e0..6ea9b2e40a7 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java @@ -7,8 +7,6 @@ import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogUseCompetitorsFromRaceLogEventImpl; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.ControlPoint; @@ -17,7 +15,6 @@ import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.SharedDomainFactory; -import com.sap.sailing.domain.common.racelog.tracking.CompetitorRegistrationOnRaceLogDisabledException; import com.sap.sailing.domain.common.racelog.tracking.NotDenotableForRaceLogTrackingException; import com.sap.sailing.domain.common.racelog.tracking.NotDenotedForRaceLogTrackingException; import com.sap.sailing.domain.common.racelog.tracking.RaceLogTrackingState; @@ -82,22 +79,6 @@ public interface RaceLogTrackingAdapter { */ void pingMark(RegattaLog regattaLogToAddTo, Mark mark, GPSFix gpsFix, RacingEventService service); - /** - * If not yet registered, register the competitors in {@code competitors}, and unregister all already registered - * competitors not in {@code competitors}. - * - * @throws CompetitorRegistrationOnRaceLogDisabledException - * if no {@link RaceLogUseCompetitorsFromRaceLogEvent} is present in the RaceLog - */ - void registerCompetitors(RacingEventService service, RaceLog raceLog, Set competitors) - throws CompetitorRegistrationOnRaceLogDisabledException; - - /** - * If not yet registered, register the competitors in {@code competitors}, and unregister all already registered - * competitors not in {@code competitors}. - */ - void registerCompetitors(RacingEventService service, RegattaLog regattaLog, Set competitors); - /** * Invite competitors for tracking via the Tracking App by sending out emails. * @@ -120,11 +101,4 @@ public interface RaceLogTrackingAdapter { */ void copyCourse(RaceLog fromRaceLog, Set toRaceLogs, SharedDomainFactory baseDomainFactory, RacingEventService service); - - /** - * Duplicate the competitor registrations from the {@code from} race log to the {@code to} race logs. If a RaceLog - * is not set to use the CompetitorRegistrations on itself via {@link RaceLogUseCompetitorsFromRaceLogEvent}, - * the RaceLog is set to use its own by adding a {@link RaceLogUseCompetitorsFromRaceLogEventImpl} - */ - void copyCompetitors(RaceLog from, Set to, RacingEventService service); } diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java index 23d7c0c7869..58475166278 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java @@ -7,7 +7,6 @@ import java.util.List; import java.util.Locale; import java.util.Set; import java.util.UUID; -import java.util.function.Function; import java.util.logging.Level; import java.util.logging.Logger; @@ -34,18 +33,12 @@ import com.sap.sailing.domain.abstractlog.race.impl.RaceLogCourseDesignChangedEv import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer; -import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogUsesOwnCompetitorsAnalyzer; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDenoteForTrackingEventImpl; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogRegisterCompetitorEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogStartTrackingEventImpl; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogUseCompetitorsFromRaceLogEventImpl; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceMarkMappingEventImpl; -import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogRegisterCompetitorEventImpl; -import com.sap.sailing.domain.abstractlog.shared.analyzing.CompetitorsInLogAnalyzer; -import com.sap.sailing.domain.abstractlog.shared.events.RegisterCompetitorEvent; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseBase; @@ -60,7 +53,6 @@ import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.base.impl.CourseDataImpl; import com.sap.sailing.domain.common.RegattaIdentifier; import com.sap.sailing.domain.common.abstractlog.NotRevokableException; -import com.sap.sailing.domain.common.racelog.tracking.CompetitorRegistrationOnRaceLogDisabledException; import com.sap.sailing.domain.common.racelog.tracking.DeviceMappingConstants; import com.sap.sailing.domain.common.racelog.tracking.NotDenotableForRaceLogTrackingException; import com.sap.sailing.domain.common.racelog.tracking.NotDenotedForRaceLogTrackingException; @@ -238,22 +230,6 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter { } } - @Override - public void copyCompetitors(RaceLog fromRaceLog, Set toRaceLogs, - RacingEventService service) { - final Set competitors = new CompetitorsInLogAnalyzer<>(fromRaceLog).analyze(); - for (RaceLog toRaceLog : toRaceLogs) { - try { - registerCompetitors(service, toRaceLog, competitors); - } catch (CompetitorRegistrationOnRaceLogDisabledException e) { - int passId = toRaceLog.getCurrentPassId(); - TimePoint now = MillisecondsTimePoint.now(); - toRaceLog.add(new RaceLogUseCompetitorsFromRaceLogEventImpl(now, service.getServerAuthor(), now, UUID.randomUUID(), passId)); - try { registerCompetitors(service, toRaceLog, competitors); } catch (CompetitorRegistrationOnRaceLogDisabledException e1) {/*cannot happen*/} - } - } - } - @FunctionalInterface private static interface DeviceMarkMappingEventFactory> { EventT createDeviceMarkMapping(DeviceIdentifier device, TimePoint timePoint); @@ -297,64 +273,6 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter { } } - private , EventT extends AbstractLogEvent, VisitorT> void registerCompetitors( - AbstractLogEventAuthor author, LogT log, Set competitors, - Function registerEventFactory) { - Set alreadyRegistered = new HashSet(new CompetitorsInLogAnalyzer<>(log).analyze()); - Set toBeRegistered = new HashSet(); - - for (Competitor c : competitors) { - toBeRegistered.add(c); - } - - Set toBeRemoved = new HashSet(alreadyRegistered); - toBeRemoved.removeAll(toBeRegistered); - toBeRegistered.removeAll(alreadyRegistered); - - // register - for (Competitor c : toBeRegistered) { - log.add(registerEventFactory.apply(c)); - } - - // unregister - for (EventT event : log.getUnrevokedEventsDescending()) { - if (event instanceof RegisterCompetitorEvent) { - RegisterCompetitorEvent registerEvent = (RegisterCompetitorEvent) event; - if (toBeRemoved.contains(registerEvent.getCompetitor())) { - try { - log.revokeEvent(author, event, - "unregistering competitor because no longer selected for registration"); - } catch (NotRevokableException e) { - logger.log(Level.WARNING, "could not unregister competitor by adding RevokeEvent", e); - } - } - } - } - } - - @Override - public void registerCompetitors(RacingEventService service, RaceLog raceLog, Set competitors) throws CompetitorRegistrationOnRaceLogDisabledException { - if (new RaceLogUsesOwnCompetitorsAnalyzer(raceLog).analyze()){ - registerCompetitors( - service.getServerAuthor(), - raceLog, - competitors, - c -> new RaceLogRegisterCompetitorEventImpl(MillisecondsTimePoint.now(), - service.getServerAuthor(), raceLog.getCurrentPassId(), c)); - } else { - logger.warning("Not performing competitor registration on RaceLog as no RaceLogUseCompetitorsFromRaceLogEvent " - + "is present and therefore competitors should be registered on RegattaLog"); - throw new CompetitorRegistrationOnRaceLogDisabledException(); - } - } - - @Override - public void registerCompetitors(RacingEventService service, RegattaLog regattaLog, Set competitors) { - registerCompetitors(service.getServerAuthor(), regattaLog, competitors, - c -> new RegattaLogRegisterCompetitorEventImpl(MillisecondsTimePoint.now(), - MillisecondsTimePoint.now(), service.getServerAuthor(), UUID.randomUUID(), c)); - } - private MailService getMailService() { ServiceReference ref = Activator.getContext().getServiceReference(MailService.class); if (ref == null) { diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java index e663a5e5c1c..f2dd6734253 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java @@ -1,7 +1,6 @@ package com.sap.sailing.domain.test.mock; import java.io.Serializable; -import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.NavigableSet; @@ -499,7 +498,7 @@ public class MockedTrackedRace implements DynamicTrackedRace { } @Override - public void registerCompetitors(Collection competitor) { + public void registerCompetitors(Iterable competitor) { } @Override @@ -507,7 +506,7 @@ public class MockedTrackedRace implements DynamicTrackedRace { } @Override - public void deregisterCompetitors(Collection competitor) { + public void deregisterCompetitors(Iterable competitor) { } }; } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java index 1561e639c2c..7b8339dee10 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java @@ -1,7 +1,5 @@ package com.sap.sailing.domain.base; -import java.util.Collection; - import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.common.RaceIdentifier; @@ -281,6 +279,20 @@ public interface RaceColumn extends Named { */ boolean isCompetitorRegistrationInRacelogEnabled(Fleet fleet); + /** + * Activates competitor registration on the race column's race log associated to the passed fleet. + * Performs nothing in case this column belongs to a {@link MetaLeaderboard}. + * @param fleetByName + */ + void enableCompetitorRegistrationOnRaceLog(Fleet fleet); + + /** + * Disables competitor registration on the race column's race log associated to the passed fleet. + * Performs nothing in case this column belongs to a {@link MetaLeaderboard}. + * @param fleetByName + */ + void disableCompetitorRegistrationOnRaceLog(Fleet fleet); + /** * Registers a competitor on the the race column's race log associated to the passed fleet. * @param competitor @@ -289,7 +301,7 @@ public interface RaceColumn extends Named { * thrown if competitor registration is disabled on racelog as well as if RaceColumn belongs to a {@link MetaLeaderboard} */ void registerCompetitor(Competitor competitor, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException; - void registerCompetitors(Collection competitor, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException; + void registerCompetitors(Iterable competitor, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException; /** * Deregisters a competitor on the the race column's race log associated to the passed fleet. @@ -299,5 +311,5 @@ public interface RaceColumn extends Named { * thrown if competitor registration is disabled on racelog as well as if RaceColumn belongs to a {@link MetaLeaderboard} */ void deRegisterCompetitor(Competitor competitors, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException; - void deRegisterCompetitors(Collection competitors, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException; + void deRegisterCompetitors(Iterable currentlyRegisteredCompetitors, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException; } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java index 33a2f8b8e50..07535c65aeb 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java @@ -6,6 +6,7 @@ import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; @@ -14,12 +15,15 @@ import java.util.logging.Level; import java.util.logging.Logger; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.impl.AllEventsOfTypeFinder; import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.DefinedMarkFinder; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RegisteredCompetitorsAnalyzer; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogRegisterCompetitorEventImpl; +import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogUseCompetitorsFromRaceLogEventImpl; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.shared.events.RegisterCompetitorEvent; import com.sap.sailing.domain.base.Competitor; @@ -286,7 +290,7 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem } @Override - public void registerCompetitors(Collection competitors, Fleet fleet) + public void registerCompetitors(Iterable competitors, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException { if (isCompetitorRegistrationInRacelogEnabled(fleet)){ throw new CompetitorRegistrationOnRaceLogDisabledException(); @@ -308,17 +312,20 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem } @Override - public void deRegisterCompetitors(Collection competitors, Fleet fleet) + public void deRegisterCompetitors(Iterable competitors, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException { if (isCompetitorRegistrationInRacelogEnabled(fleet)){ throw new CompetitorRegistrationOnRaceLogDisabledException(); } + HashSet competitorSet = new HashSet(); + Util.addAll(competitors, competitorSet); + RaceLog raceLog = getRaceLog(fleet); for (RaceLogEvent event : raceLog.getUnrevokedEventsDescending()) { if (event instanceof RegisterCompetitorEvent) { RegisterCompetitorEvent registerEvent = (RegisterCompetitorEvent) event; - if (competitors.contains(registerEvent.getCompetitor())) { + if (competitorSet.contains(registerEvent.getCompetitor())) { try { raceLog.revokeEvent(raceLogEventAuthorForRaceColumn, event, "unregistering competitor because no longer selected for registration"); @@ -378,4 +385,33 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem } return result; } + + @Override + public void enableCompetitorRegistrationOnRaceLog(Fleet fleet) { + TimePoint now = MillisecondsTimePoint.now(); + RaceLog raceLog = getRaceLog(fleet); + int passId = raceLog.getCurrentPassId(); + raceLog.add(new RaceLogUseCompetitorsFromRaceLogEventImpl(now, raceLogEventAuthorForRaceColumn, now, UUID.randomUUID(), passId)); + } + + @Override + public void disableCompetitorRegistrationOnRaceLog(Fleet fleet) { + RaceLog raceLog = getRaceLog(fleet); + List events = new AllEventsOfTypeFinder<>(raceLog, true, RaceLogUseCompetitorsFromRaceLogEvent.class).analyze(); + for (RaceLogEvent event : events) { + raceLog.lockForRead(); + try { + event = raceLog.getEventById(event.getId()); + } finally { + raceLog.unlockAfterRead(); + } + if (event != null) { + try { + raceLog.revokeEvent(raceLogEventAuthorForRaceColumn, event, "revoke triggered by GWT user action"); + } catch (NotRevokableException e) { + logger.warning("Event could not be revoked"); + } + } + } + } } \ No newline at end of file diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java index fdc4323dd98..041bf146995 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java @@ -5,7 +5,6 @@ import java.io.ObjectInputStream; import java.io.ObjectStreamException; import java.io.Serializable; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.ConcurrentModificationException; import java.util.HashMap; @@ -759,7 +758,7 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene } @Override - public void registerCompetitors(Collection competitors) { + public void registerCompetitors(Iterable competitors) { RegattaLog regattaLog = getRegattaLike().getRegattaLog(); TimePoint now = MillisecondsTimePoint.now(); @@ -775,12 +774,14 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene } @Override - public void deregisterCompetitors(Collection competitors) { + public void deregisterCompetitors(Iterable competitors) { RegattaLog regattaLog = getRegattaLike().getRegattaLog(); + HashSet competitorSet = new HashSet(); + Util.addAll(competitors, competitorSet); for (RegattaLogEvent event : regattaLog.getUnrevokedEventsDescending()) { if (event instanceof RegisterCompetitorEvent) { RegisterCompetitorEvent registerEvent = (RegisterCompetitorEvent) event; - if (competitors.contains(registerEvent.getCompetitor())) { + if (competitorSet.contains(registerEvent.getCompetitor())) { try { regattaLog.revokeEvent(regattaLogEventAuthorForRegatta, event, "unregistering competitor because no longer selected for registration"); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java index 50974add064..e3b2d2631a7 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java @@ -1,6 +1,5 @@ package com.sap.sailing.domain.leaderboard.impl; -import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; @@ -30,6 +29,7 @@ import com.sap.sailing.domain.leaderboard.ScoreCorrection; import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sse.common.TimePoint; +import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; /** @@ -212,7 +212,7 @@ public abstract class AbstractLeaderboardImpl extends AbstractSimpleLeaderboardI } @Override - public void registerCompetitors(Collection competitors) { + public void registerCompetitors(Iterable competitors) { RegattaLog regattaLog = getRegattaLike().getRegattaLog(); TimePoint now = MillisecondsTimePoint.now(); @@ -228,12 +228,15 @@ public abstract class AbstractLeaderboardImpl extends AbstractSimpleLeaderboardI } @Override - public void deregisterCompetitors(Collection competitors) { + public void deregisterCompetitors(Iterable competitors) { RegattaLog regattaLog = getRegattaLike().getRegattaLog(); + HashSet competitorSet = new HashSet(); + Util.addAll(competitors, competitorSet); + for (RegattaLogEvent event : regattaLog.getUnrevokedEventsDescending()) { if (event instanceof RegisterCompetitorEvent) { RegisterCompetitorEvent registerEvent = (RegisterCompetitorEvent) event; - if (competitors.contains(registerEvent.getCompetitor())) { + if (competitorSet.contains(registerEvent.getCompetitor())) { try { regattaLog.revokeEvent(regattaLogEventAuthorForAbstraceLeaderboard, event, "unregistering competitor because no longer selected for registration"); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java index 217af722e3f..ed3d4009931 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java @@ -1,6 +1,5 @@ package com.sap.sailing.domain.leaderboard.meta; -import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Set; @@ -255,7 +254,7 @@ public class MetaLeaderboardColumn extends SimpleAbstractRaceColumn implements R } @Override - public void registerCompetitors(Collection competitor, Fleet fleet) + public void registerCompetitors(Iterable competitor, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException { throw new CompetitorRegistrationOnRaceLogDisabledException(); } @@ -267,8 +266,16 @@ public class MetaLeaderboardColumn extends SimpleAbstractRaceColumn implements R } @Override - public void deRegisterCompetitors(Collection competitors, Fleet fleet) + public void deRegisterCompetitors(Iterable competitors, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException { throw new CompetitorRegistrationOnRaceLogDisabledException(); } + + @Override + public void enableCompetitorRegistrationOnRaceLog(Fleet fleetByName) { + } + + @Override + public void disableCompetitorRegistrationOnRaceLog(Fleet fleetByName) { + } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/HasRegattaLike.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/HasRegattaLike.java index 79a010a11b0..4f0cdcd6adb 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/HasRegattaLike.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/HasRegattaLike.java @@ -1,7 +1,5 @@ package com.sap.sailing.domain.regattalike; -import java.util.Collection; - import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Regatta; @@ -22,8 +20,8 @@ public interface HasRegattaLike { Iterable getCompetitorsRegisteredInRegattaLog(); void registerCompetitor(Competitor competitor); - void registerCompetitors(Collection competitor); + void registerCompetitors(Iterable competitor); void deregisterCompetitor(Competitor competitor); - void deregisterCompetitors(Collection competitor); + void deregisterCompetitors(Iterable competitor); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java index 4b329c26649..8eb707b9b9f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java @@ -92,7 +92,7 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis @Override public void ok(Void editedObject) { if (competitorRegistrationInRaceLogCheckBox.getValue()) { - sailingService.activateCompetitorRegistrationsForRace(leaderboardName, + sailingService.enableCompetitorRegistrationsForRace(leaderboardName, raceColumnName, fleetName, new AsyncCallback() { @Override public void onSuccess(Void isEnabled) { @@ -110,7 +110,7 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis }); } else { - sailingService.deactivateCompetitorRegistrationsForRace(leaderboardName, + sailingService.disableCompetitorRegistrationsForRace(leaderboardName, raceColumnName, fleetName, new AsyncCallback() { @Override public void onSuccess(Void isEnabled) { 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 36485f872cf..f8ec87c13ae 100755 --- 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 @@ -526,7 +526,7 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS Date dateOfMarkPassing, CompetitorDTO competitorDTO); void setCompetitorRegistrationsInRegattaLog(String leaderboardName, Set competitors) - throws DoesNotHaveRegattaLogException; + throws DoesNotHaveRegattaLogException, NotFoundException; /** * A leaderboard may be situated under multiple events (connected via a leaderboardgroup). @@ -606,9 +606,9 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS Boolean areCompetitorRegistrationsEnabledForRace(String leaderboardName, String raceColumnName, String fleetName) throws NotFoundException; - void deactivateCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName) throws NotRevokableException, NotFoundException; + void disableCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName) throws NotRevokableException, NotFoundException; - void activateCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName) throws IllegalArgumentException, NotFoundException; + void enableCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName) throws IllegalArgumentException, NotFoundException; Pair checkIfMarksAreUsedInOtherRaceLogs(String leaderboardName, String raceColumnName, String fleetName, Set marksToRemove) throws NotFoundException; 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 c2cfd2ce9e9..a311828524b 100755 --- 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 @@ -740,10 +740,10 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan void areCompetitorRegistrationsEnabledForRace(String leaderboardName, String raceColumnName, String fleetName, AsyncCallback asyncCallback); - void deactivateCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName, + void disableCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName, AsyncCallback asyncCallback); - void activateCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName, + void enableCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName, AsyncCallback asyncCallback); void checkIfMarksAreUsedInOtherRaceLogs(String leaderboardName, String raceColumnName, String fleetName, 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 6eb2656baef..531b815ed21 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 @@ -81,9 +81,7 @@ import com.sap.sailing.domain.abstractlog.race.state.impl.ReadonlyRaceStateImpl; import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.FlagPoleState; import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.ReadonlyGateStartRacingProcedure; import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.ReadonlyRRS26RacingProcedure; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogUseCompetitorsFromRaceLogEventImpl; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogCloseOpenEndedDeviceMappingEvent; @@ -5035,25 +5033,54 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S @Override public void setCompetitorRegistrationsInRaceLog(String leaderboardName, String raceColumnName, String fleetName, Set competitorDTOs) throws CompetitorRegistrationOnRaceLogDisabledException, NotFoundException { - RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); - Set competitors = new HashSet(); + Set competitorsToRegister = new HashSet(); for (CompetitorDTO dto : competitorDTOs) { - competitors.add(getCompetitor(dto)); + competitorsToRegister.add(getCompetitor(dto)); } - getRaceLogTrackingAdapter().registerCompetitors(getService(), raceLog, competitors); + RaceColumn raceColumn = getRaceColumn(leaderboardName, raceColumnName); + Fleet fleet = getFleetByName(raceColumn, fleetName); + Iterable competitorsToRemove = raceColumn.getAllCompetitors(fleet); + HashSet competitorSetToRemove = new HashSet<>(); + Util.addAll(competitorsToRemove, competitorSetToRemove); + filterDuplicates(competitorsToRegister, competitorSetToRemove); + + raceColumn.deRegisterCompetitors(competitorSetToRemove, fleet); + raceColumn.registerCompetitors(competitorsToRegister, fleet); } @Override public void setCompetitorRegistrationsInRegattaLog(String leaderboardName, Set competitorDTOs) - throws DoesNotHaveRegattaLogException { - RegattaLog regattaLog = getRegattaLogInternal(leaderboardName); - Set competitors = new HashSet(); - for (CompetitorDTO dto : competitorDTOs) { - competitors.add(getCompetitor(dto)); + throws DoesNotHaveRegattaLogException, NotFoundException { + Leaderboard leaderboard = getLeaderboardByName(leaderboardName); + if (!(leaderboard instanceof HasRegattaLike)){ + throw new DoesNotHaveRegattaLogException(); } - getRaceLogTrackingAdapter().registerCompetitors(getService(), regattaLog, competitors); + Set competitorsToRegister = new HashSet(); + for (CompetitorDTO dto : competitorDTOs) { + competitorsToRegister.add(getCompetitor(dto)); + } + + HasRegattaLike hasRegattaLike = (HasRegattaLike) leaderboard; + Iterable competitorsToRemove = leaderboard.getAllCompetitors(); + HashSet competitorSetToRemove = new HashSet<>(); + Util.addAll(competitorsToRemove, competitorSetToRemove); + filterDuplicates(competitorsToRegister, competitorSetToRemove); + + hasRegattaLike.deregisterCompetitors(competitorSetToRemove); + hasRegattaLike.registerCompetitors(competitorsToRegister); + } + + private HashSet filterDuplicates(Set competitorsToRegister, + HashSet competitorSetToRemove) { + for (Competitor competitor : competitorSetToRemove) { + if (competitorsToRegister.contains(competitor)){ + competitorsToRegister.remove(competitor); + competitorSetToRemove.remove(competitor); + } + } + return competitorSetToRemove; } private Mark convertToMark(MarkDTO dto, boolean resolve) { @@ -5219,12 +5246,22 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S @Override public void copyCompetitorsToOtherRaceLogs(com.sap.sse.common.Util.Triple fromTriple, Set> toTriples) throws NotFoundException { - RaceLog fromRaceLog = getRaceLog(fromTriple); - Set toRaceLogs = new HashSet<>(); + RaceColumn raceColumn = getRaceColumn(fromTriple.getA(), fromTriple.getB()); + Iterable competitorsToCopy = raceColumn.getAllCompetitors(getFleetByName(raceColumn, fromTriple.getC())); + for (com.sap.sse.common.Util.Triple toTriple : toTriples) { - toRaceLogs.add(getRaceLog(toTriple)); + RaceColumn toRaceColumn = getRaceColumn(toTriple.getA(), toTriple.getB()); + try { + toRaceColumn.registerCompetitors(competitorsToCopy, getFleetByName(toRaceColumn, toTriple.getC())); + } catch (CompetitorRegistrationOnRaceLogDisabledException e){ + toRaceColumn.enableCompetitorRegistrationOnRaceLog(getFleetByName(toRaceColumn, toTriple.getC())); + try { + toRaceColumn.registerCompetitors(competitorsToCopy, getFleetByName(toRaceColumn, toTriple.getC())); + } catch (CompetitorRegistrationOnRaceLogDisabledException e1) { + //cannot happen + } + } } - getRaceLogTrackingAdapter().copyCompetitors(fromRaceLog, toRaceLogs, getService()); } private TypeBasedServiceFinder getDeviceIdentifierStringSerializerHandlerFinder( @@ -5288,7 +5325,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S result.add(raceLog); } - Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName); + Leaderboard leaderboard = getLeaderboardByName(leaderboardName); if (leaderboard instanceof HasRegattaLike) { result.add(((HasRegattaLike) leaderboard).getRegattaLike().getRegattaLog()); } @@ -5468,7 +5505,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S @Override public void startRaceLogTracking(String leaderboardName, String raceColumnName, String fleetName, final boolean trackWind, final boolean correctWindByDeclination) throws NotDenotedForRaceLogTrackingException, Exception { - Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName); + Leaderboard leaderboard = getLeaderboardByName(leaderboardName); RaceColumn raceColumn = leaderboard.getRaceColumnByName(raceColumnName); Fleet fleet = raceColumn.getFleetByName(fleetName); final RaceHandle raceHandle = getRaceLogTrackingAdapter().startTracking(getService(), leaderboard, raceColumn, fleet); @@ -5959,25 +5996,18 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S } @Override - public void deactivateCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName) throws NotRevokableException, NotFoundException { + public void disableCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName) throws NotRevokableException, NotFoundException { if (areCompetitorRegistrationsEnabledForRace(leaderboardName, raceColumnName, fleetName)){ - RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); - - List events = new AllEventsOfTypeFinder<>(raceLog, true, RaceLogUseCompetitorsFromRaceLogEvent.class).analyze(); - for (RaceLogEvent event : events) { - revokeEvent(false, event.getId(), raceLog); - } + RaceColumn raceColumn = getRaceColumn(leaderboardName, raceColumnName); + raceColumn.disableCompetitorRegistrationOnRaceLog(getFleetByName(raceColumn, fleetName)); } } @Override - public void activateCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName) throws IllegalArgumentException, NotFoundException { + public void enableCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName) throws IllegalArgumentException, NotFoundException { if (!areCompetitorRegistrationsEnabledForRace(leaderboardName, raceColumnName, fleetName)){ - RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); - int passId = raceLog.getCurrentPassId(); - RaceLogUseCompetitorsFromRaceLogEvent event = new RaceLogUseCompetitorsFromRaceLogEventImpl(MillisecondsTimePoint.now(), - getService().getServerAuthor(), MillisecondsTimePoint.now(), UUID.randomUUID(), passId); - raceLog.add(event); + RaceColumn raceColumn = getRaceColumn(leaderboardName, raceColumnName); + raceColumn.enableCompetitorRegistrationOnRaceLog(getFleetByName(raceColumn, fleetName)); } } From 1fab143dcd8a06a5a60228a635c8aaef4c1d5237 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Sat, 28 Nov 2015 21:19:21 +0100 Subject: [PATCH 040/165] Fix gwt compile error execption implements Serializable --- .../sap/sailing/gwt/ui/client/SailingService.java | 2 +- .../sailing/gwt/ui/server/NotFoundException.java | 15 +++++++++++++++ .../sailing/gwt/ui/server/SailingServiceImpl.java | 1 - .../ui/server/exceptions/NotFoundException.java | 10 ---------- 4 files changed, 16 insertions(+), 12 deletions(-) create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/NotFoundException.java delete mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/exceptions/NotFoundException.java 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 f8ec87c13ae..9a71dcae094 100755 --- 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 @@ -45,7 +45,7 @@ import com.sap.sailing.domain.racelog.tracking.GPSFixStore; import com.sap.sailing.domain.racelogtracking.RaceLogTrackingAdapter; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.gwt.ui.adminconsole.RaceLogSetTrackingTimesDTO; -import com.sap.sailing.gwt.ui.server.exceptions.NotFoundException; +import com.sap.sailing.gwt.ui.server.NotFoundException; import com.sap.sailing.gwt.ui.shared.BulkScoreCorrectionDTO; import com.sap.sailing.gwt.ui.shared.CompactRaceMapDataDTO; import com.sap.sailing.gwt.ui.shared.CompetitorsRaceDataDTO; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/NotFoundException.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/NotFoundException.java new file mode 100644 index 00000000000..4a42cf23f48 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/NotFoundException.java @@ -0,0 +1,15 @@ +package com.sap.sailing.gwt.ui.server; + +import java.io.Serializable; + +public class NotFoundException extends Exception implements Serializable{ + + private static final long serialVersionUID = 1690510580423647161L; + + public NotFoundException() { + } + + public NotFoundException(String message) { + super(message); + } +} 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 531b815ed21..dd2a46184a3 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 @@ -285,7 +285,6 @@ import com.sap.sailing.domain.tractracadapter.TracTracConfiguration; import com.sap.sailing.domain.tractracadapter.TracTracConnectionConstants; import com.sap.sailing.gwt.ui.adminconsole.RaceLogSetTrackingTimesDTO; import com.sap.sailing.gwt.ui.client.SailingService; -import com.sap.sailing.gwt.ui.server.exceptions.NotFoundException; import com.sap.sailing.gwt.ui.shared.BulkScoreCorrectionDTO; import com.sap.sailing.gwt.ui.shared.CompactRaceMapDataDTO; import com.sap.sailing.gwt.ui.shared.CompetitorRaceDataDTO; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/exceptions/NotFoundException.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/exceptions/NotFoundException.java deleted file mode 100644 index 55feda843d9..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/exceptions/NotFoundException.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.sap.sailing.gwt.ui.server.exceptions; - -public class NotFoundException extends Exception{ - - private static final long serialVersionUID = 1690510580423647161L; - - public NotFoundException(String message) { - super(message); - } -} From 8b9e31d2a5195202b9c03d98f84dd7885c035d17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Sun, 29 Nov 2015 09:15:42 +0100 Subject: [PATCH 041/165] Don't register competitor when creating mapping and competitor is not registered --- .../server/gateway/jaxrs/api/LeaderboardsResource.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java index 2bbc6d03c05..da88819088c 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java @@ -404,11 +404,12 @@ public class LeaderboardsResource extends AbstractSailingServerResource { return Response.status(Status.BAD_REQUEST).entity("No competitor found for id " + competitorId) .type(MediaType.TEXT_PLAIN).build(); } - // add registration if necessary + Set registered = (Set) hasRegattaLike.getCompetitorsRegisteredInRegattaLog(); if (!registered.contains(mappedTo)) { - hasRegattaLike.getRegattaLike().getRegattaLog().add( - new RegattaLogRegisterCompetitorEventImpl(now, now, author, UUID.randomUUID(), mappedTo)); + logger.warning("Competitor found but not registered on a race of " + leaderboardName); + return Response.status(Status.BAD_REQUEST).entity("Competitor found but not registered on a race of " + leaderboardName) + .type(MediaType.TEXT_PLAIN).build(); } DeviceIdentifier device = new SmartphoneUUIDIdentifierImpl(UUID.fromString(deviceUuid)); TimePoint from = new MillisecondsTimePoint(fromMillis); From dfd6ed63b082b561d5cb6e24f9a91016d36337de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Sun, 29 Nov 2015 09:22:17 +0100 Subject: [PATCH 042/165] Make mark accessible to RaceLogDefineMarkEvent for recently introduced getShortInfo method --- .../shared/events/impl/AbstractDefineMarkEventImpl.java | 2 +- .../sailing/server/gateway/jaxrs/api/LeaderboardsResource.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/impl/AbstractDefineMarkEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/impl/AbstractDefineMarkEventImpl.java index 27016aa26d8..e03f7c5e960 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/impl/AbstractDefineMarkEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/impl/AbstractDefineMarkEventImpl.java @@ -13,7 +13,7 @@ DefineMarkEvent { private static final long serialVersionUID = 5865183507521850320L; - private final Mark mark; + protected final Mark mark; public AbstractDefineMarkEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, Mark mark) { diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java index da88819088c..23f35b4432b 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java @@ -40,7 +40,6 @@ import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.DefinedMa import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogCloseOpenEndedDeviceMappingEventImpl; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceCompetitorMappingEventImpl; -import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogRegisterCompetitorEventImpl; import com.sap.sailing.domain.abstractlog.regatta.impl.OpenEndedDeviceMappingFinder; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.DomainFactory; From a07783d65bdf3089ef4e20e64ba502ea7f41a7ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Sun, 29 Nov 2015 10:42:58 +0100 Subject: [PATCH 043/165] Move NotFoundException to domain.common package (fixes gwt build) --- .../src/com/sap/sailing/domain/common}/NotFoundException.java | 2 +- .../main/java/com/sap/sailing/gwt/ui/client/SailingService.java | 2 +- .../java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) rename java/{com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server => com.sap.sailing.domain.common/src/com/sap/sailing/domain/common}/NotFoundException.java (88%) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/NotFoundException.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/NotFoundException.java similarity index 88% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/NotFoundException.java rename to java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/NotFoundException.java index 4a42cf23f48..86873bb52f3 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/NotFoundException.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/NotFoundException.java @@ -1,4 +1,4 @@ -package com.sap.sailing.gwt.ui.server; +package com.sap.sailing.domain.common; import java.io.Serializable; 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 9a71dcae094..65a23f440bd 100755 --- 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 @@ -17,6 +17,7 @@ import com.sap.sailing.domain.common.LeaderboardType; import com.sap.sailing.domain.common.LegIdentifier; import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.NoWindException; +import com.sap.sailing.domain.common.NotFoundException; import com.sap.sailing.domain.common.PassingInstruction; import com.sap.sailing.domain.common.PolarSheetsXYDiagramData; import com.sap.sailing.domain.common.Position; @@ -45,7 +46,6 @@ import com.sap.sailing.domain.racelog.tracking.GPSFixStore; import com.sap.sailing.domain.racelogtracking.RaceLogTrackingAdapter; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.gwt.ui.adminconsole.RaceLogSetTrackingTimesDTO; -import com.sap.sailing.gwt.ui.server.NotFoundException; import com.sap.sailing.gwt.ui.shared.BulkScoreCorrectionDTO; import com.sap.sailing.gwt.ui.shared.CompactRaceMapDataDTO; import com.sap.sailing.gwt.ui.shared.CompetitorsRaceDataDTO; 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 dd2a46184a3..2c7a3374d9c 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 @@ -154,6 +154,7 @@ import com.sap.sailing.domain.common.LegType; import com.sap.sailing.domain.common.ManeuverType; import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.NoWindException; +import com.sap.sailing.domain.common.NotFoundException; import com.sap.sailing.domain.common.PassingInstruction; import com.sap.sailing.domain.common.PolarSheetsXYDiagramData; import com.sap.sailing.domain.common.Position; From 339f73245761d6306d9541c0027418df93264d07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Sun, 29 Nov 2015 10:44:52 +0100 Subject: [PATCH 044/165] Fixes LeaderboardsResourceCheckinAndCheckoutTestCase --- .../test/jaxrs/LeaderboardsResourceCheckinAndOutTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourceCheckinAndOutTest.java b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourceCheckinAndOutTest.java index e07c1c1946c..c6b8224805a 100644 --- a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourceCheckinAndOutTest.java +++ b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourceCheckinAndOutTest.java @@ -54,7 +54,7 @@ public class LeaderboardsResourceCheckinAndOutTest extends AbstractJaxRsApiTest new HighPoint(), 0, null, OneDesignRankingMetric::new); racingEventService.addRegattaWithoutReplication(regatta); leaderboard = racingEventService.addRegattaLeaderboard(regatta.getRegattaIdentifier(), "regatta", new int[] {}); - + regatta.registerCompetitor(competitor); log = leaderboard.getRegattaLike().getRegattaLog(); } From 7f49b0d44af2c368c42e92cd044c917afa85c1f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Fri, 4 Dec 2015 08:30:35 +0100 Subject: [PATCH 045/165] Fixes no ClassDefFoundError as guava not used --- .../gwt/ui/server/SailingServiceImpl.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) 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 2c7a3374d9c..5360ddb2bf4 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 @@ -2412,7 +2412,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S boolean raceLogTrackerExists = raceLog == null ? false : getService().getRaceTrackerById(raceLog.getId()) != null; boolean competitorRegistrationsExist; - competitorRegistrationsExist = raceLog == null ? false : Iterables.size(raceColumn.getAllCompetitors(fleet)) > 0 ; + competitorRegistrationsExist = raceLog == null ? false : sizeOf(raceColumn.getAllCompetitors(fleet)) > 0 ; RaceLogTrackingInfoDTO raceLogTrackingInfo = new RaceLogTrackingInfoDTO(raceLogTrackerExists, competitorRegistrationsExist, raceLogTrackingState); @@ -2422,6 +2422,20 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S return leaderboardDTO; } + private int sizeOf(Iterable values) { + if (values instanceof Collection) { + return ((Collection)values).size(); + } else { + Iterator it = values.iterator(); + int sum = 0; + while (it.hasNext()) { + it.next(); + sum++; + } + return sum; + } + } + @Override public StrippedLeaderboardDTO updateLeaderboard(String leaderboardName, String newLeaderboardName, String newLeaderboardDisplayName, int[] newDiscardingThresholds, UUID newCourseAreaId) { Leaderboard updatedLeaderboard = getService().apply(new UpdateLeaderboard(leaderboardName, newLeaderboardName, newLeaderboardDisplayName, newDiscardingThresholds, newCourseAreaId)); From c041223e24017f36875e64c4ad397c3da92aae70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Fri, 4 Dec 2015 11:09:45 +0100 Subject: [PATCH 046/165] Allow to denote flexible leaderboard for tracking --- .../impl/RaceLogTrackingAdapterImpl.java | 56 +++++++++++++++++-- .../gwt/ui/server/SailingServiceImpl.java | 1 - 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java index 58475166278..0da293b8a2d 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java @@ -2,9 +2,13 @@ package com.sap.sailing.domain.racelogtracking.impl; import java.io.IOException; import java.io.InputStream; +import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Locale; +import java.util.Map.Entry; import java.util.Set; import java.util.UUID; import java.util.logging.Level; @@ -60,7 +64,6 @@ import com.sap.sailing.domain.common.racelog.tracking.RaceLogRaceTrackerExistsEx import com.sap.sailing.domain.common.racelog.tracking.RaceLogTrackingState; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; import com.sap.sailing.domain.common.tracking.GPSFix; -import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.RegattaLeaderboard; import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; @@ -140,8 +143,16 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter { RegattaLeaderboard rLeaderboard = (RegattaLeaderboard) leaderboard; boatClass = rLeaderboard.getRegatta().getBoatClass(); } else { - throw new NotDenotableForRaceLogTrackingException( - "Can only denote races in RegattaLeaderboards for RaceLog-tracking"); + if (sizeOf(raceColumn.getAllCompetitors(fleet)) > 0){ + boatClass = findDominatingBoatClass(raceColumn.getAllCompetitors(fleet)); + } else if (sizeOf(raceColumn.getAllCompetitors()) > 0){ + boatClass = findDominatingBoatClass(raceColumn.getAllCompetitors()); + } else if (sizeOf(leaderboard.getAllCompetitors()) > 0){ + boatClass = findDominatingBoatClass(leaderboard.getAllCompetitors()); + } else { + throw new NotDenotableForRaceLogTrackingException("Couldn't infer boat class, no competitors on race and leaderboard"); + } + } if (raceName == null) { @@ -159,13 +170,46 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter { service.getServerAuthor(), raceLog.getCurrentPassId(), raceName, boatClass, UUID.randomUUID()); raceLog.add(event); } + + private int sizeOf(Iterable values) { + if (values instanceof Collection) { + return ((Collection)values).size(); + } else { + Iterator it = values.iterator(); + int sum = 0; + while (it.hasNext()) { + it.next(); + sum++; + } + return sum; + } + } + + //implemented somewhere in domainFactory? + private BoatClass findDominatingBoatClass(Iterable allCompetitors) { + HashMap occurenceCount = new HashMap<>(); + for (Competitor competitor : allCompetitors) { + BoatClass boatclass = competitor.getBoat().getBoatClass(); + if (occurenceCount.containsKey(boatclass) ) { + int value = occurenceCount.get(boatclass); + occurenceCount.put(boatclass, value + 1); + } else { + occurenceCount.put(boatclass, 1); + } + } + + Entry mostFrequentEntry = occurenceCount.entrySet().iterator().next(); + for (Entry entry : occurenceCount.entrySet()) { + if (mostFrequentEntry.getValue() < entry.getValue()){ + mostFrequentEntry = entry; + } + } + return mostFrequentEntry.getKey(); + } @Override public void denoteAllRacesForRaceLogTracking(final RacingEventService service, final Leaderboard leaderboard) throws NotDenotableForRaceLogTrackingException { - if (leaderboard instanceof FlexibleLeaderboard) { - throw new NotDenotableForRaceLogTrackingException("Can only use regatta leaderboards for RaceLog-tracking"); - } for (RaceColumn column : leaderboard.getRaceColumns()) { for (Fleet fleet : column.getFleets()) { try { 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 5360ddb2bf4..30dce0625b3 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 @@ -56,7 +56,6 @@ import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceReference; import org.osgi.util.tracker.ServiceTracker; -import com.google.gwt.thirdparty.guava.common.collect.Iterables; import com.sap.sailing.domain.abstractlog.AbstractLog; import com.sap.sailing.domain.abstractlog.AbstractLogEvent; import com.sap.sailing.domain.abstractlog.MultiLogAnalyzer; From 244640da519a15bb578856032ee7c64cd827c56b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Fri, 4 Dec 2015 12:35:27 +0100 Subject: [PATCH 047/165] Refrain from direct access to GPSFixStore --- .../server/impl/RacingEventServiceImpl.java | 32 +++---------------- 1 file changed, 5 insertions(+), 27 deletions(-) diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java index 3fecb73db30..54db77441ce 100644 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java @@ -46,7 +46,6 @@ import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; import org.osgi.util.tracker.ServiceTracker; -import com.sap.sailing.domain.abstractlog.AbstractLog; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; import com.sap.sailing.domain.abstractlog.race.RaceLog; @@ -159,7 +158,6 @@ import com.sap.sailing.domain.tracking.WindStore; import com.sap.sailing.domain.tracking.WindTracker; import com.sap.sailing.domain.tracking.WindTrackerFactory; import com.sap.sailing.domain.tracking.impl.AbstractRaceChangeListener; -import com.sap.sailing.domain.tracking.impl.DynamicGPSFixTrackImpl; import com.sap.sailing.domain.tracking.impl.DynamicTrackedRegattaImpl; import com.sap.sailing.domain.tracking.impl.TrackedRaceImpl; import com.sap.sailing.expeditionconnector.ExpeditionWindTrackerFactory; @@ -1074,31 +1072,11 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes } } } - if (track == null) { // no spanning track found in any tracked race, or no tracked races found - // try to load from store - DynamicGPSFixTrackImpl loadedTrack = new DynamicGPSFixTrackImpl(mark, 0); - track = loadedTrack; - Set> logs = new HashSet<>(); - logs.add(leaderboard.getRegattaLike().getRegattaLog()); - if (raceLog == null) { // no race log explicitly provided --> use all race logs - for (RaceColumn raceColumn : leaderboard.getRaceColumns()) { - for (Fleet fleet : raceColumn.getFleets()) { - logs.add(raceColumn.getRaceLog(fleet)); - } - } - } else { - logs.add(raceLog); - } - for (AbstractLog log : logs) { - try { - getGPSFixStore().loadMarkTrack(loadedTrack, log, mark); - } catch (Exception e) { - logger.log(Level.WARNING, "Couldn't load mark track for mark " + mark + " from log " + log, e); - } - } - } - Position result = track.getEstimatedPosition(timePoint, /* extrapolate */ false); - if (result == null) { + + Position result; + if (track != null){ + result = track.getEstimatedPosition(timePoint, /* extrapolate */ false); + } else { result = nonSpanningFallback == null ? null : nonSpanningFallback.getPosition(); } return result; From aecbe0ed61871ab7598b4783e04293dc01845898 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Fri, 4 Dec 2015 12:39:38 +0100 Subject: [PATCH 048/165] Fixes ConcurrentModificationException --- .../com/sap/sailing/gwt/ui/server/SailingServiceImpl.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) 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 30dce0625b3..e275bdc649e 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 @@ -5053,7 +5053,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S RaceColumn raceColumn = getRaceColumn(leaderboardName, raceColumnName); Fleet fleet = getFleetByName(raceColumn, fleetName); - Iterable competitorsToRemove = raceColumn.getAllCompetitors(fleet); + Iterable competitorsToRemove = raceColumn.getCompetitorsRegisteredInRacelog(fleet); HashSet competitorSetToRemove = new HashSet<>(); Util.addAll(competitorsToRemove, competitorSetToRemove); filterDuplicates(competitorsToRegister, competitorSetToRemove); @@ -5087,10 +5087,12 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S private HashSet filterDuplicates(Set competitorsToRegister, HashSet competitorSetToRemove) { - for (Competitor competitor : competitorSetToRemove) { + + for (Iterator iterator = competitorSetToRemove.iterator(); iterator.hasNext();) { + Competitor competitor = iterator.next(); if (competitorsToRegister.contains(competitor)){ competitorsToRegister.remove(competitor); - competitorSetToRemove.remove(competitor); + iterator.remove(); } } return competitorSetToRemove; From 337413ed3beaa58e50d6c4913722f1ad54d9f67d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Sat, 5 Dec 2015 11:48:27 +0100 Subject: [PATCH 049/165] Several fixes to the RaceLogCompetitorRegistrationDialog --- .../AbstractCompetitorRegistrationsDialog.java | 1 + .../RaceLogCompetitorRegistrationDialog.java | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java index a712de2a909..41e9b8b3216 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java @@ -218,6 +218,7 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia protected void refreshCompetitors() { registeredCompetitorsTable.getDataProvider().getList().clear(); + allCompetitorsTable.getDataProvider().getList().clear(); setRegisterableCompetitors(); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java index 8eb707b9b9f..5e638aee27e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java @@ -1,6 +1,7 @@ package com.sap.sailing.gwt.ui.adminconsole; import java.util.Collection; +import java.util.HashSet; import java.util.Set; import com.google.gwt.core.client.Callback; @@ -98,7 +99,7 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis public void onSuccess(Void isEnabled) { competitorRegistrationInRaceLogCheckBox.setValue(true); activateRegistrationButtons(); - setRegisteredCompetitors(); + refreshCompetitors(); } @Override @@ -117,7 +118,7 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis competitorRegistrationInRaceLogCheckBox.setValue(false); deactivateRegistrationButtons(stringMessages .competitorRegistrationsOnRaceDisabled()); - setRegisteredCompetitors(); + refreshCompetitors(); } @Override @@ -156,4 +157,13 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis } }); } + + @Override + protected Set getResult() { + if (competitorRegistrationInRaceLogCheckBox.getValue()) { + return super.getResult(); + } else { + return new HashSet(); + } + } } From 2119dfb892fc829e6547712ba9c41909536d1085 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Sat, 5 Dec 2015 15:08:49 +0100 Subject: [PATCH 050/165] Add option to display only competitors of logs --- .../domain/base/impl/AbstractRaceColumn.java | 4 +- ...AbstractCompetitorRegistrationsDialog.java | 23 ++++- .../RaceLogCompetitorRegistrationDialog.java | 92 ++++++++++++++----- ...egattaLogCompetitorRegistrationDialog.java | 48 +++++++--- .../sailing/gwt/ui/client/SailingService.java | 5 + .../gwt/ui/client/SailingServiceAsync.java | 6 ++ .../sailing/gwt/ui/client/StringMessages.java | 2 + .../gwt/ui/client/StringMessages.properties | 1 + .../ui/client/StringMessages_de.properties | 1 + .../gwt/ui/server/SailingServiceImpl.java | 16 ++++ 10 files changed, 155 insertions(+), 43 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java index 07535c65aeb..f9edc1b98cb 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java @@ -292,7 +292,7 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem @Override public void registerCompetitors(Iterable competitors, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException { - if (isCompetitorRegistrationInRacelogEnabled(fleet)){ + if (!isCompetitorRegistrationInRacelogEnabled(fleet)){ throw new CompetitorRegistrationOnRaceLogDisabledException(); } @@ -314,7 +314,7 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem @Override public void deRegisterCompetitors(Iterable competitors, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException { - if (isCompetitorRegistrationInRacelogEnabled(fleet)){ + if (!isCompetitorRegistrationInRacelogEnabled(fleet)){ throw new CompetitorRegistrationOnRaceLogDisabledException(); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java index 41e9b8b3216..bdba2f09ad1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java @@ -11,6 +11,7 @@ import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.CaptionPanel; +import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HasVerticalAlignment; import com.google.gwt.user.client.ui.HorizontalPanel; @@ -35,6 +36,7 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia private boolean editable; private Button registerBtn; private Button unregisterBtn; + private CheckBox showOnlyCompetitorsOfLogCheckBox; private String boatClass; @@ -124,15 +126,30 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia competitorRegistrationPanel.setCellVerticalAlignment(movePanel, HasVerticalAlignment.ALIGN_MIDDLE); competitorRegistrationPanel.add(allCompetitorsPanel); - refreshCompetitors(); + buttonPanel.add(addCompetitorButton); buttonPanel.add(editCompetitorButton); buttonPanel.add(inviteCompetitorsButton); mainPanel.add(buttonPanel); + showOnlyCompetitorsOfLogCheckBox = new CheckBox(stringMessages.showOnlyCompetitorsOfLog()); + showOnlyCompetitorsOfLogCheckBox.setValue(false); + + showOnlyCompetitorsOfLogCheckBox.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + refreshCompetitors(); + } + }); + + mainPanel.add(showOnlyCompetitorsOfLogCheckBox); + addAdditionalWidgets(mainPanel); mainPanel.add(competitorRegistrationPanel); + refreshCompetitors(); + return mainPanel; } @@ -179,6 +196,10 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia } }, boatClass).show(); } + + public boolean showOnlyCompetitorsOfLog(){ + return showOnlyCompetitorsOfLogCheckBox.getValue(); + } private void openEditCompetitorDialog() { // get currently selected competitor diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java index 5e638aee27e..0aab4871752 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java @@ -4,7 +4,6 @@ import java.util.Collection; import java.util.HashSet; import java.util.Set; -import com.google.gwt.core.client.Callback; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.rpc.AsyncCallback; @@ -22,8 +21,9 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis private String raceColumnName; private CheckBox competitorRegistrationInRaceLogCheckBox; - public RaceLogCompetitorRegistrationDialog(String boatClass, SailingServiceAsync sailingService, StringMessages stringMessages, - ErrorReporter errorReporter, boolean editable, String leaderboardName, String raceColumnName, String fleetName, + public RaceLogCompetitorRegistrationDialog(String boatClass, SailingServiceAsync sailingService, + StringMessages stringMessages, ErrorReporter errorReporter, boolean editable, String leaderboardName, + String raceColumnName, String fleetName, com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback> callback) { super(sailingService, stringMessages, errorReporter, editable, callback, leaderboardName, boatClass); this.raceColumnName = raceColumnName; @@ -34,19 +34,35 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis @Override protected void setRegisteredCompetitors() { - sailingService.getCompetitorRegistrationsForRace(leaderboardName, raceColumnName, fleetName, - new AsyncCallback>() { - @Override - public void onSuccess(Collection registeredCompetitors) { - move(allCompetitorsTable, registeredCompetitorsTable, registeredCompetitors); - } + if (showOnlyCompetitorsOfLog()) { + sailingService.getCompetitorRegistrationsInRaceLog(leaderboardName, raceColumnName, fleetName, + new AsyncCallback>() { + @Override + public void onSuccess(Collection registeredCompetitors) { + move(allCompetitorsTable, registeredCompetitorsTable, registeredCompetitors); + } - @Override - public void onFailure(Throwable reason) { - errorReporter.reportError("Could not load already registered competitors: " - + reason.getMessage()); - } - }); + @Override + public void onFailure(Throwable reason) { + errorReporter.reportError("Could not load already registered competitors: " + + reason.getMessage()); + } + }); + } else { + sailingService.getCompetitorRegistrationsForRace(leaderboardName, raceColumnName, fleetName, + new AsyncCallback>() { + @Override + public void onSuccess(Collection registeredCompetitors) { + move(allCompetitorsTable, registeredCompetitorsTable, registeredCompetitors); + } + + @Override + public void onFailure(Throwable reason) { + errorReporter.reportError("Could not load already registered competitors: " + + reason.getMessage()); + } + }); + } } @Override @@ -146,16 +162,42 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis @Override protected void setRegisterableCompetitors() { - allCompetitorsTable.refreshCompetitorList(leaderboardName, new Callback, Throwable>() { - @Override - public void onSuccess(Iterable result) { - setRegisteredCompetitors(); - } - - @Override - public void onFailure(Throwable reason) { - } - }); + if (showOnlyCompetitorsOfLog()) { + sailingService.getCompetitorRegistrationsInRegattaLog(leaderboardName, + new AsyncCallback>() { + + @Override + public void onSuccess(Collection competitors) { + allCompetitorsTable.refreshCompetitorList(competitors); + setRegisteredCompetitors(); + } + + @Override + public void onFailure(Throwable reason) { + errorReporter.reportError("Could not fetch competitor registrations in regattalog : " + + reason.getMessage()); + } + + }); + + } else { + sailingService.getCompetitorRegistrationsForLeaderboard(leaderboardName, + new AsyncCallback>() { + + @Override + public void onSuccess(Collection competitors) { + allCompetitorsTable.refreshCompetitorList(competitors); + setRegisteredCompetitors(); + } + + @Override + public void onFailure(Throwable reason) { + errorReporter.reportError("Could not fetch competitor registrations in regattalog : " + + reason.getMessage()); + } + + }); + } } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogCompetitorRegistrationDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogCompetitorRegistrationDialog.java index 712df2466da..b801e51903c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogCompetitorRegistrationDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogCompetitorRegistrationDialog.java @@ -13,27 +13,45 @@ import com.sap.sse.gwt.client.ErrorReporter; public class RegattaLogCompetitorRegistrationDialog extends AbstractCompetitorRegistrationsDialog { - public RegattaLogCompetitorRegistrationDialog(String boatClass, SailingServiceAsync sailingService, StringMessages stringMessages, - ErrorReporter errorReporter, boolean editable, String leaderboardName, + public RegattaLogCompetitorRegistrationDialog(String boatClass, SailingServiceAsync sailingService, + StringMessages stringMessages, ErrorReporter errorReporter, boolean editable, String leaderboardName, com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback> callback) { super(sailingService, stringMessages, errorReporter, editable, callback, leaderboardName, boatClass); } @Override protected void setRegisteredCompetitors() { - sailingService.getCompetitorRegistrationsInRegattaLog(leaderboardName, - new AsyncCallback>() { - @Override - public void onSuccess(Collection registeredCompetitors) { - move(allCompetitorsTable, registeredCompetitorsTable, registeredCompetitors); - } + if (showOnlyCompetitorsOfLog()) { + sailingService.getCompetitorRegistrationsInRegattaLog(leaderboardName, + new AsyncCallback>() { + @Override + public void onSuccess(Collection registeredCompetitors) { + move(allCompetitorsTable, registeredCompetitorsTable, registeredCompetitors); + } - @Override - public void onFailure(Throwable reason) { - errorReporter.reportError("Could not load already registered competitors: " - + reason.getMessage()); - } - }); + @Override + public void onFailure(Throwable reason) { + errorReporter.reportError("Could not load already registered competitors: " + + reason.getMessage()); + } + }); + + } else { + sailingService.getCompetitorRegistrationsForLeaderboard(leaderboardName, + new AsyncCallback>() { + @Override + public void onSuccess(Collection registeredCompetitors) { + move(allCompetitorsTable, registeredCompetitorsTable, registeredCompetitors); + } + + @Override + public void onFailure(Throwable reason) { + errorReporter.reportError("Could not load already registered competitors: " + + reason.getMessage()); + } + }); + + } } @Override @@ -47,7 +65,7 @@ public class RegattaLogCompetitorRegistrationDialog extends AbstractCompetitorRe public void onSuccess(Iterable result) { setRegisteredCompetitors(); } - + @Override public void onFailure(Throwable reason) { } 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 ff943c6cd9b..4f24de66ed7 100755 --- 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 @@ -613,4 +613,9 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS Pair checkIfMarksAreUsedInOtherRaceLogs(String leaderboardName, String raceColumnName, String fleetName, Set marksToRemove) throws NotFoundException; + + Collection getCompetitorRegistrationsInRaceLog(String leaderboardName, String raceColumnName, + String fleetName) throws NotFoundException; + + Collection getCompetitorRegistrationsForLeaderboard(String leaderboardName) throws NotFoundException; } 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 6ee7b1fea2b..293fcff46ec 100755 --- 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 @@ -749,4 +749,10 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan void checkIfMarksAreUsedInOtherRaceLogs(String leaderboardName, String raceColumnName, String fleetName, Set marksToRemove, AsyncCallback> asyncCallback); + + void getCompetitorRegistrationsInRaceLog(String leaderboardName, String raceColumnName, String fleetName, + AsyncCallback> callback); + + void getCompetitorRegistrationsForLeaderboard(String leaderboardName, + AsyncCallback> callback); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java index cbe797e4c66..f0342de4024 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java @@ -3,6 +3,7 @@ package com.sap.sailing.gwt.ui.client; import com.google.gwt.core.client.GWT; import com.google.gwt.i18n.client.LocalizableResource.DefaultLocale; import com.google.gwt.json.client.JSONValue; +import com.google.gwt.safehtml.shared.SafeHtml; import com.sap.sse.gwt.client.DefaultRule_0_1_2_n; import com.sap.sse.gwt.client.DefaultRule_0_1_n; import com.sap.sse.gwt.client.DefaultRule_1_0n; @@ -1455,4 +1456,5 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, c String errorTryingToCreateEmbeddedMap(String message); String transparentBufferLineOnHover(); String bufferLineStrokeWeight(); + String showOnlyCompetitorsOfLog(); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties index c9e69fc4d85..1af7e410846 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties @@ -1422,3 +1422,4 @@ couldNotObtainRace=Could not obtain a race with name {1} for fleet {2} for a reg errorTryingToCreateEmbeddedMap=Error trying to create the embedded map: {0} transparentBufferLineOnHover=Transparent buffer lines on hover of helplines bufferLineStrokeWeight=Buffer line stroke weight +showOnlyCompetitorsOfLog=Show only competitors registered in Log \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties index 3e64c4ec8ae..10231b560ac 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties @@ -1413,3 +1413,4 @@ couldNotObtainRace=Wettfahrt namens {1} für Gruppe {2} in einer Regatta names { errorTryingToCreateEmbeddedMap=Fehler beim Erstellen der eingebetteten Karte: {0} transparentBufferLineOnHover=Transparente Pufferlinien bei Maus über Hilfslinien bufferLineStrokeWeight=Linienbreite der Pufferlinien +showOnlyCompetitorsOfLog=Nur Teilnehmer aus Log anzeigen 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 1d9b96ff412..1bad69be7ce 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 @@ -5957,6 +5957,12 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S Fleet fleet = getFleetByName(raceColumn, fleetName); return convertToCompetitorDTOs(raceColumn.getAllCompetitors(fleet)); } + + @Override + public Collection getCompetitorRegistrationsForLeaderboard(String leaderboardName) throws NotFoundException { + Leaderboard leaderboard = getLeaderboardByName(leaderboardName); + return convertToCompetitorDTOs(leaderboard.getAllCompetitors()); + } @Override public Collection getCompetitorRegistrationsInRegattaLog(String leaderboardName) throws DoesNotHaveRegattaLogException, NotFoundException { @@ -5969,6 +5975,16 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S return convertToCompetitorDTOs(regattaLikeLeaderboard.getCompetitorsRegisteredInRegattaLog()); } + + @Override + public Collection getCompetitorRegistrationsInRaceLog(String leaderboardName, String raceColumnName, + String fleetName) throws NotFoundException { + + RaceColumn raceColumn = getRaceColumn(leaderboardName, raceColumnName); + Fleet fleet = getFleetByName(raceColumn, fleetName); + + return convertToCompetitorDTOs(raceColumn.getCompetitorsRegisteredInRacelog(fleet)); + } @Override public Boolean areCompetitorRegistrationsEnabledForRace(String leaderboardName, String raceColumnName, From 84c0e7e1fb068f3023652dd250e797ec44a00046 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Sun, 6 Dec 2015 12:03:34 +0100 Subject: [PATCH 051/165] Fixes bug that competitor registrations double when selecting and deselecting Register competitors on Race --- .../ui/adminconsole/AbstractCompetitorRegistrationsDialog.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java index bdba2f09ad1..5be3482a392 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java @@ -162,7 +162,7 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia newFromList.removeAll(toMove); from.getFilterField().updateAll(newFromList); List newToList = new ArrayList<>(); - Util.addAll(to.getFilterField().getAll(), newToList); + Util.addAll(to.getDataProvider().getList(), newToList); newToList.addAll(toMove); to.getFilterField().updateAll(newToList); } From 0378664357cde470f02220743f7b0a57901ef4b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Mon, 7 Dec 2015 14:18:31 +0100 Subject: [PATCH 052/165] Removes RaceLogDefineMarkEvent --- .../impl/DomainObjectFactoryImpl.java | 9 ---- .../impl/MongoObjectFactoryImpl.java | 17 ------- .../impl/MongoRaceLogStoreVisitor.java | 7 --- .../impl/RaceLogRaceTracker.java | 5 -- .../impl/RaceLogTrackingAdapterImpl.java | 18 ------- .../abstractlog/race/RaceLogEventVisitor.java | 3 -- .../impl/AbstractRaceLogChangedVisitor.java | 6 --- .../race/impl/BaseRaceLogEventVisitor.java | 6 --- .../race/tracking/RaceLogDefineMarkEvent.java | 18 ------- .../analyzing/impl/DefinedMarkFinder.java | 44 ----------------- .../impl/RaceLogDefineMarkEventImpl.java | 48 ------------------- .../analyzing/impl/RegattaLogAnalyzer.java | 22 +++++++++ .../impl/RegattaLogDefinedMarkAnalyzer.java | 31 ++++++++++++ .../shared/events/DeviceMappingEvent.java | 4 +- .../domain/base/impl/AbstractRaceColumn.java | 35 ++++++-------- .../impl/RaceColumnRaceLogReplicator.java | 6 --- .../domain/tracking/impl/TrackedRaceImpl.java | 14 +++--- .../test/StoreAndLoadRaceLogEventsTest.java | 15 ------ .../RaceLogDefineMarkEventDeserializer.java | 34 ------------- .../impl/RaceLogEventDeserializer.java | 7 --- .../RaceLogDefineMarkEventSerializer.java | 39 --------------- .../racelog/impl/RaceLogEventSerializer.java | 10 ---- .../racelog/RaceLogEventSerializerTest.java | 21 ++------ .../impl/rc/MarksJsonExportServlet.java | 14 ++++-- .../jaxrs/api/LeaderboardsResource.java | 34 ++----------- 25 files changed, 98 insertions(+), 369 deletions(-) delete mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogDefineMarkEvent.java delete mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/DefinedMarkFinder.java delete mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogDefineMarkEventImpl.java create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogAnalyzer.java create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDefinedMarkAnalyzer.java delete mode 100644 java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDefineMarkEventDeserializer.java delete mode 100644 java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogDefineMarkEventSerializer.java diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java index b6d2a353434..1353591e0a1 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java @@ -1374,8 +1374,6 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { return loadRaceLogRevokeEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(RaceLogRegisterCompetitorEvent.class.getSimpleName())) { return loadRaceLogRegisterCompetitorEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); - } else if (eventClass.equals(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent.class.getSimpleName())) { - return loadRaceLogDefineMarkEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent.class.getSimpleName())) { return loadRaceLogCloseOpenEndedDeviceMappingEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(RaceLogAdditionalScoringInformationEvent.class.getSimpleName())) { @@ -1469,13 +1467,6 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { return new RaceLogRegisterCompetitorEventImpl(createdAt, logicalTimePoint, author, id, passId, comp); } - @SuppressWarnings("deprecation") - private RaceLogEvent loadRaceLogDefineMarkEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, - Serializable id, Integer passId, List competitors, DBObject dbObject) { - Mark mark = loadMark((DBObject) dbObject.get(FieldNames.RACE_LOG_MARK.name())); - return new com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDefineMarkEventImpl(createdAt, author, logicalTimePoint, id, passId, mark); - } - @SuppressWarnings("deprecation") private RaceLogEvent loadRaceLogCloseOpenEndedDeviceMappingEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java index ac56b59eb98..831e06f6ef0 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java @@ -887,14 +887,6 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { return result; } - @SuppressWarnings("deprecation") - public DBObject storeRaceLogEntry(RaceLogIdentifier raceLogIdentifier, com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent event) { - BasicDBObject result = new BasicDBObject(); - storeRaceLogIdentifier(raceLogIdentifier, result); - result.put(FieldNames.RACE_LOG_EVENT.name(), storeRaceLogDefineMarkEvent(event)); - return result; - } - @SuppressWarnings("deprecation") public DBObject storeRaceLogEntry(RaceLogIdentifier raceLogIdentifier, com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent event) { BasicDBObject result = new BasicDBObject(); @@ -1062,15 +1054,6 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { return result; } - @SuppressWarnings("deprecation") - private Object storeRaceLogDefineMarkEvent(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent event) { - DBObject result = new BasicDBObject(); - storeRaceLogEventProperties(event, result); - result.put(FieldNames.RACE_LOG_EVENT_CLASS.name(), com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent.class.getSimpleName()); - result.put(FieldNames.RACE_LOG_MARK.name(), storeMark(event.getMark())); - return result; - } - @SuppressWarnings("deprecation") private Object storeRaceLogCloseOpenEndedDeviceMappingEvent(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent event) { DBObject result = new BasicDBObject(); diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java index 0bc12285ac6..fc422c5671b 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java @@ -159,13 +159,6 @@ public class MongoRaceLogStoreVisitor implements RaceLogEventVisitor { DBObject object = mongoObjectFactory.storeRaceLogEntry(raceLogIdentifier, event); mongoObjectFactory.storeRaceLogEventEvent(object); } - - @SuppressWarnings("deprecation") - @Override - public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent event) { - DBObject object = mongoObjectFactory.storeRaceLogEntry(raceLogIdentifier, event); - mongoObjectFactory.storeRaceLogEventEvent(object); - } @SuppressWarnings("deprecation") @Override diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java index 5d824010587..3842fbc7bab 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java @@ -136,11 +136,6 @@ public class RaceLogRaceTracker implements RaceTracker, GPSFixReceivedListener { public void visit(@SuppressWarnings("deprecation") com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent event) { RaceLogRaceTracker.this.onDeviceMarkMappingEvent(event); } - - @Override - public void visit(@SuppressWarnings("deprecation") com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent event) { - RaceLogRaceTracker.this.onDefineMarkEvent(event); - } @Override public void visit(RaceLogStartTrackingEvent event) { diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java index 0da293b8a2d..976fe1ed89d 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java @@ -6,7 +6,6 @@ import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; -import java.util.List; import java.util.Locale; import java.util.Map.Entry; import java.util.Set; @@ -27,8 +26,6 @@ import org.osgi.framework.ServiceReference; import com.google.zxing.WriterException; import com.sap.sailing.domain.abstractlog.AbstractLog; import com.sap.sailing.domain.abstractlog.AbstractLogEvent; -import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; -import com.sap.sailing.domain.abstractlog.impl.AllEventsOfTypeFinder; import com.sap.sailing.domain.abstractlog.impl.LastEventOfTypeFinder; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; @@ -230,20 +227,6 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter { return new RaceLogTrackingStateAnalyzer(raceColumn.getRaceLog(fleet)).analyze(); } - /* TODO: delete as soon as there are no marks in RaceLogs anymore */ - private void revokeAlreadyDefinedMarks(RaceLog raceLog, AbstractLogEventAuthor author) { - @SuppressWarnings("deprecation") - List markEvents = new AllEventsOfTypeFinder<>(raceLog, /* only unrevoked */true, - com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent.class).analyze(); - for (RaceLogEvent event : markEvents) { - try { - raceLog.revokeEvent(author, event, "removing mark that was already defined"); - } catch (NotRevokableException e) { - logger.log(Level.WARNING, "Could not remove mark that was already defined by adding RevokeEvent", e); - } - } - } - @Override public void copyCourse(RaceLog fromRaceLog, Set toRaceLogs, SharedDomainFactory baseDomainFactory, RacingEventService service) { @@ -259,7 +242,6 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter { CourseBase newCourse = new CourseDataImpl("Copy of \"" + course.getName() + "\""); TimePoint now = MillisecondsTimePoint.now(); int i = 0; - revokeAlreadyDefinedMarks(toRaceLog, service.getServerAuthor()); for (Waypoint oldWaypoint : course.getWaypoints()) { newCourse.addWaypoint(i++, oldWaypoint); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventVisitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventVisitor.java index d4b3b705620..7fff1ada55c 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventVisitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventVisitor.java @@ -48,9 +48,6 @@ public interface RaceLogEventVisitor { public void visit(RaceLogRegisterCompetitorEvent event); - @SuppressWarnings("deprecation") - public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent event); - @SuppressWarnings("deprecation") public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent event); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/AbstractRaceLogChangedVisitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/AbstractRaceLogChangedVisitor.java index 7108b743183..36ce88dcdef 100755 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/AbstractRaceLogChangedVisitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/AbstractRaceLogChangedVisitor.java @@ -120,12 +120,6 @@ public abstract class AbstractRaceLogChangedVisitor implements RaceLogEventVisit public void visit(RaceLogRegisterCompetitorEvent event) { notifyListenerAboutEventAdded(event); } - - @SuppressWarnings("deprecation") - @Override - public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent event) { - notifyListenerAboutEventAdded(event); - } @SuppressWarnings("deprecation") @Override diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/BaseRaceLogEventVisitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/BaseRaceLogEventVisitor.java index f180dff737a..04130f6e66e 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/BaseRaceLogEventVisitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/BaseRaceLogEventVisitor.java @@ -126,12 +126,6 @@ public abstract class BaseRaceLogEventVisitor implements RaceLogEventVisitor { @Override public void visit(RaceLogRegisterCompetitorEvent event) { - } - - @SuppressWarnings("deprecation") - @Override - public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent event) { - } @SuppressWarnings("deprecation") diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogDefineMarkEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogDefineMarkEvent.java deleted file mode 100644 index ba0c5db64a9..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogDefineMarkEvent.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.sap.sailing.domain.abstractlog.race.tracking; - -import com.sap.sailing.domain.abstractlog.Revokable; -import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; -import com.sap.sailing.domain.abstractlog.shared.events.DefineMarkEvent; -import com.sap.sailing.domain.base.Mark; - -/** - * Defines a mark, that can then be used to build a course. - * - * @author Fredrik Teschke - * - */ -@Deprecated //see bug 2851 -public interface RaceLogDefineMarkEvent extends DefineMarkEvent, RaceLogEvent, Revokable { - Mark getMark(); -} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/DefinedMarkFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/DefinedMarkFinder.java deleted file mode 100644 index 2edc23e0343..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/DefinedMarkFinder.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -import com.sap.sailing.domain.abstractlog.AbstractLog; -import com.sap.sailing.domain.abstractlog.AbstractLogEvent; -import com.sap.sailing.domain.abstractlog.BaseLogAnalyzer; -import com.sap.sailing.domain.abstractlog.LogAnalyzer; -import com.sap.sailing.domain.abstractlog.MultiLogAnalyzer.AnalyzerFactory; -import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDefineMarkEvent; -import com.sap.sailing.domain.base.Mark; - -public class DefinedMarkFinder, EventT extends AbstractLogEvent, VisitorT> - extends BaseLogAnalyzer> { - - public static class Factory implements AnalyzerFactory> { - @Override - public LogAnalyzer> createAnalyzer(AbstractLog log) { - return new DefinedMarkFinder<>(log); - } - } - - public DefinedMarkFinder(LogT log) { - super(log); - } - - @SuppressWarnings("deprecation") - @Override - protected Collection performAnalysis() { - List result = new ArrayList(); - for (AbstractLogEvent event : getLog().getUnrevokedEvents()) { - if (event instanceof com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent) { - com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent dME = (com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent) event; - result.add(dME.getMark()); - } else if (event instanceof RegattaLogDefineMarkEvent) { - RegattaLogDefineMarkEvent dME = (RegattaLogDefineMarkEvent) event; - result.add(dME.getMark()); - } - } - return result; - } -} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogDefineMarkEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogDefineMarkEventImpl.java deleted file mode 100644 index e25d6210040..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogDefineMarkEventImpl.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.sap.sailing.domain.abstractlog.race.tracking.impl; - -import java.io.Serializable; -import java.util.Collections; -import java.util.List; - -import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; -import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; -import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventDataImpl; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent; -import com.sap.sailing.domain.abstractlog.shared.events.impl.AbstractDefineMarkEventImpl; -import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.base.Mark; -import com.sap.sse.common.TimePoint; - -@Deprecated //see bug2851 -public class RaceLogDefineMarkEventImpl extends AbstractDefineMarkEventImpl implements RaceLogDefineMarkEvent { - private static final long serialVersionUID = 277007856878002208L; - - private RaceLogEventDataImpl raceLogEventData; - - public RaceLogDefineMarkEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, - Serializable pId, int passId, Mark mark) { - super(createdAt, author, logicalTimePoint, pId, mark); - this.raceLogEventData = new RaceLogEventDataImpl(null, passId); - } - - @Override - public int getPassId() { - return raceLogEventData.getPassId(); - } - - @Override - public void accept(RaceLogEventVisitor visitor) { - visitor.visit(this); - } - - @Override - public List getInvolvedBoats() { - return Collections.emptyList(); - } - - @Override - public String getShortInfo() { - return mark.toString(); - } - -} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogAnalyzer.java new file mode 100644 index 00000000000..4513bf2dea7 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogAnalyzer.java @@ -0,0 +1,22 @@ +package com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl; + +import com.sap.sailing.domain.abstractlog.BaseLogAnalyzer; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; + +public abstract class RegattaLogAnalyzer extends BaseLogAnalyzer + { + + public RegattaLogAnalyzer(RegattaLog raceLog) { + super(raceLog); + } + + protected Iterable getPassEvents() { + return log.getFixes(); + } + + protected Iterable getPassEventsDescending() { + return log.getFixesDescending(); + } +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDefinedMarkAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDefinedMarkAnalyzer.java new file mode 100644 index 00000000000..20c91877585 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDefinedMarkAnalyzer.java @@ -0,0 +1,31 @@ +package com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import com.sap.sailing.domain.abstractlog.impl.AllEventsOfTypeFinder; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDefineMarkEvent; +import com.sap.sailing.domain.base.Mark; + +public class RegattaLogDefinedMarkAnalyzer extends RegattaLogAnalyzer> { + + public RegattaLogDefinedMarkAnalyzer(RegattaLog log) { + super(log); + } + + @Override + protected Collection performAnalysis() { + List result = new ArrayList(); + List defineMarkEvents = new AllEventsOfTypeFinder<>(log, true, RegattaLogDefineMarkEvent.class) + .analyze(); + + for (RegattaLogEvent event : defineMarkEvents) { + RegattaLogDefineMarkEvent dME = (RegattaLogDefineMarkEvent) event; + result.add(dME.getMark()); + } + return result; + } +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/DeviceMappingEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/DeviceMappingEvent.java index 2a31b71140e..19058c8c2ec 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/DeviceMappingEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/DeviceMappingEvent.java @@ -2,7 +2,7 @@ package com.sap.sailing.domain.abstractlog.shared.events; import com.sap.sailing.domain.abstractlog.AbstractLogEvent; import com.sap.sailing.domain.abstractlog.Revokable; -import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.DefinedMarkFinder; +import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogDefinedMarkAnalyzer; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; @@ -19,7 +19,7 @@ import com.sap.sse.common.WithID; * If one end of the time range enclosed by {@link #getFrom()} and {@link #getTo()} is open, this can be closed * by a {@link CloseOpenEndedDeviceMappingEvent}. * - * @see DefinedMarkFinder for rules by which {@link DeviceMapping}s are derived from these events. + * @see RegattaLogDefinedMarkAnalyzer for rules by which {@link DeviceMapping}s are derived from these events. * @author Fredrik Teschke */ public interface DeviceMappingEvent extends AbstractLogEvent, Revokable { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java index f9edc1b98cb..b3aa6fc0457 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java @@ -19,14 +19,16 @@ import com.sap.sailing.domain.abstractlog.impl.AllEventsOfTypeFinder; import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.LastPublishedCourseDesignFinder; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.DefinedMarkFinder; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RegisteredCompetitorsAnalyzer; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogRegisterCompetitorEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogUseCompetitorsFromRaceLogEventImpl; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; +import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogDefinedMarkAnalyzer; import com.sap.sailing.domain.abstractlog.shared.events.RegisterCompetitorEvent; import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.base.RaceColumn; @@ -347,16 +349,9 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem Util.addAll(waypoint.getMarks(), result); } } else { - // if no tracked race is found, use competitors from race/regatta log depending on whether - // the mapping event is present or not; this assumes that if a tracked - // race exists, its competitors set takes precedence over what's in the race log. Usually, - // the tracked race will have the same competitors as those in the race log, or more because - // those from the regatta log are added to the tracked race as well. + // if no tracked race is found, use marks regatta log RegattaLog regattaLog = getRegattaLog(); - Collection viaRegattaLog = new DefinedMarkFinder<>(regattaLog).analyze(); - //FIXME: soon to be removed, as RaceLogDefineMarkEvent is deprecated - Collection viaRaceLog = new DefinedMarkFinder<>(getRaceLog(fleet)).analyze(); - result.addAll(viaRaceLog); + Collection viaRegattaLog = new RegattaLogDefinedMarkAnalyzer(regattaLog).analyze(); result.addAll(viaRegattaLog); } } @@ -372,16 +367,16 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem Util.addAll(waypoint.getMarks(), result); } } else { - // if no tracked race is found, use competitors from race/regatta log depending on whether - // the mapping event is present or not; this assumes that if a tracked - // race exists, its competitors set takes precedence over what's in the race log. Usually, - // the tracked race will have the same competitors as those in the race log, or more because - // those from the regatta log are added to the tracked race as well. - RegattaLog regattaLog = getRegattaLog(); - Collection viaRegattaLog = new DefinedMarkFinder<>(regattaLog).analyze(); - Collection viaRaceLog = new DefinedMarkFinder<>(getRaceLog(fleet)).analyze(); - result.addAll(viaRaceLog); - result.addAll(viaRegattaLog); + // if no tracked race is found, use marks from race course if present in racelog + // if not the marks defined in the regatta log + + LastPublishedCourseDesignFinder courseDesginFinder = new LastPublishedCourseDesignFinder(getRaceLog(fleet)); + CourseBase courseBase = courseDesginFinder.analyze(); + if (courseBase != null){ + courseBase.getWaypoints().forEach((waypoint) -> Util.addAll(waypoint.getMarks(), result)); + } else { + Util.addAll(new RegattaLogDefinedMarkAnalyzer(getRegattaLog()).analyze(), result); + } } return result; } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java index 76244a2fda4..cc17e516aa6 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java @@ -146,12 +146,6 @@ public class RaceColumnRaceLogReplicator implements RaceLogEventVisitor, Seriali notifyOnAdd(event); } - @SuppressWarnings("deprecation") - @Override - public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent event) { - notifyOnAdd(event); - } - @SuppressWarnings("deprecation") @Override public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent event) { 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 5774cb822ba..f825b121646 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 @@ -6,7 +6,6 @@ import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.ConcurrentModificationException; @@ -36,9 +35,7 @@ import java.util.logging.Logger; import com.sap.sailing.domain.abstractlog.AbstractLog; import com.sap.sailing.domain.abstractlog.AbstractLogEvent; import com.sap.sailing.domain.abstractlog.MultiLogAnalyzer; -import com.sap.sailing.domain.abstractlog.MultiLogAnalyzer.AnalyzerFactory; import com.sap.sailing.domain.abstractlog.MultiLogAnalyzer.MapWithValueCollectionReducer; -import com.sap.sailing.domain.abstractlog.MultiLogAnalyzer.SetReducer; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogDependentStartTimeEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogEndOfTrackingEvent; @@ -53,8 +50,8 @@ import com.sap.sailing.domain.abstractlog.race.impl.RaceLogGateLineOpeningTimeEv import com.sap.sailing.domain.abstractlog.race.state.ReadonlyRaceState; import com.sap.sailing.domain.abstractlog.race.state.impl.RaceStateImpl; import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ReadonlyRacingProcedure; -import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.DefinedMarkFinder; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; +import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogDefinedMarkAnalyzer; import com.sap.sailing.domain.abstractlog.shared.analyzing.DeviceMarkMappingFinder; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; @@ -3933,9 +3930,12 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl new MapWithValueCollectionReducer<>(), allLogs).analyze(); final Set result = new HashSet<>(); result.addAll(markMappings.keySet()); - final AnalyzerFactory> analyzerFactory = new DefinedMarkFinder.Factory(); - Set marksDefinedInRaceLog = new MultiLogAnalyzer<>(analyzerFactory, new SetReducer(), raceLogs).analyze(); - result.addAll(marksDefinedInRaceLog); + + Set marksDefinedInRegattaLog = new HashSet(); + for (RegattaLog log: attachedRegattaLogs.values()){ + marksDefinedInRegattaLog.addAll(new RegattaLogDefinedMarkAnalyzer(log).analyze()); + } + result.addAll(marksDefinedInRegattaLog); return result; } } diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java index 625085bc44d..15c4f43cb61 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java @@ -34,13 +34,11 @@ import com.sap.sailing.domain.abstractlog.race.impl.RaceLogRaceStatusEventImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogRevokeEventImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogStartTimeEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogCloseOpenEndedDeviceMappingEventImpl; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDefineMarkEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDenoteForTrackingEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceCompetitorMappingEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceMarkMappingEventImpl; @@ -275,19 +273,6 @@ public class StoreAndLoadRaceLogEventsTest extends AbstractMongoDBTest { assertEquals(expectedEvent.getCompetitor(), actualEvent.getCompetitor()); } - @Test - public void testStoreAndLoadDefineMarkEvent() { - RaceLogDefineMarkEvent expectedEvent = new RaceLogDefineMarkEventImpl(MillisecondsTimePoint.now(), - author, expectedEventTime, expectedId, expectedPassId, - DomainFactory.INSTANCE.getOrCreateMark("mytestmark")); - - DBObject dbObject = mongoFactory.storeRaceLogEntry(logIdentifier, expectedEvent); - RaceLogDefineMarkEvent actualEvent = loadEvent(dbObject); - - assertBaseFields(expectedEvent, actualEvent); - assertEquals(expectedEvent.getMark(), actualEvent.getMark()); - } - @Test public void testStoreAndLoadCloseOpenDeviceMappingEvent() { RaceLogCloseOpenEndedDeviceMappingEvent expectedEvent = new RaceLogCloseOpenEndedDeviceMappingEventImpl( diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDefineMarkEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDefineMarkEventDeserializer.java deleted file mode 100644 index c7c9ce89245..00000000000 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDefineMarkEventDeserializer.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.sap.sailing.server.gateway.deserialization.racelog.impl; - -import java.io.Serializable; -import java.util.List; - -import org.json.simple.JSONObject; - -import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; -import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.base.Mark; -import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; -import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; -import com.sap.sailing.server.gateway.deserialization.impl.Helpers; -import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogDefineMarkEventSerializer; -import com.sap.sse.common.TimePoint; - -public class RaceLogDefineMarkEventDeserializer extends BaseRaceLogEventDeserializer { - private final JsonDeserializer markDeserializer; - public RaceLogDefineMarkEventDeserializer(JsonDeserializer competitorDeserializer, - JsonDeserializer markDeserializer) { - super(competitorDeserializer); - this.markDeserializer = markDeserializer; - } - - @SuppressWarnings("deprecation") - @Override - protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, AbstractLogEventAuthor author, TimePoint timePoint, int passId, List competitors) - throws JsonDeserializationException { - Mark mark = markDeserializer.deserialize(Helpers.getNestedObjectSafe(object, RaceLogDefineMarkEventSerializer.FIELD_MARK)); - - return new com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDefineMarkEventImpl(createdAt, author, timePoint, id, passId, mark); - } -} diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogEventDeserializer.java index 26963884cad..9ef80731458 100755 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogEventDeserializer.java @@ -23,7 +23,6 @@ import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogAddition import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogCloseOpenEndedDeviceMappingEventSerializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogCourseAreaChangedEventSerializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogCourseDesignChangedEventSerializer; -import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogDefineMarkEventSerializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogDenoteForTrackingEventSerializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogDependentStartTimeEventSerializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogDeviceCompetitorMappingEventSerializer; @@ -87,7 +86,6 @@ public class RaceLogEventDeserializer implements JsonDeserializer new RaceLogStartTrackingEventDeserializer(competitorDeserializer), new RaceLogRevokeEventDeserializer(competitorDeserializer), new RaceLogRegisterCompetitorEventDeserializer(competitorDeserializer), - new RaceLogDefineMarkEventDeserializer(competitorDeserializer, new MarkDeserializer(domainFactory)), new RaceLogCloseOpenEndedDeviceMappingEventDeserializer(competitorDeserializer), new RaceLogAdditionalScoringInformationEventDeserializer(competitorDeserializer), new RaceLogFixedMarkPassingEventDeserializer(competitorDeserializer), @@ -117,7 +115,6 @@ public class RaceLogEventDeserializer implements JsonDeserializer protected final JsonDeserializer startTrackingEventDeserializer; protected final JsonDeserializer revokeEventDeserializer; protected final JsonDeserializer registerCompetitorEventDeserializer; - protected final JsonDeserializer defineMarkEventDeserializer; protected final JsonDeserializer closeOpenEndedDeviceMappingEventDeserializer; protected final JsonDeserializer additionalScoringInformationEventDeserializer; protected final JsonDeserializer fixedMarkPassingEventDeserializer; @@ -146,7 +143,6 @@ public class RaceLogEventDeserializer implements JsonDeserializer JsonDeserializer startTrackingEventDeserializer, JsonDeserializer revokeEventDeserializer, JsonDeserializer registerCompetitorEventDeserializer, - JsonDeserializer defineMarkEventDeserializer, JsonDeserializer closeOpenEndedDeviceMappingEventDeserializer, JsonDeserializer additionalScoringInformationEventDeserializer, JsonDeserializer fixedMarkPassingEventDeserializer, @@ -174,7 +170,6 @@ public class RaceLogEventDeserializer implements JsonDeserializer this.startTrackingEventDeserializer = startTrackingEventDeserializer; this.revokeEventDeserializer = revokeEventDeserializer; this.registerCompetitorEventDeserializer = registerCompetitorEventDeserializer; - this.defineMarkEventDeserializer = defineMarkEventDeserializer; this.closeOpenEndedDeviceMappingEventDeserializer = closeOpenEndedDeviceMappingEventDeserializer; this.additionalScoringInformationEventDeserializer = additionalScoringInformationEventDeserializer; this.fixedMarkPassingEventDeserializer = fixedMarkPassingEventDeserializer; @@ -227,8 +222,6 @@ public class RaceLogEventDeserializer implements JsonDeserializer return revokeEventDeserializer; } else if (type.equals(RaceLogRegisterCompetitorEventSerializer.VALUE_CLASS)) { return registerCompetitorEventDeserializer; - } else if (type.equals(RaceLogDefineMarkEventSerializer.VALUE_CLASS)) { - return defineMarkEventDeserializer; } else if (type.equals(RaceLogCloseOpenEndedDeviceMappingEventSerializer.VALUE_CLASS)) { return closeOpenEndedDeviceMappingEventDeserializer; } else if (type.equals(RaceLogAdditionalScoringInformationSerializer.VALUE_CLASS)) { diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogDefineMarkEventSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogDefineMarkEventSerializer.java deleted file mode 100644 index dcdedbff500..00000000000 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogDefineMarkEventSerializer.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.sap.sailing.server.gateway.serialization.racelog.impl; - -import org.json.simple.JSONObject; - -import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.base.ControlPoint; -import com.sap.sailing.server.gateway.serialization.JsonSerializer; - -public class RaceLogDefineMarkEventSerializer extends BaseRaceLogEventSerializer { - @SuppressWarnings("deprecation") - public static final String VALUE_CLASS = com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent.class.getSimpleName(); - public static final String FIELD_MARK = "mark"; - - private final JsonSerializer markSerializer; - - public RaceLogDefineMarkEventSerializer( - JsonSerializer competitorSerializer, JsonSerializer markSerializer) { - super(competitorSerializer); - this.markSerializer = markSerializer; - } - - @Override - protected String getClassFieldValue() { - return VALUE_CLASS; - } - - @SuppressWarnings("deprecation") - @Override - public JSONObject serialize(RaceLogEvent object) { - com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent event = (com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent) object; - - JSONObject result = super.serialize(event); - result.put(FIELD_MARK, markSerializer.serialize(event.getMark())); - - return result; - } - -} diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java index 95f9c475cab..d54a63534c9 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java @@ -78,7 +78,6 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac new RaceLogStartTrackingEventSerializer(competitorSerializer), new RaceLogRevokeEventSerializer(competitorSerializer), new RaceLogRegisterCompetitorEventSerializer(competitorSerializer), - new RaceLogDefineMarkEventSerializer(competitorSerializer, new MarkJsonSerializer()), new RaceLogCloseOpenEndedDeviceMappingEventSerializer(competitorSerializer), new RaceLogAdditionalScoringInformationSerializer(competitorSerializer), new RaceLogFixedMarkPassingEventSerializer(competitorSerializer), @@ -108,7 +107,6 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac private final JsonSerializer startTrackingSerializer; private final JsonSerializer revokeSerializer; private final JsonSerializer registerCompetitorSerializer; - private final JsonSerializer defineMarkSerializer; private final JsonSerializer closeOpenEndedDeviceMappingEventSerializer; private final JsonSerializer additionalScoringInformationSerializer; private final JsonSerializer fixedMarkPassingEventSerializer; @@ -141,7 +139,6 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac JsonSerializer createRaceSerializer, JsonSerializer revokeSerializer, JsonSerializer registerCompetitorSerializer, - JsonSerializer defineMarkSerializer, JsonSerializer closeOpenEndedDeviceMappingEventSerializer, JsonSerializer additionalScoringInformationSerializer, JsonSerializer fixedMarkPassingEventSerializer, @@ -169,7 +166,6 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac this.startTrackingSerializer = createRaceSerializer; this.revokeSerializer = revokeSerializer; this.registerCompetitorSerializer = registerCompetitorSerializer; - this.defineMarkSerializer = defineMarkSerializer; this.closeOpenEndedDeviceMappingEventSerializer = closeOpenEndedDeviceMappingEventSerializer; this.additionalScoringInformationSerializer = additionalScoringInformationSerializer; this.fixedMarkPassingEventSerializer = fixedMarkPassingEventSerializer; @@ -290,12 +286,6 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac public void visit(RaceLogRegisterCompetitorEvent event) { chosenSerializer = registerCompetitorSerializer; } - - @SuppressWarnings("deprecation") - @Override - public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent event) { - chosenSerializer = defineMarkSerializer; - } @SuppressWarnings("deprecation") @Override diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java index be640e01fc7..bc0c036c484 100644 --- a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java +++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java @@ -26,7 +26,6 @@ import com.sap.sailing.domain.abstractlog.race.impl.RaceLogStartProcedureChanged import com.sap.sailing.domain.abstractlog.race.impl.RaceLogStartTimeEventImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogWindFixEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogCloseOpenEndedDeviceMappingEventImpl; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDefineMarkEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDenoteForTrackingEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceCompetitorMappingEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceMarkMappingEventImpl; @@ -63,7 +62,6 @@ public class RaceLogEventSerializerTest { private JsonSerializer startTrackingEventSerializer; private JsonSerializer revokeEventSerializer; private JsonSerializer registerCompetitorEventSerializer; - private JsonSerializer defineMarkEventSerializer; private JsonSerializer closeOpenEndedDeviceMappingEventSerializer; private JsonSerializer additionalScoringInformationSerializer; private JsonSerializer fixedMarkPassingEventSerializer; @@ -97,7 +95,6 @@ public class RaceLogEventSerializerTest { startTrackingEventSerializer = mock(JsonSerializer.class); revokeEventSerializer = mock(JsonSerializer.class); registerCompetitorEventSerializer = mock(JsonSerializer.class); - defineMarkEventSerializer = mock(JsonSerializer.class); closeOpenEndedDeviceMappingEventSerializer = mock(JsonSerializer.class); additionalScoringInformationSerializer = mock(JsonSerializer.class); fixedMarkPassingEventSerializer = mock(JsonSerializer.class); @@ -114,11 +111,11 @@ public class RaceLogEventSerializerTest { startProcedureTypeChangedEventSerializer, protestStartTimeEventSerializer, windFixEventSerializer, deviceCompetitorMappingEventSerializer, deviceMarkMappingEventSerializer, denoteForTrackingEventSerializer, startTrackingEventSerializer, revokeEventSerializer, - registerCompetitorEventSerializer, defineMarkEventSerializer, - closeOpenEndedDeviceMappingEventSerializer, fixedMarkPassingEventSerializer, - suppressedMarkPassingsSerializer, additionalScoringInformationSerializer, - dependentStartTimeEventSerializer, startOfTrackingEventSerializer, - useCompetitorsFromRaceLogEventSerializer, endOfTrackingEventSerializer); + registerCompetitorEventSerializer, closeOpenEndedDeviceMappingEventSerializer, + fixedMarkPassingEventSerializer, suppressedMarkPassingsSerializer, + additionalScoringInformationSerializer, dependentStartTimeEventSerializer, + startOfTrackingEventSerializer, useCompetitorsFromRaceLogEventSerializer, + endOfTrackingEventSerializer); } @Test @@ -277,14 +274,6 @@ public class RaceLogEventSerializerTest { verify(registerCompetitorEventSerializer).serialize(event); } - @Test - public void testDefineMarkEventSerializer() { - // we use the real event type here because we do not want to re-implement the dispatching. - RaceLogEvent event = new RaceLogDefineMarkEventImpl(null, author, null, 0, 0, null); - serializer.serialize(event); - verify(defineMarkEventSerializer).serialize(event); - } - @Test public void testCloseOpenEndedDeviceMappingEventSerializer() { // we use the real event type here because we do not want to re-implement the dispatching. diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarksJsonExportServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarksJsonExportServlet.java index d9a36dcd159..851af98bb1e 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarksJsonExportServlet.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarksJsonExportServlet.java @@ -11,7 +11,9 @@ import javax.servlet.http.HttpServletResponse; import org.json.simple.JSONArray; -import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.DefinedMarkFinder; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.LastPublishedCourseDesignFinder; +import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogDefinedMarkAnalyzer; +import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.base.RaceColumn; @@ -21,6 +23,7 @@ import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.server.RacingEventService; import com.sap.sailing.server.gateway.AbstractJsonHttpServlet; import com.sap.sailing.server.gateway.serialization.coursedata.impl.MarkJsonSerializer; +import com.sap.sse.common.Util; public class MarksJsonExportServlet extends AbstractJsonHttpServlet { private static final long serialVersionUID = 4510175441769759252L; @@ -69,9 +72,14 @@ public class MarksJsonExportServlet extends AbstractJsonHttpServlet { } else { final List marksList = new ArrayList<>(); // no tracked race associated yet; grab the mark definitions from the race log: - for (Mark markDefinitionFromRaceLog : new DefinedMarkFinder<>(raceColumn.getRaceLog(fleet)).analyze()) { - marksList.add(markDefinitionFromRaceLog); + LastPublishedCourseDesignFinder courseDesginFinder = new LastPublishedCourseDesignFinder(raceColumn.getRaceLog(fleet)); + CourseBase courseBase = courseDesginFinder.analyze(); + if (courseBase != null){ + courseBase.getWaypoints().forEach((waypoint) -> Util.addAll(waypoint.getMarks(), marksList)); + } else { + marksList.addAll(new RegattaLogDefinedMarkAnalyzer(raceColumn.getRegattaLog()).analyze()); } + marks = marksList; } MarkJsonSerializer serializer = new MarkJsonSerializer(); diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java index 23f35b4432b..17b4d0ad881 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java @@ -35,8 +35,6 @@ import org.json.simple.parser.ParseException; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; -import com.sap.sailing.domain.abstractlog.race.RaceLog; -import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.DefinedMarkFinder; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogCloseOpenEndedDeviceMappingEventImpl; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceCompetitorMappingEventImpl; @@ -548,12 +546,8 @@ public class LeaderboardsResource extends AbstractSailingServerResource { .entity("Leaderboard with name '"+ leaderboardName+ "'does not contain a RegattaLog'.") .type(MediaType.TEXT_PLAIN).build(); } - LeaderboardThatHasRegattaLike regattaLikeLeaderboard = (LeaderboardThatHasRegattaLike) leaderboard; - RegattaLog regattaLog = ((HasRegattaLike) regattaLikeLeaderboard).getRegattaLike().getRegattaLog(); final Set marks = new HashSet(); - Util.addAll(new DefinedMarkFinder<>(regattaLog).analyze(), marks); - if (raceColumnName == null) { if (fleetName != null) { return Response @@ -562,14 +556,7 @@ public class LeaderboardsResource extends AbstractSailingServerResource { .type(MediaType.TEXT_PLAIN).build(); } else { for (RaceColumn raceColumn : leaderboard.getRaceColumns()) { - for (Fleet fleet : raceColumn.getFleets()) { - RaceLog raceLog = raceColumn.getRaceLog(fleet); - TrackedRace trackedRace = raceColumn.getTrackedRace(fleet); // might not yet be attached - Util.addAll(new DefinedMarkFinder<>(raceLog).analyze(), marks); - if (trackedRace != null) { - Util.addAll(trackedRace.getMarks(), marks); - } - } + Util.addAll(raceColumn.getAllMarks(), marks); } } } else { @@ -587,13 +574,13 @@ public class LeaderboardsResource extends AbstractSailingServerResource { .entity("Could not find fleet '" + fleetName + "' in leaderboard '" + leaderboardName + "'.").type(MediaType.TEXT_PLAIN).build(); } else { - marks.addAll(getMarksForFleet(raceColumn, fleet)); + Util.addAll(raceColumn.getAllMarks(fleet), marks); } } else { // Return all marks for a certain race column - for (Fleet fleet : raceColumn.getFleets()) { - Util.addAll(getMarksForFleet(raceColumn, fleet), marks); - } + // if all races have a tracked race return all marks part of at least one tracked race + // if at least one race doesn't have a tracked race, return also the marks defined in the RegattaLog + Util.addAll(raceColumn.getAllMarks(), marks); } } JSONArray array = new JSONArray(); @@ -609,17 +596,6 @@ public class LeaderboardsResource extends AbstractSailingServerResource { return Response.ok(result.toJSONString(), MediaType.APPLICATION_JSON).build(); } - private Set getMarksForFleet(RaceColumn raceColumn, Fleet fleet) { - RaceLog raceLog = raceColumn.getRaceLog(fleet); - TrackedRace trackedRace = raceColumn.getTrackedRace(fleet); // might not yet be attached - Set marks = new HashSet<>(); - Util.addAll(new DefinedMarkFinder<>(raceLog).analyze(), marks); - if (trackedRace != null) { - Util.addAll(trackedRace.getMarks(), marks); - } - return marks; - } - private final MarkJsonSerializer markSerializer = new MarkJsonSerializer(); private final MarkJsonSerializerWithPosition markWithPositionSerializer = new MarkJsonSerializerWithPosition(markSerializer, new FlatGPSFixJsonSerializer()); private final FlatGPSFixJsonDeserializer fixDeserializer = new FlatGPSFixJsonDeserializer(); From b8dcab588b98871dfb12132f04207b3cbfd13935 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Mon, 7 Dec 2015 14:30:44 +0100 Subject: [PATCH 053/165] User getAllMarks on RaceColumn instead of analyzers --- .../impl/rc/MarksJsonExportServlet.java | 25 +------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarksJsonExportServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarksJsonExportServlet.java index 851af98bb1e..e877a7dbe42 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarksJsonExportServlet.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarksJsonExportServlet.java @@ -1,8 +1,6 @@ package com.sap.sailing.server.gateway.impl.rc; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; import java.util.UUID; import javax.servlet.ServletException; @@ -11,19 +9,14 @@ import javax.servlet.http.HttpServletResponse; import org.json.simple.JSONArray; -import com.sap.sailing.domain.abstractlog.race.analyzing.impl.LastPublishedCourseDesignFinder; -import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogDefinedMarkAnalyzer; -import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.common.racelog.RaceLogServletConstants; import com.sap.sailing.domain.leaderboard.Leaderboard; -import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.server.RacingEventService; import com.sap.sailing.server.gateway.AbstractJsonHttpServlet; import com.sap.sailing.server.gateway.serialization.coursedata.impl.MarkJsonSerializer; -import com.sap.sse.common.Util; public class MarksJsonExportServlet extends AbstractJsonHttpServlet { private static final long serialVersionUID = 4510175441769759252L; @@ -64,24 +57,8 @@ public class MarksJsonExportServlet extends AbstractJsonHttpServlet { response.sendError(HttpServletResponse.SC_NOT_FOUND, "No such fleet found."); return; } - TrackedRace trackedRace = raceColumn.getTrackedRace(fleet); JSONArray result = new JSONArray(); - final Iterable marks; - if (trackedRace != null) { - marks = trackedRace.getMarks(); - } else { - final List marksList = new ArrayList<>(); - // no tracked race associated yet; grab the mark definitions from the race log: - LastPublishedCourseDesignFinder courseDesginFinder = new LastPublishedCourseDesignFinder(raceColumn.getRaceLog(fleet)); - CourseBase courseBase = courseDesginFinder.analyze(); - if (courseBase != null){ - courseBase.getWaypoints().forEach((waypoint) -> Util.addAll(waypoint.getMarks(), marksList)); - } else { - marksList.addAll(new RegattaLogDefinedMarkAnalyzer(raceColumn.getRegattaLog()).analyze()); - } - - marks = marksList; - } + final Iterable marks = raceColumn.getAllMarks(fleet); MarkJsonSerializer serializer = new MarkJsonSerializer(); for (Mark mark : marks) { if (toUUID(mark.getId().toString()) != null) { From d456eecfb26cee3d99cc49e69bfa4825ec521473 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Thu, 10 Dec 2015 15:23:38 +0100 Subject: [PATCH 054/165] Remove RaceLogCloseOpenEndedDeviceMappingEvent --- .../common/RaceLogEventNotFoundException.java | 11 ---- .../UnableToCloseDeviceMappingException.java | 13 ++++ .../impl/DomainObjectFactoryImpl.java | 11 ---- .../impl/MongoObjectFactoryImpl.java | 20 +----- .../impl/MongoRaceLogStoreVisitor.java | 7 -- .../test/AbstractRegattaLogTrackingTest.java | 29 +++++++++ .../test/DeviceMappingFinderTest.java | 15 ++--- .../abstractlog/race/RaceLogEventVisitor.java | 3 - .../impl/AbstractRaceLogChangedVisitor.java | 6 -- .../race/impl/BaseRaceLogEventVisitor.java | 6 -- ...ceLogCloseOpenEndedDeviceMappingEvent.java | 11 ---- .../RaceLogOpenEndedDeviceMappingCloser.java | 31 --------- ...gCloseOpenEndedDeviceMappingEventImpl.java | 53 --------------- .../impl/RaceColumnRaceLogReplicator.java | 6 -- .../sailing/gwt/ui/client/SailingService.java | 3 +- .../sailing/gwt/ui/client/StringMessages.java | 1 - .../gwt/ui/server/SailingServiceImpl.java | 64 +++++-------------- .../test/StoreAndLoadRaceLogEventsTest.java | 16 ----- ...enEndedDeviceMappingEventDeserializer.java | 35 ---------- .../impl/RaceLogEventDeserializer.java | 7 -- ...OpenEndedDeviceMappingEventSerializer.java | 35 ---------- .../racelog/impl/RaceLogEventSerializer.java | 14 +--- .../racelog/RaceLogEventSerializerTest.java | 14 +--- 23 files changed, 71 insertions(+), 340 deletions(-) delete mode 100644 java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/RaceLogEventNotFoundException.java create mode 100644 java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/UnableToCloseDeviceMappingException.java create mode 100644 java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/regattalog/tracking/analyzing/test/AbstractRegattaLogTrackingTest.java rename java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/{racelog => regattalog}/tracking/analyzing/test/DeviceMappingFinderTest.java (82%) delete mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogCloseOpenEndedDeviceMappingEvent.java delete mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceLogOpenEndedDeviceMappingCloser.java delete mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogCloseOpenEndedDeviceMappingEventImpl.java delete mode 100644 java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogCloseOpenEndedDeviceMappingEventDeserializer.java delete mode 100644 java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogCloseOpenEndedDeviceMappingEventSerializer.java diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/RaceLogEventNotFoundException.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/RaceLogEventNotFoundException.java deleted file mode 100644 index d85a4479a2d..00000000000 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/RaceLogEventNotFoundException.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.sap.sailing.domain.common; - -public class RaceLogEventNotFoundException extends Exception { - private static final long serialVersionUID = 4595827888350748956L; - - public RaceLogEventNotFoundException() {} - - public RaceLogEventNotFoundException(String message) { - super(message); - } -} diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/UnableToCloseDeviceMappingException.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/UnableToCloseDeviceMappingException.java new file mode 100644 index 00000000000..879f1e05f96 --- /dev/null +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/UnableToCloseDeviceMappingException.java @@ -0,0 +1,13 @@ +package com.sap.sailing.domain.common; + +import java.io.Serializable; + +public class UnableToCloseDeviceMappingException extends Exception implements Serializable{ + private static final long serialVersionUID = 4595827888350748956L; + + public UnableToCloseDeviceMappingException() {} + + public UnableToCloseDeviceMappingException(String message) { + super(message); + } +} diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java index 1353591e0a1..658deb69828 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java @@ -1374,8 +1374,6 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { return loadRaceLogRevokeEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(RaceLogRegisterCompetitorEvent.class.getSimpleName())) { return loadRaceLogRegisterCompetitorEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); - } else if (eventClass.equals(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent.class.getSimpleName())) { - return loadRaceLogCloseOpenEndedDeviceMappingEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(RaceLogAdditionalScoringInformationEvent.class.getSimpleName())) { return loadRaceLogAdditionalScoringInformationEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(RaceLogFixedMarkPassingEvent.class.getSimpleName())){ @@ -1467,15 +1465,6 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { return new RaceLogRegisterCompetitorEventImpl(createdAt, logicalTimePoint, author, id, passId, comp); } - @SuppressWarnings("deprecation") - private RaceLogEvent loadRaceLogCloseOpenEndedDeviceMappingEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, - Serializable id, Integer passId, List competitors, DBObject dbObject) { - Serializable deviceMappingEventId = Helpers.tryUuidConversion((Serializable) dbObject.get(FieldNames.RACE_LOG_DEVICE_MAPPING_EVENT_ID.name())); - TimePoint closingTimePoint = loadTimePoint(dbObject, FieldNames.RACE_LOG_CLOSING_TIMEPOINT); - return new com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogCloseOpenEndedDeviceMappingEventImpl(createdAt, logicalTimePoint, author, id, passId, - deviceMappingEventId, closingTimePoint); - } - private RaceLogEvent loadRaceLogAdditionalScoringInformationEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { Object additionalScoringInformationTypeInfo = dbObject.get(FieldNames.RACE_LOG_ADDITIONAL_SCORING_INFORMATION_TYPE.name()); diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java index 831e06f6ef0..0a6c12bc51a 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java @@ -886,15 +886,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { result.put(FieldNames.RACE_LOG_EVENT.name(), storeRaceLogRegisterCompetitorEvent(event)); return result; } - - @SuppressWarnings("deprecation") - public DBObject storeRaceLogEntry(RaceLogIdentifier raceLogIdentifier, com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent event) { - BasicDBObject result = new BasicDBObject(); - storeRaceLogIdentifier(raceLogIdentifier, result); - result.put(FieldNames.RACE_LOG_EVENT.name(), storeRaceLogCloseOpenEndedDeviceMappingEvent(event)); - return result; - } - + public DBObject storeRaceLogEntry(RaceLogIdentifier raceLogIdentifier, RaceLogEndOfTrackingEvent event) { BasicDBObject result = new BasicDBObject(); storeRaceLogIdentifier(raceLogIdentifier, result); @@ -1054,16 +1046,6 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { return result; } - @SuppressWarnings("deprecation") - private Object storeRaceLogCloseOpenEndedDeviceMappingEvent(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent event) { - DBObject result = new BasicDBObject(); - storeRaceLogEventProperties(event, result); - result.put(FieldNames.RACE_LOG_EVENT_CLASS.name(), com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent.class.getSimpleName()); - result.put(FieldNames.RACE_LOG_DEVICE_MAPPING_EVENT_ID.name(), event.getDeviceMappingEventId()); - storeTimePoint(event.getClosingTimePoint(), result, FieldNames.RACE_LOG_CLOSING_TIMEPOINT); - return result; - } - public DBObject storeRaceLogEntry(RaceLogIdentifier raceLogIdentifier, RaceLogUseCompetitorsFromRaceLogEvent event) { DBObject result = new BasicDBObject(); storeRaceLogEventProperties(event, result); diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java index fc422c5671b..dbd2438d634 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java @@ -159,13 +159,6 @@ public class MongoRaceLogStoreVisitor implements RaceLogEventVisitor { DBObject object = mongoObjectFactory.storeRaceLogEntry(raceLogIdentifier, event); mongoObjectFactory.storeRaceLogEventEvent(object); } - - @SuppressWarnings("deprecation") - @Override - public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent event) { - DBObject object = mongoObjectFactory.storeRaceLogEntry(raceLogIdentifier, event); - mongoObjectFactory.storeRaceLogEventEvent(object); - } @Override public void visit(RaceLogAdditionalScoringInformationEvent event) { diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/regattalog/tracking/analyzing/test/AbstractRegattaLogTrackingTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/regattalog/tracking/analyzing/test/AbstractRegattaLogTrackingTest.java new file mode 100644 index 00000000000..cff23604d76 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/regattalog/tracking/analyzing/test/AbstractRegattaLogTrackingTest.java @@ -0,0 +1,29 @@ +package com.sap.sailing.domain.regattalog.tracking.analyzing.test; + +import org.junit.Before; + +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; +import com.sap.sailing.domain.abstractlog.regatta.impl.RegattaLogImpl; +import com.sap.sse.common.TimePoint; +import com.sap.sse.common.impl.MillisecondsTimePoint; + +public abstract class AbstractRegattaLogTrackingTest { + + protected RegattaLog log; + protected final AbstractLogEventAuthor author = new LogEventAuthorImpl("author0", 0); + protected final AbstractLogEventAuthor author1 = new LogEventAuthorImpl("author1", 1); + + protected final TimePoint now = MillisecondsTimePoint.now(); + + public AbstractRegattaLogTrackingTest() { + super(); + } + + @Before + public void setup() { + log = new RegattaLogImpl("log"); + } + +} \ No newline at end of file diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/DeviceMappingFinderTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/regattalog/tracking/analyzing/test/DeviceMappingFinderTest.java similarity index 82% rename from java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/DeviceMappingFinderTest.java rename to java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/regattalog/tracking/analyzing/test/DeviceMappingFinderTest.java index e6ce4f2410d..1360ce0dfd9 100644 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/DeviceMappingFinderTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/regattalog/tracking/analyzing/test/DeviceMappingFinderTest.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.racelog.tracking.analyzing.test; +package com.sap.sailing.domain.regattalog.tracking.analyzing.test; import static org.junit.Assert.assertEquals; @@ -11,9 +11,9 @@ import junit.framework.Assert; import org.junit.Test; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; -import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogCloseOpenEndedDeviceMappingEventImpl; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceCompetitorMappingEventImpl; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; +import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogCloseOpenEndedDeviceMappingEventImpl; +import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceCompetitorMappingEventImpl; import com.sap.sailing.domain.abstractlog.shared.analyzing.DeviceCompetitorMappingFinder; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.impl.CompetitorImpl; @@ -23,8 +23,7 @@ import com.sap.sailing.domain.racelogtracking.DeviceMapping; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; -@SuppressWarnings("deprecation") -public class DeviceMappingFinderTest extends AbstractRaceLogTrackingTest { +public class DeviceMappingFinderTest extends AbstractRegattaLogTrackingTest { private final Competitor competitor = new CompetitorImpl("comp", "Comp", null, null, null, null, null, /* timeOnTimeFactor */ null, /* timeOnDistanceAllowancePerNauticalMile */ null); private final Competitor competitor2 = new CompetitorImpl("comp2", "Comp2", null, null, null, null, null, /* timeOnTimeFactor */ null, /* timeOnDistanceAllowancePerNauticalMile */ null); private final DeviceIdentifier device = new SmartphoneImeiIdentifier("imei"); @@ -44,14 +43,14 @@ public class DeviceMappingFinderTest extends AbstractRaceLogTrackingTest { } private Serializable addMapping(AbstractLogEventAuthor author, DeviceIdentifier device, Long from, Long to, Competitor item) { - RaceLogEvent mapping = new RaceLogDeviceCompetitorMappingEventImpl(t(), t(), author, UUID.randomUUID(), 0, item, device, + RegattaLogEvent mapping = new RegattaLogDeviceCompetitorMappingEventImpl(t(), t(), author, UUID.randomUUID(), item, device, t(from), t(to)); log.add(mapping); return mapping.getId(); } private void closeMapping(AbstractLogEventAuthor author, DeviceIdentifier device, Serializable mappingId, long millis) { - RaceLogEvent mapping = new RaceLogCloseOpenEndedDeviceMappingEventImpl(t(), t(), author, UUID.randomUUID(), 0, mappingId, + RegattaLogEvent mapping = new RegattaLogCloseOpenEndedDeviceMappingEventImpl(t(), author, t(), UUID.randomUUID(), mappingId, new MillisecondsTimePoint(millis)); log.add(mapping); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventVisitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventVisitor.java index 7fff1ada55c..67a3c481704 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventVisitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventVisitor.java @@ -47,9 +47,6 @@ public interface RaceLogEventVisitor { public void visit(RaceLogStartTrackingEvent event); public void visit(RaceLogRegisterCompetitorEvent event); - - @SuppressWarnings("deprecation") - public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent event); public void visit(RaceLogAdditionalScoringInformationEvent additionalScoringInformation); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/AbstractRaceLogChangedVisitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/AbstractRaceLogChangedVisitor.java index 36ce88dcdef..554c364f869 100755 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/AbstractRaceLogChangedVisitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/AbstractRaceLogChangedVisitor.java @@ -121,12 +121,6 @@ public abstract class AbstractRaceLogChangedVisitor implements RaceLogEventVisit notifyListenerAboutEventAdded(event); } - @SuppressWarnings("deprecation") - @Override - public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent event) { - notifyListenerAboutEventAdded(event); - } - @Override public void visit(RaceLogAdditionalScoringInformationEvent additionalScoringInformation) { notifyListenerAboutEventAdded(additionalScoringInformation); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/BaseRaceLogEventVisitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/BaseRaceLogEventVisitor.java index 04130f6e66e..167c16b9ca1 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/BaseRaceLogEventVisitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/BaseRaceLogEventVisitor.java @@ -126,12 +126,6 @@ public abstract class BaseRaceLogEventVisitor implements RaceLogEventVisitor { @Override public void visit(RaceLogRegisterCompetitorEvent event) { - } - - @SuppressWarnings("deprecation") - @Override - public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent event) { - } @Override diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogCloseOpenEndedDeviceMappingEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogCloseOpenEndedDeviceMappingEvent.java deleted file mode 100644 index feb33021bd5..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogCloseOpenEndedDeviceMappingEvent.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.sap.sailing.domain.abstractlog.race.tracking; - -import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; -import com.sap.sailing.domain.abstractlog.shared.events.CloseOpenEndedDeviceMappingEvent; - -@Deprecated //bug2851 -public interface RaceLogCloseOpenEndedDeviceMappingEvent extends RaceLogEvent, -CloseOpenEndedDeviceMappingEvent { - -} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceLogOpenEndedDeviceMappingCloser.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceLogOpenEndedDeviceMappingCloser.java deleted file mode 100644 index b27516430b0..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceLogOpenEndedDeviceMappingCloser.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl; - -import java.io.Serializable; - -import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; -import com.sap.sailing.domain.abstractlog.race.RaceLog; -import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogCloseOpenEndedDeviceMappingEventImpl; -import com.sap.sailing.domain.abstractlog.shared.analyzing.OpenEndedDeviceMappingCloser; -import com.sap.sailing.domain.racelogtracking.DeviceMapping; -import com.sap.sse.common.TimePoint; - -@Deprecated //bug2851 -public class RaceLogOpenEndedDeviceMappingCloser extends - OpenEndedDeviceMappingCloser { - - public RaceLogOpenEndedDeviceMappingCloser(RaceLog log, DeviceMapping mapping, AbstractLogEventAuthor author, - TimePoint closingTimePoint) { - super(log, mapping, author, closingTimePoint); - } - - @Override - protected RaceLogCloseOpenEndedDeviceMappingEvent createCloseEvent(TimePoint logicalTimePoint, - Serializable eventToCloseId) { - return new RaceLogCloseOpenEndedDeviceMappingEventImpl( - logicalTimePoint, author, getLog().getCurrentPassId(), eventToCloseId, closingTimePoint); - } - -} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogCloseOpenEndedDeviceMappingEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogCloseOpenEndedDeviceMappingEventImpl.java deleted file mode 100644 index 00e8154d605..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogCloseOpenEndedDeviceMappingEventImpl.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.sap.sailing.domain.abstractlog.race.tracking.impl; - -import java.io.Serializable; -import java.util.List; - -import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; -import com.sap.sailing.domain.abstractlog.race.RaceLogEventData; -import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; -import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventDataImpl; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent; -import com.sap.sailing.domain.abstractlog.shared.events.impl.BaseCloseOpenEndedDeviceMappingEventImpl; -import com.sap.sailing.domain.base.Competitor; -import com.sap.sse.common.TimePoint; - -@Deprecated //bug2851 -public class RaceLogCloseOpenEndedDeviceMappingEventImpl extends - BaseCloseOpenEndedDeviceMappingEventImpl implements - RaceLogCloseOpenEndedDeviceMappingEvent { - private static final long serialVersionUID = -5114645637316367845L; - private final RaceLogEventData raceLogEventData; - - public RaceLogCloseOpenEndedDeviceMappingEventImpl(TimePoint createdAt, TimePoint logicalTimePoint, - AbstractLogEventAuthor author, Serializable id, int passId, Serializable deviceMappingEventId, - TimePoint closingTimePoint) { - super(createdAt, logicalTimePoint, author, id, deviceMappingEventId, closingTimePoint); - this.raceLogEventData = new RaceLogEventDataImpl(null, passId); - } - - public RaceLogCloseOpenEndedDeviceMappingEventImpl(TimePoint logicalTimePoint, AbstractLogEventAuthor author, - int passId, Serializable deviceMappingEventId, TimePoint closingTimePoint) { - this(now(), logicalTimePoint, author, randId(), passId, deviceMappingEventId, closingTimePoint); - } - - @Override - public int getPassId() { - return raceLogEventData.getPassId(); - } - - @Override - public List getInvolvedBoats() { - return raceLogEventData.getInvolvedBoats(); - } - - @Override - public String toString() { - return raceLogEventData.toString(); - } - - @Override - public void accept(RaceLogEventVisitor visitor) { - visitor.visit(this); - } -} diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java index cc17e516aa6..c3efc20740e 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java @@ -145,12 +145,6 @@ public class RaceColumnRaceLogReplicator implements RaceLogEventVisitor, Seriali public void visit(RaceLogRegisterCompetitorEvent event) { notifyOnAdd(event); } - - @SuppressWarnings("deprecation") - @Override - public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent event) { - notifyOnAdd(event); - } @Override public void visit(RaceLogFixedMarkPassingEvent event) { 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 4f24de66ed7..7afdc835482 100755 --- 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 @@ -26,6 +26,7 @@ import com.sap.sailing.domain.common.RankingMetrics; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.RegattaIdentifier; 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; @@ -563,7 +564,7 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS void revokeRaceAndRegattaLogEvents(String leaderboardName, List eventIds) throws NotRevokableException, DoesNotHaveRegattaLogException; - void closeOpenEndedDeviceMapping(String leaderboardName, DeviceMappingDTO mappingDto, Date closingTimePoint) throws TransformationException, DoesNotHaveRegattaLogException; + void closeOpenEndedDeviceMapping(String leaderboardName, DeviceMappingDTO mappingDto, Date closingTimePoint) throws TransformationException, DoesNotHaveRegattaLogException, UnableToCloseDeviceMappingException; void addDeviceMappingToRegattaLog(String leaderboardName, DeviceMappingDTO dto) throws NoCorrespondingServiceRegisteredException, TransformationException, DoesNotHaveRegattaLogException; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java index f0342de4024..21b3b2c836e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java @@ -3,7 +3,6 @@ package com.sap.sailing.gwt.ui.client; import com.google.gwt.core.client.GWT; import com.google.gwt.i18n.client.LocalizableResource.DefaultLocale; import com.google.gwt.json.client.JSONValue; -import com.google.gwt.safehtml.shared.SafeHtml; import com.sap.sse.gwt.client.DefaultRule_0_1_2_n; import com.sap.sse.gwt.client.DefaultRule_0_1_n; import com.sap.sse.gwt.client.DefaultRule_1_0n; 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 1bad69be7ce..d288eb50ae3 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 @@ -159,7 +159,7 @@ import com.sap.sailing.domain.common.PolarSheetsXYDiagramData; import com.sap.sailing.domain.common.Position; import com.sap.sailing.domain.common.RaceFetcher; import com.sap.sailing.domain.common.RaceIdentifier; -import com.sap.sailing.domain.common.RaceLogEventNotFoundException; +import com.sap.sailing.domain.common.UnableToCloseDeviceMappingException; import com.sap.sailing.domain.common.RankingMetrics; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.RegattaFetcher; @@ -5434,43 +5434,28 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S } } - private void closeOpenEndedDeviceMapping(List> logHierarchy, DeviceMappingDTO mappingDTO, Date closingTimePoint) throws TransformationException, RaceLogEventNotFoundException { + private void closeOpenEndedDeviceMapping(RegattaLog regattaLog, DeviceMappingDTO mappingDTO, Date closingTimePoint) throws TransformationException, UnableToCloseDeviceMappingException { boolean successfullyClosed = false; - for (AbstractLog abstractLog : logHierarchy) { - //check if abstractLog is the correct log for the closingEvent - final AbstractLogEvent event; - abstractLog.lockForRead(); - try { - event = abstractLog.getEventById(mappingDTO.originalRaceLogEventIds.get(0)); - } finally { - abstractLog.unlockAfterRead(); - } + regattaLog.lockForRead(); + try { + RegattaLogEvent event = regattaLog.getEventById(mappingDTO.originalRaceLogEventIds.get(0)); + if (event != null) { successfullyClosed = true; DeviceMapping mapping = convertToDeviceMapping(mappingDTO); - if (abstractLog instanceof RegattaLog) { - RegattaLog regattaLog = (RegattaLog) abstractLog; - List closingEvents = - new RegattaLogOpenEndedDeviceMappingCloser(regattaLog, mapping, getService().getServerAuthor(), - new MillisecondsTimePoint(closingTimePoint)).analyze(); - for (RegattaLogEvent closingEvent : closingEvents) { - regattaLog.add(closingEvent); - } - } else if (abstractLog instanceof RaceLog) { - RaceLog raceLog = (RaceLog) abstractLog; - @SuppressWarnings("deprecation") - List closingEvents = - new com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogOpenEndedDeviceMappingCloser(raceLog, mapping, getService().getServerAuthor(), - new MillisecondsTimePoint(closingTimePoint)).analyze(); - for (RaceLogEvent closingEvent : closingEvents) { - raceLog.add(closingEvent); - } + List closingEvents = + new RegattaLogOpenEndedDeviceMappingCloser(regattaLog, mapping, getService().getServerAuthor(), + new MillisecondsTimePoint(closingTimePoint)).analyze(); + for (RegattaLogEvent closingEvent : closingEvents) { + regattaLog.add(closingEvent); } } + } finally { + regattaLog.unlockAfterRead(); } - + if (!successfullyClosed){ - throw new RaceLogEventNotFoundException(); + throw new UnableToCloseDeviceMappingException(); } } @@ -5871,24 +5856,9 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S } @Override - public void closeOpenEndedDeviceMapping(String leaderboardName, DeviceMappingDTO mappingDTO, Date closingTimePoint) throws TransformationException, DoesNotHaveRegattaLogException { + public void closeOpenEndedDeviceMapping(String leaderboardName, DeviceMappingDTO mappingDTO, Date closingTimePoint) throws TransformationException, DoesNotHaveRegattaLogException, UnableToCloseDeviceMappingException { RegattaLog regattaLog = getRegattaLogInternal(leaderboardName); - - List> logList = new ArrayList<>(); - logList.add(regattaLog); - try { - closeOpenEndedDeviceMapping(logList, mappingDTO, closingTimePoint); - } catch (RaceLogEventNotFoundException e) { - logger.warning("Device Mapping Event couldn't be found on RegattaLog, checking in RaceLog (deprecated)"); - - List> logs = getLogHierarchy(leaderboardName); - try { - closeOpenEndedDeviceMapping(logs, mappingDTO, closingTimePoint); - } catch (RaceLogEventNotFoundException e1) { - logger.warning("Device Mapping Event could also not be found in RaceLogs"); - } - } - + closeOpenEndedDeviceMapping(regattaLog, mappingDTO, closingTimePoint); } /** diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java index 15c4f43cb61..652508f334c 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java @@ -33,12 +33,10 @@ import com.sap.sailing.domain.abstractlog.race.impl.RaceLogPassChangeEventImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogRaceStatusEventImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogRevokeEventImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogStartTimeEventImpl; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogCloseOpenEndedDeviceMappingEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDenoteForTrackingEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceCompetitorMappingEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceMarkMappingEventImpl; @@ -273,20 +271,6 @@ public class StoreAndLoadRaceLogEventsTest extends AbstractMongoDBTest { assertEquals(expectedEvent.getCompetitor(), actualEvent.getCompetitor()); } - @Test - public void testStoreAndLoadCloseOpenDeviceMappingEvent() { - RaceLogCloseOpenEndedDeviceMappingEvent expectedEvent = new RaceLogCloseOpenEndedDeviceMappingEventImpl( - expectedEventTime, expectedEventTime, author, expectedId, expectedPassId, UUID.randomUUID(), - new MillisecondsTimePoint(49)); - - DBObject dbObject = mongoFactory.storeRaceLogEntry(logIdentifier, expectedEvent); - RaceLogCloseOpenEndedDeviceMappingEvent actualEvent = loadEvent(dbObject); - - assertBaseFields(expectedEvent, actualEvent); - assertEquals(expectedEvent.getDeviceMappingEventId(), actualEvent.getDeviceMappingEventId()); - assertEquals(expectedEvent.getClosingTimePoint(), actualEvent.getClosingTimePoint()); - } - /** * Will always wait a couple of milliseconds to ensure that {@link RaceLogEvent#getCreatedAt()} has passed. */ diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogCloseOpenEndedDeviceMappingEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogCloseOpenEndedDeviceMappingEventDeserializer.java deleted file mode 100644 index 70da19617f1..00000000000 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogCloseOpenEndedDeviceMappingEventDeserializer.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.sap.sailing.server.gateway.deserialization.racelog.impl; - -import java.io.Serializable; -import java.util.List; - -import org.json.simple.JSONObject; - -import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; -import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; -import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; -import com.sap.sailing.server.gateway.deserialization.impl.Helpers; -import com.sap.sse.common.TimePoint; -import com.sap.sse.common.impl.MillisecondsTimePoint; - -public class RaceLogCloseOpenEndedDeviceMappingEventDeserializer extends BaseRaceLogEventDeserializer { - public static final String FIELD_DEVICE_MAPPING_EVENT_ID = "deviceMappingEventId"; - public static final String FIELD_CLOSING_TIMEPOINT_MILLIS = "closingTimePointMillis"; - - public RaceLogCloseOpenEndedDeviceMappingEventDeserializer(JsonDeserializer competitorDeserializer) { - super(competitorDeserializer); - } - - @SuppressWarnings("deprecation") - @Override - protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, AbstractLogEventAuthor author, TimePoint timePoint, int passId, List competitors) - throws JsonDeserializationException { - Serializable deviceMappingEventId = Helpers.tryUuidConversion((Serializable) object.get(FIELD_DEVICE_MAPPING_EVENT_ID)); - TimePoint closingTimePoint = new MillisecondsTimePoint((Long) object.get(FIELD_CLOSING_TIMEPOINT_MILLIS)); - - return new com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogCloseOpenEndedDeviceMappingEventImpl(createdAt, timePoint, author, id, passId, - deviceMappingEventId, closingTimePoint); - } -} diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogEventDeserializer.java index 9ef80731458..b4d8ae9c002 100755 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogEventDeserializer.java @@ -20,7 +20,6 @@ import com.sap.sailing.server.gateway.deserialization.impl.PositionJsonDeseriali import com.sap.sailing.server.gateway.deserialization.impl.WindJsonDeserializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.BaseRaceLogEventSerializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogAdditionalScoringInformationSerializer; -import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogCloseOpenEndedDeviceMappingEventSerializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogCourseAreaChangedEventSerializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogCourseDesignChangedEventSerializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogDenoteForTrackingEventSerializer; @@ -86,7 +85,6 @@ public class RaceLogEventDeserializer implements JsonDeserializer new RaceLogStartTrackingEventDeserializer(competitorDeserializer), new RaceLogRevokeEventDeserializer(competitorDeserializer), new RaceLogRegisterCompetitorEventDeserializer(competitorDeserializer), - new RaceLogCloseOpenEndedDeviceMappingEventDeserializer(competitorDeserializer), new RaceLogAdditionalScoringInformationEventDeserializer(competitorDeserializer), new RaceLogFixedMarkPassingEventDeserializer(competitorDeserializer), new RaceLogSuppressedMarkPassingsEventDeserializer(competitorDeserializer), @@ -115,7 +113,6 @@ public class RaceLogEventDeserializer implements JsonDeserializer protected final JsonDeserializer startTrackingEventDeserializer; protected final JsonDeserializer revokeEventDeserializer; protected final JsonDeserializer registerCompetitorEventDeserializer; - protected final JsonDeserializer closeOpenEndedDeviceMappingEventDeserializer; protected final JsonDeserializer additionalScoringInformationEventDeserializer; protected final JsonDeserializer fixedMarkPassingEventDeserializer; protected final JsonDeserializer suppressedMarkPassingsDeserializer; @@ -143,7 +140,6 @@ public class RaceLogEventDeserializer implements JsonDeserializer JsonDeserializer startTrackingEventDeserializer, JsonDeserializer revokeEventDeserializer, JsonDeserializer registerCompetitorEventDeserializer, - JsonDeserializer closeOpenEndedDeviceMappingEventDeserializer, JsonDeserializer additionalScoringInformationEventDeserializer, JsonDeserializer fixedMarkPassingEventDeserializer, JsonDeserializer suppressedMarkPassingsEventDeserializer, @@ -170,7 +166,6 @@ public class RaceLogEventDeserializer implements JsonDeserializer this.startTrackingEventDeserializer = startTrackingEventDeserializer; this.revokeEventDeserializer = revokeEventDeserializer; this.registerCompetitorEventDeserializer = registerCompetitorEventDeserializer; - this.closeOpenEndedDeviceMappingEventDeserializer = closeOpenEndedDeviceMappingEventDeserializer; this.additionalScoringInformationEventDeserializer = additionalScoringInformationEventDeserializer; this.fixedMarkPassingEventDeserializer = fixedMarkPassingEventDeserializer; this.suppressedMarkPassingsDeserializer = suppressedMarkPassingsEventDeserializer; @@ -222,8 +217,6 @@ public class RaceLogEventDeserializer implements JsonDeserializer return revokeEventDeserializer; } else if (type.equals(RaceLogRegisterCompetitorEventSerializer.VALUE_CLASS)) { return registerCompetitorEventDeserializer; - } else if (type.equals(RaceLogCloseOpenEndedDeviceMappingEventSerializer.VALUE_CLASS)) { - return closeOpenEndedDeviceMappingEventDeserializer; } else if (type.equals(RaceLogAdditionalScoringInformationSerializer.VALUE_CLASS)) { return additionalScoringInformationEventDeserializer; } else if (type.equals(RaceLogFixedMarkPassingEventSerializer.VALUE_CLASS)) { diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogCloseOpenEndedDeviceMappingEventSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogCloseOpenEndedDeviceMappingEventSerializer.java deleted file mode 100644 index 8975a845a01..00000000000 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogCloseOpenEndedDeviceMappingEventSerializer.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.sap.sailing.server.gateway.serialization.racelog.impl; - -import org.json.simple.JSONObject; - -import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.abstractlog.shared.events.CloseOpenEndedDeviceMappingEvent; -import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.server.gateway.deserialization.racelog.impl.RaceLogCloseOpenEndedDeviceMappingEventDeserializer; -import com.sap.sailing.server.gateway.serialization.JsonSerializer; - -public class RaceLogCloseOpenEndedDeviceMappingEventSerializer extends BaseRaceLogEventSerializer { - public static final String VALUE_CLASS = CloseOpenEndedDeviceMappingEvent.class.getSimpleName(); - - public RaceLogCloseOpenEndedDeviceMappingEventSerializer(JsonSerializer competitorSerializer) { - super(competitorSerializer); - } - - @Override - protected String getClassFieldValue() { - return VALUE_CLASS; - } - - @SuppressWarnings("deprecation") - @Override - public JSONObject serialize(RaceLogEvent object) { - com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent event = (com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent) object; - - JSONObject result = super.serialize(event); - result.put(RaceLogCloseOpenEndedDeviceMappingEventDeserializer.FIELD_DEVICE_MAPPING_EVENT_ID, event.getDeviceMappingEventId()); - result.put(RaceLogCloseOpenEndedDeviceMappingEventDeserializer.FIELD_CLOSING_TIMEPOINT_MILLIS, event.getClosingTimePoint().asMillis()); - - return result; - } - -} diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java index d54a63534c9..2417ca50c1c 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java @@ -78,7 +78,6 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac new RaceLogStartTrackingEventSerializer(competitorSerializer), new RaceLogRevokeEventSerializer(competitorSerializer), new RaceLogRegisterCompetitorEventSerializer(competitorSerializer), - new RaceLogCloseOpenEndedDeviceMappingEventSerializer(competitorSerializer), new RaceLogAdditionalScoringInformationSerializer(competitorSerializer), new RaceLogFixedMarkPassingEventSerializer(competitorSerializer), new RaceLogSuppressedMarkPassingsEventSerializer(competitorSerializer), @@ -107,7 +106,6 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac private final JsonSerializer startTrackingSerializer; private final JsonSerializer revokeSerializer; private final JsonSerializer registerCompetitorSerializer; - private final JsonSerializer closeOpenEndedDeviceMappingEventSerializer; private final JsonSerializer additionalScoringInformationSerializer; private final JsonSerializer fixedMarkPassingEventSerializer; private final JsonSerializer suppressedMarkPassingsEventSerializer; @@ -139,7 +137,6 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac JsonSerializer createRaceSerializer, JsonSerializer revokeSerializer, JsonSerializer registerCompetitorSerializer, - JsonSerializer closeOpenEndedDeviceMappingEventSerializer, JsonSerializer additionalScoringInformationSerializer, JsonSerializer fixedMarkPassingEventSerializer, JsonSerializer suppressedMarkPassingsSerializer, @@ -166,7 +163,6 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac this.startTrackingSerializer = createRaceSerializer; this.revokeSerializer = revokeSerializer; this.registerCompetitorSerializer = registerCompetitorSerializer; - this.closeOpenEndedDeviceMappingEventSerializer = closeOpenEndedDeviceMappingEventSerializer; this.additionalScoringInformationSerializer = additionalScoringInformationSerializer; this.fixedMarkPassingEventSerializer = fixedMarkPassingEventSerializer; this.suppressedMarkPassingsEventSerializer = suppressedMarkPassingsSerializer; @@ -287,22 +283,14 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac chosenSerializer = registerCompetitorSerializer; } - @SuppressWarnings("deprecation") - @Override - public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent event) { - chosenSerializer = closeOpenEndedDeviceMappingEventSerializer; - } - @Override public void visit(RaceLogAdditionalScoringInformationEvent additionalScoringInformation) { chosenSerializer = additionalScoringInformationSerializer; - } - @Override + @Override public void visit(RaceLogFixedMarkPassingEvent event) { chosenSerializer = fixedMarkPassingEventSerializer; - } @Override diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java index bc0c036c484..3ee233c2bb9 100644 --- a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java +++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java @@ -25,7 +25,6 @@ import com.sap.sailing.domain.abstractlog.race.impl.RaceLogRevokeEventImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogStartProcedureChangedEventImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogStartTimeEventImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogWindFixEventImpl; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogCloseOpenEndedDeviceMappingEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDenoteForTrackingEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceCompetitorMappingEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceMarkMappingEventImpl; @@ -62,7 +61,6 @@ public class RaceLogEventSerializerTest { private JsonSerializer startTrackingEventSerializer; private JsonSerializer revokeEventSerializer; private JsonSerializer registerCompetitorEventSerializer; - private JsonSerializer closeOpenEndedDeviceMappingEventSerializer; private JsonSerializer additionalScoringInformationSerializer; private JsonSerializer fixedMarkPassingEventSerializer; private JsonSerializer suppressedMarkPassingsSerializer; @@ -95,7 +93,6 @@ public class RaceLogEventSerializerTest { startTrackingEventSerializer = mock(JsonSerializer.class); revokeEventSerializer = mock(JsonSerializer.class); registerCompetitorEventSerializer = mock(JsonSerializer.class); - closeOpenEndedDeviceMappingEventSerializer = mock(JsonSerializer.class); additionalScoringInformationSerializer = mock(JsonSerializer.class); fixedMarkPassingEventSerializer = mock(JsonSerializer.class); suppressedMarkPassingsSerializer = mock(JsonSerializer.class); @@ -111,8 +108,7 @@ public class RaceLogEventSerializerTest { startProcedureTypeChangedEventSerializer, protestStartTimeEventSerializer, windFixEventSerializer, deviceCompetitorMappingEventSerializer, deviceMarkMappingEventSerializer, denoteForTrackingEventSerializer, startTrackingEventSerializer, revokeEventSerializer, - registerCompetitorEventSerializer, closeOpenEndedDeviceMappingEventSerializer, - fixedMarkPassingEventSerializer, suppressedMarkPassingsSerializer, + registerCompetitorEventSerializer, fixedMarkPassingEventSerializer, suppressedMarkPassingsSerializer, additionalScoringInformationSerializer, dependentStartTimeEventSerializer, startOfTrackingEventSerializer, useCompetitorsFromRaceLogEventSerializer, endOfTrackingEventSerializer); @@ -273,12 +269,4 @@ public class RaceLogEventSerializerTest { serializer.serialize(event); verify(registerCompetitorEventSerializer).serialize(event); } - - @Test - public void testCloseOpenEndedDeviceMappingEventSerializer() { - // we use the real event type here because we do not want to re-implement the dispatching. - RaceLogEvent event = new RaceLogCloseOpenEndedDeviceMappingEventImpl(null, author, 0, null, null); - serializer.serialize(event); - verify(closeOpenEndedDeviceMappingEventSerializer).serialize(event); - } } From ab6882b1c6c0c557fa531beb04439c64b48f1d9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Thu, 10 Dec 2015 15:42:36 +0100 Subject: [PATCH 055/165] Fix pingMarpping test for now --- .../gateway/jaxrs/api/LeaderboardsResourcePingMarkTest.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourcePingMarkTest.java b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourcePingMarkTest.java index d38a13b0840..6285ecd2a37 100644 --- a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourcePingMarkTest.java +++ b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourcePingMarkTest.java @@ -67,7 +67,6 @@ public class LeaderboardsResourcePingMarkTest extends AbstractJaxRsApiTest { new HighPoint(), 0, null, OneDesignRankingMetric::new); racingEventService.addRegattaWithoutReplication(regatta); leaderboard = racingEventService.addRegattaLeaderboard(regatta.getRegattaIdentifier(), "regatta", new int[] {}); - log = leaderboard.getRegattaLike().getRegattaLog(); } @@ -90,7 +89,7 @@ public class LeaderboardsResourcePingMarkTest extends AbstractJaxRsApiTest { assertThat("response is ok", response.getStatus(), equalTo(Response.Status.OK.getStatusCode())); Map>> mappings = new DeviceMarkMappingFinder<>(log).analyze(); List> mappingsForMark = mappings.get(mark); - assertThat("two additional mappings were created for the second ping", mappingsForMark.size(), equalTo(3)); + assertThat("Assert an additional mapping was created for the second ping", mappingsForMark.size(), equalTo(2)); assertOneFixPerMapping(mappingsForMark); } } @@ -103,5 +102,4 @@ public class LeaderboardsResourcePingMarkTest extends AbstractJaxRsApiTest { assertThat("all fixes stored", racingEventService.getGPSFixStore().getNumberOfFixes(device), equalTo(1L)); } } - } From 7414026cdec6010a297f1b63d8750ff51fe8aed2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Thu, 10 Dec 2015 18:00:27 +0100 Subject: [PATCH 056/165] Removes RaceLogDeviceCompetitorMapping (bug2851) --- .../impl/DomainObjectFactoryImpl.java | 23 +--- .../impl/MongoObjectFactoryImpl.java | 17 --- .../impl/MongoRaceLogStoreVisitor.java | 13 +- .../test/AbstractGPSFixStoreTest.java | 6 +- .../impl/CreateAndTrackWithRaceLogTest.java | 6 +- .../test/impl/TrackedRaceLoadsFixesTest.java | 1 + .../impl/RaceLogRaceTracker.java | 6 - .../analyzing/test/MultiLogAnalyzerTest.java | 84 ----------- .../test/SerializeRaceLogEventsTest.java | 27 ---- .../analyzing/test/RevokeEventTest.java | 61 -------- .../analyzing/test/RevokeEventTest.java | 61 ++++++++ .../abstractlog/race/RaceLogEventVisitor.java | 3 - .../impl/AbstractRaceLogChangedVisitor.java | 6 - .../race/impl/BaseRaceLogEventVisitor.java | 6 - .../RaceLogDeviceCompetitorMappingEvent.java | 10 -- .../tracking/RaceLogStartTrackingEvent.java | 1 - ...ceLogDeviceCompetitorMappingEventImpl.java | 31 ----- .../impl/RaceColumnRaceLogReplicator.java | 6 - .../StoreAndLoadDeviceIdentifierTest.java | 38 +++-- .../test/StoreAndLoadRaceLogEventsTest.java | 23 ---- ...iceCompetitorMappingEventDeserializer.java | 33 ----- .../impl/RaceLogEventDeserializer.java | 7 - .../racelog/impl/RaceLogEventSerializer.java | 10 -- .../racelog/RaceLogEventSerializerTest.java | 13 +- .../test/RaceLogSerializationTest.java | 130 ------------------ 25 files changed, 91 insertions(+), 531 deletions(-) delete mode 100644 java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/MultiLogAnalyzerTest.java delete mode 100644 java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/RevokeEventTest.java create mode 100644 java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/regattalog/tracking/analyzing/test/RevokeEventTest.java delete mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogDeviceCompetitorMappingEvent.java delete mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogDeviceCompetitorMappingEventImpl.java delete mode 100644 java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDeviceCompetitorMappingEventDeserializer.java delete mode 100644 java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/RaceLogSerializationTest.java diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java index 658deb69828..8c2622c5a6a 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java @@ -83,12 +83,10 @@ import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformat import com.sap.sailing.domain.abstractlog.race.scoring.RaceLogAdditionalScoringInformationEvent; import com.sap.sailing.domain.abstractlog.race.scoring.impl.RaceLogAdditionalScoringInformationEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDenoteForTrackingEventImpl; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceCompetitorMappingEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogRegisterCompetitorEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogStartTrackingEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogUseCompetitorsFromRaceLogEventImpl; @@ -1362,8 +1360,6 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { return loadRaceLogProtestStartTimeEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(RaceLogWindFixEvent.class.getSimpleName())) { return loadRaceLogWindFixEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); - } else if (eventClass.equals(RaceLogDeviceCompetitorMappingEvent.class.getSimpleName())) { - return loadRaceLogDeviceCompetitorMappingEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent.class.getSimpleName())) { return loadRaceLogDeviceMarkMappingEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(RaceLogDenoteForTrackingEvent.class.getSimpleName())) { @@ -1398,24 +1394,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { Boolean isMagnetic = (Boolean) dbObject.get(FieldNames.IS_MAGNETIC.name()); return new RaceLogWindFixEventImpl(createdAt, logicalTimePoint, author, id, passId, wind, isMagnetic == null ? true : isMagnetic); } - - private RaceLogEvent loadRaceLogDeviceCompetitorMappingEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, - Serializable id, Integer passId, List competitors, DBObject dbObject) { - DeviceIdentifier device = null; - try { - device = loadDeviceId(deviceIdentifierServiceFinder, - (DBObject) dbObject.get(FieldNames.DEVICE_ID.name())); - } catch (Exception e) { - logger.log(Level.WARNING, "Could not load deviceId for RaceLogEvent", e); - e.printStackTrace(); - } - Competitor mappedTo = baseDomainFactory.getExistingCompetitorById( - (Serializable) dbObject.get(FieldNames.COMPETITOR_ID.name())); - TimePoint from = loadTimePoint(dbObject, FieldNames.RACE_LOG_FROM); - TimePoint to = loadTimePoint(dbObject, FieldNames.RACE_LOG_TO); - return new RaceLogDeviceCompetitorMappingEventImpl(createdAt, logicalTimePoint, author, id, passId, mappedTo, device, from, to); - } - + @SuppressWarnings("deprecation") private RaceLogEvent loadRaceLogDeviceMarkMappingEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java index 0a6c12bc51a..c7611329b4b 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java @@ -41,7 +41,6 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogSuppressedMarkPassingsEven import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; import com.sap.sailing.domain.abstractlog.race.scoring.RaceLogAdditionalScoringInformationEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; @@ -843,13 +842,6 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { result.put(FieldNames.RACE_LOG_EVENT.name(), storeRaceLogWindFix(event)); return result; } - - public DBObject storeRaceLogEntry(RaceLogIdentifier raceLogIdentifier, RaceLogDeviceCompetitorMappingEvent event) { - BasicDBObject result = new BasicDBObject(); - storeRaceLogIdentifier(raceLogIdentifier, result); - result.put(FieldNames.RACE_LOG_EVENT.name(), storeRaceLogDeviceCompetitorMappingEvent(event)); - return result; - } @SuppressWarnings("deprecation") public DBObject storeRaceLogEntry(RaceLogIdentifier raceLogIdentifier, com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent event) { @@ -991,15 +983,6 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { } } - private Object storeRaceLogDeviceCompetitorMappingEvent(RaceLogDeviceCompetitorMappingEvent event) { - DBObject result = new BasicDBObject(); - storeRaceLogEventProperties(event, result); - result.put(FieldNames.RACE_LOG_EVENT_CLASS.name(), RaceLogDeviceCompetitorMappingEvent.class.getSimpleName()); - storeDeviceMappingEvent(event, result, FieldNames.RACE_LOG_FROM, FieldNames.RACE_LOG_TO); - result.put(FieldNames.COMPETITOR_ID.name(), event.getMappedTo().getId()); - return result; - } - @SuppressWarnings("deprecation") private Object storeRaceLogDeviceMarkMappingEvent(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent event) { DBObject result = new BasicDBObject(); diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java index dbd2438d634..93c75ba1fa8 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java @@ -3,14 +3,14 @@ package com.sap.sailing.domain.persistence.impl; import java.util.logging.Logger; import com.mongodb.DBObject; -import com.sap.sailing.domain.abstractlog.race.RaceLogEndOfTrackingEvent; -import com.sap.sailing.domain.abstractlog.race.RaceLogFixedMarkPassingEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogCourseAreaChangedEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogDependentStartTimeEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEndOfTrackingEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningListChangedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFixedMarkPassingEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogGateLineOpeningTimeEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogPassChangeEvent; @@ -21,11 +21,10 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogRevokeEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogStartOfTrackingEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogStartProcedureChangedEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent; -import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogSuppressedMarkPassingsEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; import com.sap.sailing.domain.abstractlog.race.scoring.RaceLogAdditionalScoringInformationEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; @@ -123,12 +122,6 @@ public class MongoRaceLogStoreVisitor implements RaceLogEventVisitor { mongoObjectFactory.storeRaceLogEventEvent(object); } - @Override - public void visit(RaceLogDeviceCompetitorMappingEvent event) { - DBObject object = mongoObjectFactory.storeRaceLogEntry(raceLogIdentifier, event); - mongoObjectFactory.storeRaceLogEventEvent(object); - } - @SuppressWarnings("deprecation") @Override public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent event) { diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java index e696a5cf9b5..4d7877d860b 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java @@ -10,8 +10,9 @@ import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogImpl; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceCompetitorMappingEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceMarkMappingEventImpl; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; +import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceCompetitorMappingEventImpl; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.DomainFactory; import com.sap.sailing.domain.base.Mark; @@ -41,6 +42,7 @@ public class AbstractGPSFixStoreTest { new MockDeviceAndSessionIdentifierWithGPSFixesDeserializer(); protected final DeviceIdentifier device = new SmartphoneImeiIdentifier("a"); protected RaceLog raceLog; + protected RegattaLog regattaLog; protected GPSFixStore store; protected final Competitor comp = DomainFactory.INSTANCE.getOrCreateCompetitor("comp", "comp", null, null, null, null, null, /* timeOnTimeFactor */ null, /* timeOnDistanceAllowanceInSecondsPerNauticalMile */ null); protected final Mark mark = DomainFactory.INSTANCE.getOrCreateMark("mark"); @@ -68,7 +70,7 @@ public class AbstractGPSFixStoreTest { } protected void map(RaceLog raceLog, Competitor comp, DeviceIdentifier device, long from, long to) { - raceLog.add(new RaceLogDeviceCompetitorMappingEventImpl(MillisecondsTimePoint.now(), author, 0, + regattaLog.add(new RegattaLogDeviceCompetitorMappingEventImpl(MillisecondsTimePoint.now(), MillisecondsTimePoint.now(), author, 0, comp, device, new MillisecondsTimePoint(from), new MillisecondsTimePoint(to))); } diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java index 74162e448fe..403e239ee22 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java @@ -19,7 +19,6 @@ import org.junit.rules.ExpectedException; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.race.RaceLog; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceCompetitorMappingEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogRegisterCompetitorEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogUseCompetitorsFromRaceLogEventImpl; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; @@ -161,6 +160,7 @@ public class CreateAndTrackWithRaceLogTest { Exception { RaceColumn column = leaderboard.getRaceColumnByName(columnName); + RegattaLog regattaLog = leaderboard.getRegattaLike().getRegattaLog(); RaceLog raceLog = column.getRaceLog(fleet); // can denote racelog for tracking @@ -172,7 +172,7 @@ public class CreateAndTrackWithRaceLogTest { Competitor comp1 = DomainFactory.INSTANCE.getOrCreateCompetitor("comp1", "comp1", null, null, null, null, null, /* timeOnTimeFactor */ null, /* timeOnDistanceAllowancePerNauticalMile */ null); DeviceIdentifier dev1 = new SmartphoneImeiIdentifier("dev1"); - raceLog.add(new RaceLogDeviceCompetitorMappingEventImpl(t(), author, 0, comp1, dev1, t(0), t(10))); + regattaLog.add(new RegattaLogDeviceCompetitorMappingEventImpl(t(), t(), author, 0, comp1, dev1, t(0), t(10))); addFixes0(dev1); raceLog.add(new RaceLogUseCompetitorsFromRaceLogEventImpl(t(), author, t(), UUID.randomUUID(), 0)); raceLog.add(new RaceLogRegisterCompetitorEventImpl(t(), author, 0, comp1)); @@ -185,7 +185,7 @@ public class CreateAndTrackWithRaceLogTest { race.waitForLoadingFromGPSFixStoreToFinishRunning(raceLog); addFixes1(race, comp1, dev1); - raceLog.add(new RaceLogDeviceCompetitorMappingEventImpl(t(), author, 0, comp1, dev1, t(11), t(20))); + regattaLog.add(new RegattaLogDeviceCompetitorMappingEventImpl(t(), t(), author, 0, comp1, dev1, t(11), t(20))); // add another mapping on the fly, other old fixes should be loaded addFixes2(race, comp1, dev1); diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java index 501f9f43025..6aed04386ee 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java @@ -80,6 +80,7 @@ public class TrackedRaceLoadsFixesTest extends AbstractGPSFixStoreTest { trackedRace.setEndOfTrackingReceived(new MillisecondsTimePoint(2000)); trackedRace.attachRaceLog(raceLog); + trackedRace.attachRegattaLog(regattaLog); trackedRace.waitForLoadingFromGPSFixStoreToFinishRunning(raceLog); testNumberOfRawFixes(trackedRace.getTrack(comp), 1); diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java index 3842fbc7bab..f81c9cd399a 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java @@ -24,7 +24,6 @@ import com.sap.sailing.domain.abstractlog.race.analyzing.impl.LastPublishedCours import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver; import com.sap.sailing.domain.abstractlog.race.impl.BaseRaceLogEventVisitor; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceInformationFinder; import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer; @@ -127,11 +126,6 @@ public class RaceLogRaceTracker implements RaceTracker, GPSFixReceivedListener { for (AbstractLog log : params.getLogHierarchy()) { if (log instanceof RaceLog) { RaceLogEventVisitor visitor = new BaseRaceLogEventVisitor() { - @Override - public void visit(RaceLogDeviceCompetitorMappingEvent event) { - RaceLogRaceTracker.this.onDeviceCompetitorMappingEvent(event); - } - @Override public void visit(@SuppressWarnings("deprecation") com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent event) { RaceLogRaceTracker.this.onDeviceMarkMappingEvent(event); diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/MultiLogAnalyzerTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/MultiLogAnalyzerTest.java deleted file mode 100644 index 831a133413f..00000000000 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/MultiLogAnalyzerTest.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.sap.sailing.domain.racelog.analyzing.test; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.equalTo; - -import java.util.List; -import java.util.Map; -import java.util.UUID; - -import org.junit.Before; -import org.junit.Test; - -import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; -import com.sap.sailing.domain.abstractlog.MultiLogAnalyzer; -import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; -import com.sap.sailing.domain.abstractlog.race.RaceLog; -import com.sap.sailing.domain.abstractlog.race.impl.RaceLogImpl; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceCompetitorMappingEventImpl; -import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; -import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceCompetitorMappingEventImpl; -import com.sap.sailing.domain.abstractlog.regatta.impl.RegattaLogImpl; -import com.sap.sailing.domain.abstractlog.shared.analyzing.DeviceMappingFinder; -import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.base.impl.CompetitorImpl; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; -import com.sap.sailing.domain.racelogtracking.DeviceMapping; -import com.sap.sailing.domain.racelogtracking.impl.SmartphoneUUIDIdentifierImpl; -import com.sap.sse.common.TimePoint; -import com.sap.sse.common.WithID; -import com.sap.sse.common.impl.MillisecondsTimePoint; - -public class MultiLogAnalyzerTest { - private static TimePoint now() { - return MillisecondsTimePoint.now(); - } - - private static TimePoint t(long millis) { - return new MillisecondsTimePoint(millis); - } - - private RaceLog raceLog; - private RegattaLog regattaLog; - private AbstractLogEventAuthor author; - - private static Competitor createCompetitor(int n) { - return new CompetitorImpl(n, n + "", null, null, null, null, null, /* timeOnTimeFactor */ null, /* timeOnDistanceAllowancePerNauticalMile */ null); - } - - private static DeviceIdentifier createDevice() { - return new SmartphoneUUIDIdentifierImpl(UUID.randomUUID()); - } - - @Before - public void setup() { - raceLog = new RaceLogImpl(0); - regattaLog = new RegattaLogImpl(0); - author = new LogEventAuthorImpl("test", 0); - } - - @Test - public void deviceMappingsInRaceAndRegattaLog() { - Competitor c1 = createCompetitor(1); - Competitor c2 = createCompetitor(2); - - DeviceIdentifier d1 = createDevice(); - DeviceIdentifier d2 = createDevice(); - - raceLog.add(new RaceLogDeviceCompetitorMappingEventImpl(now(), now(), author, 0, 0, c1, d1, t(0), t(10))); - raceLog.add(new RaceLogDeviceCompetitorMappingEventImpl(now(), now(), author, 1, 0, c1, d2, t(30), t(40))); - regattaLog.add(new RegattaLogDeviceCompetitorMappingEventImpl(now(), now(), author, 2, c2, d2, t(10), t(20))); - - // and one for same item (competitor) in other log - regattaLog.add(new RegattaLogDeviceCompetitorMappingEventImpl(now(), now(), author, 3, c1, d1, t(10), - t(20))); - - Map>> result = new MultiLogAnalyzer<>( - new DeviceMappingFinder.Factory<>(), new MultiLogAnalyzer.MapWithValueCollectionReducer<>(), raceLog, - regattaLog).analyze(); - - assertThat("mappings for two competitors", result.size(), equalTo(2)); - assertThat("three mappings for competitor 1 ", result.get(c1).size(), equalTo(3)); - assertThat("one mapping for competitor 2", result.get(c2).size(), equalTo(1)); - } -} diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/SerializeRaceLogEventsTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/SerializeRaceLogEventsTest.java index b2bc042d036..11c5f87fe94 100755 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/SerializeRaceLogEventsTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/SerializeRaceLogEventsTest.java @@ -16,10 +16,6 @@ import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogStartTimeEventImpl; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorMappingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceCompetitorMappingEventImpl; -import com.sap.sailing.domain.racelog.tracking.test.mock.SmartphoneImeiIdentifier; -import com.sap.sailing.domain.test.AbstractLeaderboardTest; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; @@ -76,29 +72,6 @@ public class SerializeRaceLogEventsTest { } } - @Test - public void testRaceLogSerializationWithEventContainingDeviceIdentifier() throws IOException, ClassNotFoundException { - RaceLogDeviceCompetitorMappingEvent mappingEvent = new RaceLogDeviceCompetitorMappingEventImpl( - MillisecondsTimePoint.now(), new LogEventAuthorImpl("Author Name", /* priority */0), 0, - AbstractLeaderboardTest.createCompetitor("Test Competitor"), new SmartphoneImeiIdentifier("1948364938463903"), new MillisecondsTimePoint(0), new MillisecondsTimePoint(10)); - raceLog.add(mappingEvent); - oos.writeObject(raceLog); - ObjectInputStream ois = getObjectInputStream(); - RaceLog rl = (RaceLog) ois.readObject(); - raceLog.lockForRead(); - rl.lockForRead(); - try { - RaceLogDeviceCompetitorMappingEvent expected = ((RaceLogDeviceCompetitorMappingEvent) raceLog.getFirstRawFix()); - RaceLogDeviceCompetitorMappingEvent actual = ((RaceLogDeviceCompetitorMappingEvent) rl.getFirstRawFix()); - - assertEquals(Util.size(raceLog.getRawFixes()), Util.size(rl.getRawFixes())); - assertEquals(expected.getDevice().getIdentifierType(), actual.getDevice().getIdentifierType()); - } finally { - rl.unlockAfterRead(); - raceLog.unlockAfterRead(); - } - } - private ObjectInputStream getObjectInputStream() throws IOException { return new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray())); } diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/RevokeEventTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/RevokeEventTest.java deleted file mode 100644 index c3d00398143..00000000000 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/RevokeEventTest.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.sap.sailing.domain.racelog.tracking.analyzing.test; - -import java.util.UUID; - -import junit.framework.Assert; - -import org.junit.Test; - -import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.abstractlog.race.RaceLogRevokeEvent; -import com.sap.sailing.domain.abstractlog.race.impl.RaceLogRevokeEventImpl; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceCompetitorMappingEventImpl; -import com.sap.sse.common.Util; - -public class RevokeEventTest extends AbstractRaceLogTrackingTest { - @Test - public void revokedEventIsExcluded() { - RaceLogEvent event = new RaceLogDeviceCompetitorMappingEventImpl(now, now, author, UUID.randomUUID(), 0, null, null, null, null); - RaceLogRevokeEvent revokeEvent = new RaceLogRevokeEventImpl(now.plus(1), now.plus(1), author, UUID.randomUUID(), 0, event.getId(), - null, null, null); - - log.add(event); - log.add(revokeEvent); - - log.lockForRead(); - Assert.assertFalse(Util.contains(log.getUnrevokedEvents(), event)); - log.unlockAfterRead(); - } - - @Test - public void eventRevokedByAuthorWithLowerPrioIsNotExcluded() { - RaceLogEvent event = new RaceLogDeviceCompetitorMappingEventImpl(now, now, author, UUID.randomUUID(), 0, null, null, null, null); - RaceLogRevokeEvent revokeEvent = new RaceLogRevokeEventImpl(now.plus(1), now.plus(1), author1, UUID.randomUUID(), 0, event.getId(), - null, null, null); - - log.add(event); - log.add(revokeEvent); - - log.lockForRead(); - Assert.assertTrue(Util.contains(log.getUnrevokedEvents(), event)); - log.unlockAfterRead(); - } - - @Test - public void revokingRevokeEventIsNotHarmful() { - RaceLogEvent event = new RaceLogDeviceCompetitorMappingEventImpl(now, now, author, UUID.randomUUID(), 0, null, null, null, null); - RaceLogRevokeEvent revokeEvent = new RaceLogRevokeEventImpl(now.plus(1), now.plus(1), author, UUID.randomUUID(), 0, event.getId(), - null, null, null); - RaceLogRevokeEvent revokeEvent2 = new RaceLogRevokeEventImpl(now.plus(2), now.plus(2), author, UUID.randomUUID(), 2, revokeEvent.getId(), - null, null, null); - - log.add(event); - log.add(revokeEvent); - - log.lockForRead(); - Assert.assertFalse(Util.contains(log.getUnrevokedEvents(), event)); - Assert.assertFalse(Util.contains(log.getUnrevokedEvents(), revokeEvent)); - Assert.assertFalse(Util.contains(log.getUnrevokedEvents(), revokeEvent2)); - log.unlockAfterRead(); - } -} diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/regattalog/tracking/analyzing/test/RevokeEventTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/regattalog/tracking/analyzing/test/RevokeEventTest.java new file mode 100644 index 00000000000..bdd39dec5b3 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/regattalog/tracking/analyzing/test/RevokeEventTest.java @@ -0,0 +1,61 @@ +package com.sap.sailing.domain.regattalog.tracking.analyzing.test; + +import java.util.UUID; + +import junit.framework.Assert; + +import org.junit.Test; + +import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogRevokeEvent; +import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceCompetitorMappingEventImpl; +import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogRevokeEventImpl; +import com.sap.sse.common.Util; + +public class RevokeEventTest extends AbstractRegattaLogTrackingTest { + @Test + public void revokedEventIsExcluded() { + RegattaLogEvent event = new RegattaLogDeviceCompetitorMappingEventImpl(now, now, author, UUID.randomUUID(), null, null, null, null); + RegattaLogRevokeEvent revokeEvent = new RegattaLogRevokeEventImpl(now.plus(1), now.plus(1), author, UUID.randomUUID(), event.getId(), + null, null, null); + + log.add(event); + log.add(revokeEvent); + + log.lockForRead(); + Assert.assertFalse(Util.contains(log.getUnrevokedEvents(), event)); + log.unlockAfterRead(); + } + + @Test + public void eventRevokedByAuthorWithLowerPrioIsNotExcluded() { + RegattaLogEvent event = new RegattaLogDeviceCompetitorMappingEventImpl(now, now, author, UUID.randomUUID(), null, null, null, null); + RegattaLogRevokeEvent revokeEvent = new RegattaLogRevokeEventImpl(now.plus(1), now.plus(1), author1, UUID.randomUUID(), event.getId(), + null, null, null); + + log.add(event); + log.add(revokeEvent); + + log.lockForRead(); + Assert.assertTrue(Util.contains(log.getUnrevokedEvents(), event)); + log.unlockAfterRead(); + } + + @Test + public void revokingRevokeEventIsNotHarmful() { + RegattaLogEvent event = new RegattaLogDeviceCompetitorMappingEventImpl(now, now, author, UUID.randomUUID(), null, null, null, null); + RegattaLogRevokeEvent revokeEvent = new RegattaLogRevokeEventImpl(now.plus(1), now.plus(1), author, UUID.randomUUID(), event.getId(), + null, null, null); + RegattaLogRevokeEvent revokeEvent2 = new RegattaLogRevokeEventImpl(now.plus(2), now.plus(2), author, UUID.randomUUID(), revokeEvent.getId(), + null, null, null); + + log.add(event); + log.add(revokeEvent); + + log.lockForRead(); + Assert.assertFalse(Util.contains(log.getUnrevokedEvents(), event)); + Assert.assertFalse(Util.contains(log.getUnrevokedEvents(), revokeEvent)); + Assert.assertFalse(Util.contains(log.getUnrevokedEvents(), revokeEvent2)); + log.unlockAfterRead(); + } +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventVisitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventVisitor.java index 67a3c481704..451c93ffdfe 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventVisitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventVisitor.java @@ -2,7 +2,6 @@ package com.sap.sailing.domain.abstractlog.race; import com.sap.sailing.domain.abstractlog.race.scoring.RaceLogAdditionalScoringInformationEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; @@ -37,8 +36,6 @@ public interface RaceLogEventVisitor { public void visit(RaceLogWindFixEvent event); - public void visit(RaceLogDeviceCompetitorMappingEvent event); - @SuppressWarnings("deprecation") public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent event); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/AbstractRaceLogChangedVisitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/AbstractRaceLogChangedVisitor.java index 554c364f869..236595a3bd2 100755 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/AbstractRaceLogChangedVisitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/AbstractRaceLogChangedVisitor.java @@ -23,7 +23,6 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogSuppressedMarkPassingsEven import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; import com.sap.sailing.domain.abstractlog.race.scoring.RaceLogAdditionalScoringInformationEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; @@ -90,11 +89,6 @@ public abstract class AbstractRaceLogChangedVisitor implements RaceLogEventVisit notifyListenerAboutEventAdded(event); } - @Override - public void visit(RaceLogDeviceCompetitorMappingEvent event) { - notifyListenerAboutEventAdded(event); - } - @SuppressWarnings("deprecation") @Override public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent event) { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/BaseRaceLogEventVisitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/BaseRaceLogEventVisitor.java index 167c16b9ca1..a834c60c0f7 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/BaseRaceLogEventVisitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/BaseRaceLogEventVisitor.java @@ -22,7 +22,6 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogSuppressedMarkPassingsEven import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; import com.sap.sailing.domain.abstractlog.race.scoring.RaceLogAdditionalScoringInformationEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; @@ -97,11 +96,6 @@ public abstract class BaseRaceLogEventVisitor implements RaceLogEventVisitor { } - @Override - public void visit(RaceLogDeviceCompetitorMappingEvent event) { - - } - @SuppressWarnings("deprecation") @Override public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent event) { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogDeviceCompetitorMappingEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogDeviceCompetitorMappingEvent.java deleted file mode 100644 index dbaee1c7e75..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogDeviceCompetitorMappingEvent.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.sap.sailing.domain.abstractlog.race.tracking; - -import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; -import com.sap.sailing.domain.abstractlog.shared.events.DeviceCompetitorMappingEvent; - -public interface RaceLogDeviceCompetitorMappingEvent extends RaceLogEvent, -DeviceCompetitorMappingEvent { - -} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogStartTrackingEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogStartTrackingEvent.java index cb162dcb430..efc256e5796 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogStartTrackingEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogStartTrackingEvent.java @@ -3,7 +3,6 @@ package com.sap.sailing.domain.abstractlog.race.tracking; import com.sap.sailing.domain.abstractlog.Revokable; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceCompetitorMappingEventImpl; /** * Closes the phase during which {@link RaceLogDeviceCompetitorMappingEventImpl}s actually result diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogDeviceCompetitorMappingEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogDeviceCompetitorMappingEventImpl.java deleted file mode 100644 index 070972b396f..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogDeviceCompetitorMappingEventImpl.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.sap.sailing.domain.abstractlog.race.tracking.impl; - -import java.io.Serializable; - -import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; -import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorMappingEvent; -import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; -import com.sap.sse.common.TimePoint; - -public class RaceLogDeviceCompetitorMappingEventImpl extends AbstractRaceLogDeviceMappingEventImpl - implements RaceLogDeviceCompetitorMappingEvent { - public RaceLogDeviceCompetitorMappingEventImpl(TimePoint createdAt, TimePoint logicalTimePoint, - AbstractLogEventAuthor author, Serializable pId, int pPassId, Competitor mappedTo, DeviceIdentifier device, - TimePoint from, TimePoint to) { - super(createdAt, logicalTimePoint, author, pId, pPassId, mappedTo, device, from, to); - } - - public RaceLogDeviceCompetitorMappingEventImpl(TimePoint logicalTimePoint, AbstractLogEventAuthor author, - int pPassId, Competitor mappedTo, DeviceIdentifier device, TimePoint from, TimePoint to) { - super(logicalTimePoint, author, pPassId, mappedTo, device, from, to); - } - - private static final long serialVersionUID = -1494030544804758753L; - - @Override - public void accept(RaceLogEventVisitor visitor) { - visitor.visit(this); - } -} diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java index c3efc20740e..b9cc0757a89 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java @@ -25,7 +25,6 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogSuppressedMarkPassingsEven import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; import com.sap.sailing.domain.abstractlog.race.scoring.RaceLogAdditionalScoringInformationEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; @@ -115,11 +114,6 @@ public class RaceColumnRaceLogReplicator implements RaceLogEventVisitor, Seriali notifyOnAdd(event); } - @Override - public void visit(RaceLogDeviceCompetitorMappingEvent event) { - notifyOnAdd(event); - } - @SuppressWarnings("deprecation") @Override public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent event) { diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadDeviceIdentifierTest.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadDeviceIdentifierTest.java index ccc0a758f12..a95facb58f3 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadDeviceIdentifierTest.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadDeviceIdentifierTest.java @@ -3,10 +3,8 @@ package com.sap.sailing.mongodb.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; import java.net.UnknownHostException; -import java.util.UUID; import org.junit.Before; import org.junit.Test; @@ -14,9 +12,9 @@ import org.junit.Test; import com.mongodb.MongoException; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; -import com.sap.sailing.domain.abstractlog.race.RaceLog; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorMappingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceCompetitorMappingEventImpl; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceCompetitorMappingEvent; +import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceCompetitorMappingEventImpl; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.DomainFactory; import com.sap.sailing.domain.base.impl.CompetitorImpl; @@ -24,13 +22,13 @@ import com.sap.sailing.domain.common.racelog.tracking.TransformationException; import com.sap.sailing.domain.persistence.PersistenceFactory; import com.sap.sailing.domain.persistence.impl.DomainObjectFactoryImpl; import com.sap.sailing.domain.persistence.impl.MongoObjectFactoryImpl; -import com.sap.sailing.domain.persistence.impl.MongoRaceLogStoreImpl; -import com.sap.sailing.domain.racelog.RaceLogIdentifier; +import com.sap.sailing.domain.persistence.impl.MongoRegattaLogStoreImpl; import com.sap.sailing.domain.racelog.tracking.test.mock.MockEmptyServiceFinderFactory; import com.sap.sailing.domain.racelog.tracking.test.mock.MockSmartphoneImeiServiceFinderFactory; import com.sap.sailing.domain.racelog.tracking.test.mock.SmartphoneImeiIdentifier; import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.racelogtracking.PlaceHolderDeviceIdentifier; +import com.sap.sailing.domain.regattalike.RegattaLikeIdentifier; import com.sap.sailing.domain.trackfiles.TrackFileImportDeviceIdentifierImpl; import com.sap.sse.common.NoCorrespondingServiceRegisteredException; import com.sap.sse.common.TimePoint; @@ -47,11 +45,11 @@ public class StoreAndLoadDeviceIdentifierTest extends AbstractMongoDBTest { protected static final String column = "column"; protected static final String fleet = "fleet"; protected final AbstractLogEventAuthor author = new LogEventAuthorImpl("author", 0); - protected RaceLogIdentifier logIdentifier; + protected RegattaLikeIdentifier logIdentifier; protected MongoObjectFactoryImpl mongoFactory; protected DomainObjectFactoryImpl domainFactory; - protected RaceLog raceLog; + protected RegattaLog RegattaLog; private TimePoint now() { return MillisecondsTimePoint.now(); @@ -61,13 +59,11 @@ public class StoreAndLoadDeviceIdentifierTest extends AbstractMongoDBTest { public void setup() throws UnknownHostException, MongoException, InterruptedException { dropTestDB(); - logIdentifier = mock(RaceLogIdentifier.class); - com.sap.sse.common.Util.Triple triple = new com.sap.sse.common.Util.Triple("a", "b", UUID.randomUUID().toString()); - when(logIdentifier.getIdentifier()).thenReturn(triple); + logIdentifier = mock(RegattaLikeIdentifier.class); } - private RaceLog loadRaceLog() { - return new MongoRaceLogStoreImpl(mongoFactory, domainFactory).getRaceLog(logIdentifier, true); + private RegattaLog loadRegattaLog() { + return new MongoRegattaLogStoreImpl(mongoFactory, domainFactory).getRegattaLog(logIdentifier, true); } private void createFactories(TypeBasedServiceFinderFactory factory) { @@ -76,23 +72,23 @@ public class StoreAndLoadDeviceIdentifierTest extends AbstractMongoDBTest { domainFactory = (DomainObjectFactoryImpl) PersistenceFactory.INSTANCE .getDomainObjectFactory(getMongoService(), DomainFactory.INSTANCE, factory); - raceLog = loadRaceLog(); + RegattaLog = loadRegattaLog(); } private DeviceIdentifier storeAndLoad(DeviceIdentifier device, TypeBasedServiceFinderFactory forStoring, TypeBasedServiceFinderFactory forLoading) { createFactories(forStoring); Competitor c = new CompetitorImpl("a", "a", null, null, null, null, null, /* timeOnTimeFactor */ null, /* timeOnDistanceAllowancePerNauticalMile */ null); - raceLog.add(new RaceLogDeviceCompetitorMappingEventImpl(now(), author, 0, + RegattaLog.add(new RegattaLogDeviceCompetitorMappingEventImpl(now(), now(), author, 0, c, device, now(), now())); createFactories(forLoading); - RaceLog loadedRaceLog = loadRaceLog(); - loadedRaceLog.lockForRead(); - assertEquals(1, Util.size(loadedRaceLog.getRawFixes())); - RaceLogDeviceCompetitorMappingEvent mapping = (RaceLogDeviceCompetitorMappingEvent) loadedRaceLog.getRawFixes().iterator().next(); - loadedRaceLog.unlockAfterRead(); + RegattaLog loadedRegattaLog = loadRegattaLog(); + loadedRegattaLog.lockForRead(); + assertEquals(1, Util.size(loadedRegattaLog.getRawFixes())); + RegattaLogDeviceCompetitorMappingEvent mapping = (RegattaLogDeviceCompetitorMappingEvent) loadedRegattaLog.getRawFixes().iterator().next(); + loadedRegattaLog.unlockAfterRead(); return mapping.getDevice(); } diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java index 652508f334c..ba87c51d690 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java @@ -34,11 +34,9 @@ import com.sap.sailing.domain.abstractlog.race.impl.RaceLogRaceStatusEventImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogRevokeEventImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogStartTimeEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDenoteForTrackingEventImpl; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceCompetitorMappingEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceMarkMappingEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogRegisterCompetitorEventImpl; import com.sap.sailing.domain.base.BoatClass; @@ -179,27 +177,6 @@ public class StoreAndLoadRaceLogEventsTest extends AbstractMongoDBTest { assertEquals(startTime, actualEvent.getStartTime()); } - @Test - public void testStoreAndLoadDeviceCompetitorMappingEvent() { - DeviceIdentifier device = new SmartphoneImeiIdentifier("a"); - Competitor mappedTo = DomainFactory.INSTANCE.getOrCreateCompetitor("abc", "abc", null, null, null, null, null, /* timeOnTimeFactor */ - null, /* timeOnDistanceAllowancePerNauticalMile */null); - TimePoint from = new MillisecondsTimePoint(20); - TimePoint to = new MillisecondsTimePoint(30); - RaceLogDeviceCompetitorMappingEvent expectedEvent = new RaceLogDeviceCompetitorMappingEventImpl( - expectedEventTime, expectedEventTime, author, expectedId, expectedPassId, - mappedTo, device, from, to); - - DBObject dbObject = mongoFactory.storeRaceLogEntry(logIdentifier, expectedEvent); - RaceLogDeviceCompetitorMappingEvent actualEvent = loadEvent(dbObject); - - assertBaseFields(expectedEvent, actualEvent); - assertEquals(device, actualEvent.getDevice()); - assertEquals(from, actualEvent.getFrom()); - assertEquals(to, actualEvent.getTo()); - assertEquals(mappedTo, actualEvent.getMappedTo()); - } - @Test public void testStoreAndLoadDeviceMarkMappingEvent() { DeviceIdentifier device = new SmartphoneImeiIdentifier("a"); diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDeviceCompetitorMappingEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDeviceCompetitorMappingEventDeserializer.java deleted file mode 100644 index d89ed2065ba..00000000000 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDeviceCompetitorMappingEventDeserializer.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.sap.sailing.server.gateway.deserialization.racelog.impl; - -import java.io.Serializable; - -import org.json.simple.JSONObject; - -import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; -import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceCompetitorMappingEventImpl; -import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; -import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; -import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; -import com.sap.sse.common.TimePoint; - -public class RaceLogDeviceCompetitorMappingEventDeserializer extends - RaceLogDeviceMappingEventDeserializer { - public RaceLogDeviceCompetitorMappingEventDeserializer( - JsonDeserializer competitorDeserializer, - JsonDeserializer deviceDeserializer) { - super(competitorDeserializer, deviceDeserializer); - } - - @Override - protected RaceLogEvent furtherDeserialize(JSONObject itemObject, TimePoint from, TimePoint to, - DeviceIdentifier device, Serializable id, TimePoint createdAt, - AbstractLogEventAuthor author, TimePoint timePoint, int passId) throws JsonDeserializationException { - Competitor mappedTo = competitorDeserializer.deserialize(itemObject); - return new RaceLogDeviceCompetitorMappingEventImpl(createdAt, timePoint, author, id, passId, - mappedTo, device, from, to); - } - -} diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogEventDeserializer.java index b4d8ae9c002..34a892a5b15 100755 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogEventDeserializer.java @@ -24,7 +24,6 @@ import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogCourseAr import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogCourseDesignChangedEventSerializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogDenoteForTrackingEventSerializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogDependentStartTimeEventSerializer; -import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogDeviceCompetitorMappingEventSerializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogDeviceMarkMappingEventSerializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogEndOfTrackingEventSerializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogFinishPositioningConfirmedEventSerializer; @@ -79,7 +78,6 @@ public class RaceLogEventDeserializer implements JsonDeserializer new RaceLogWindFixEventDeserializer(competitorDeserializer, new WindJsonDeserializer( new PositionJsonDeserializer())), - new RaceLogDeviceCompetitorMappingEventDeserializer(competitorDeserializer, deviceDeserializer), new RaceLogDeviceMarkMappingEventDeserializer(competitorDeserializer, new MarkDeserializer(domainFactory), deviceDeserializer), new RaceLogDenoteForTrackingEventDeserializer(competitorDeserializer, domainFactory), new RaceLogStartTrackingEventDeserializer(competitorDeserializer), @@ -107,7 +105,6 @@ public class RaceLogEventDeserializer implements JsonDeserializer protected final JsonDeserializer startProcedureChangedEventDeserializer; protected final JsonDeserializer protestStartTimeEventDeserializer; protected final JsonDeserializer windFixEventDeserializer; - protected final JsonDeserializer deviceCompetitorMappingEventDeserializer; protected final JsonDeserializer deviceMarkMappingEventDeserializer; protected final JsonDeserializer denoteForTrackingEventDeserializer; protected final JsonDeserializer startTrackingEventDeserializer; @@ -134,7 +131,6 @@ public class RaceLogEventDeserializer implements JsonDeserializer JsonDeserializer startProcedureChangedEventDeserializer, JsonDeserializer protestStartTimeEventDeserializer, JsonDeserializer windFixEventDeserializer, - JsonDeserializer deviceCompetitorMappingEventDeserializer, JsonDeserializer deviceMarkMappingEventDeserializer, JsonDeserializer denoteForTrackingEventDeserializer, JsonDeserializer startTrackingEventDeserializer, @@ -160,7 +156,6 @@ public class RaceLogEventDeserializer implements JsonDeserializer this.startProcedureChangedEventDeserializer = startProcedureChangedEventDeserializer; this.protestStartTimeEventDeserializer = protestStartTimeEventDeserializer; this.windFixEventDeserializer = windFixEventDeserializer; - this.deviceCompetitorMappingEventDeserializer = deviceCompetitorMappingEventDeserializer; this.deviceMarkMappingEventDeserializer = deviceMarkMappingEventDeserializer; this.denoteForTrackingEventDeserializer = denoteForTrackingEventDeserializer; this.startTrackingEventDeserializer = startTrackingEventDeserializer; @@ -205,8 +200,6 @@ public class RaceLogEventDeserializer implements JsonDeserializer return protestStartTimeEventDeserializer; } else if (type.equals(RaceLogWindFixEventSerializer.VALUE_CLASS)) { return windFixEventDeserializer; - } else if (type.equals(RaceLogDeviceCompetitorMappingEventSerializer.VALUE_CLASS)) { - return deviceCompetitorMappingEventDeserializer; } else if (type.equals(RaceLogDeviceMarkMappingEventSerializer.VALUE_CLASS)) { return deviceMarkMappingEventDeserializer; } else if (type.equals(RaceLogDenoteForTrackingEventSerializer.VALUE_CLASS)) { diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java index 2417ca50c1c..b95c5c840ac 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java @@ -25,7 +25,6 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogSuppressedMarkPassingsEven import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; import com.sap.sailing.domain.abstractlog.race.scoring.RaceLogAdditionalScoringInformationEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; @@ -72,7 +71,6 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac new RaceLogWindFixEventSerializer(competitorSerializer, new WindJsonSerializer( new PositionJsonSerializer())), - new RaceLogDeviceCompetitorMappingEventSerializer(competitorSerializer, deviceSerializer), new RaceLogDeviceMarkMappingEventSerializer(competitorSerializer, new MarkJsonSerializer(), deviceSerializer), new RaceLogDenoteForTrackingEventSerializer(competitorSerializer), new RaceLogStartTrackingEventSerializer(competitorSerializer), @@ -100,7 +98,6 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac private final JsonSerializer startProcedureChangedEventSerializer; private final JsonSerializer protestStartTimeEventSerializer; private final JsonSerializer windFixEventSerializer; - private final JsonSerializer deviceCompetitorMappingSerializer; private final JsonSerializer deviceMarkMappingSerializer; private final JsonSerializer denoteForTrackingSerializer; private final JsonSerializer startTrackingSerializer; @@ -131,7 +128,6 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac JsonSerializer startProcedureChangedEventSerializer, JsonSerializer protestStartTimeEventSerializer, JsonSerializer windFixEventSerializer, - JsonSerializer deviceCompetitorMappingSerializer, JsonSerializer deviceMarkMappingSerializer, JsonSerializer denoteForTrackingSerializer, JsonSerializer createRaceSerializer, @@ -157,7 +153,6 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac this.startProcedureChangedEventSerializer = startProcedureChangedEventSerializer; this.protestStartTimeEventSerializer = protestStartTimeEventSerializer; this.windFixEventSerializer = windFixEventSerializer; - this.deviceCompetitorMappingSerializer = deviceCompetitorMappingSerializer; this.deviceMarkMappingSerializer = deviceMarkMappingSerializer; this.denoteForTrackingSerializer = denoteForTrackingSerializer; this.startTrackingSerializer = createRaceSerializer; @@ -255,11 +250,6 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac chosenSerializer = windFixEventSerializer; } - @Override - public void visit(RaceLogDeviceCompetitorMappingEvent event) { - chosenSerializer = deviceCompetitorMappingSerializer; - } - @SuppressWarnings("deprecation") @Override public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent event) { diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java index 3ee233c2bb9..b2ebfe5814f 100644 --- a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java +++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java @@ -26,7 +26,6 @@ import com.sap.sailing.domain.abstractlog.race.impl.RaceLogStartProcedureChanged import com.sap.sailing.domain.abstractlog.race.impl.RaceLogStartTimeEventImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogWindFixEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDenoteForTrackingEventImpl; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceCompetitorMappingEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceMarkMappingEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogRegisterCompetitorEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogStartTrackingEventImpl; @@ -55,7 +54,6 @@ public class RaceLogEventSerializerTest { private JsonSerializer startProcedureTypeChangedEventSerializer; private JsonSerializer protestStartTimeEventSerializer; private JsonSerializer windFixEventSerializer; - private JsonSerializer deviceCompetitorMappingEventSerializer; private JsonSerializer deviceMarkMappingEventSerializer; private JsonSerializer denoteForTrackingEventSerializer; private JsonSerializer startTrackingEventSerializer; @@ -87,7 +85,6 @@ public class RaceLogEventSerializerTest { startProcedureTypeChangedEventSerializer = mock(JsonSerializer.class); protestStartTimeEventSerializer = mock(JsonSerializer.class); windFixEventSerializer = mock(JsonSerializer.class); - deviceCompetitorMappingEventSerializer = mock(JsonSerializer.class); deviceMarkMappingEventSerializer = mock(JsonSerializer.class); denoteForTrackingEventSerializer = mock(JsonSerializer.class); startTrackingEventSerializer = mock(JsonSerializer.class); @@ -106,7 +103,7 @@ public class RaceLogEventSerializerTest { finishPositioningListChangedEventSerializer, finishPositioningConfirmedEventSerializer, pathfinderEventSerializer, gateLineOpeningTimeEventSerializer, startProcedureTypeChangedEventSerializer, protestStartTimeEventSerializer, windFixEventSerializer, - deviceCompetitorMappingEventSerializer, deviceMarkMappingEventSerializer, + deviceMarkMappingEventSerializer, denoteForTrackingEventSerializer, startTrackingEventSerializer, revokeEventSerializer, registerCompetitorEventSerializer, fixedMarkPassingEventSerializer, suppressedMarkPassingsSerializer, additionalScoringInformationSerializer, dependentStartTimeEventSerializer, @@ -218,14 +215,6 @@ public class RaceLogEventSerializerTest { verify(windFixEventSerializer).serialize(event); } - @Test - public void testDeviceCompetitorMappingSerializer() { - // we use the real event type here because we do not want to re-implement the dispatching. - RaceLogEvent event = new RaceLogDeviceCompetitorMappingEventImpl(null, author, 0, null, null, null, null); - serializer.serialize(event); - verify(deviceCompetitorMappingEventSerializer).serialize(event); - } - @Test public void testDeviceMarkMappingSerializer() { // we use the real event type here because we do not want to re-implement the dispatching. diff --git a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/RaceLogSerializationTest.java b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/RaceLogSerializationTest.java deleted file mode 100644 index 6a6054d6d2a..00000000000 --- a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/RaceLogSerializationTest.java +++ /dev/null @@ -1,130 +0,0 @@ -package com.sap.sailing.server.gateway.test; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import java.util.Collections; -import java.util.Date; - -import org.json.simple.JSONObject; -import org.junit.Before; -import org.junit.Test; - -import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; -import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; -import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceCompetitorMappingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceCompetitorMappingEventImpl; -import com.sap.sailing.domain.abstractlog.shared.events.DeviceCompetitorMappingEvent; -import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.base.DomainFactory; -import com.sap.sailing.domain.base.impl.BoatClassImpl; -import com.sap.sailing.domain.base.impl.BoatImpl; -import com.sap.sailing.domain.base.impl.CompetitorImpl; -import com.sap.sailing.domain.base.impl.NationalityImpl; -import com.sap.sailing.domain.base.impl.PersonImpl; -import com.sap.sailing.domain.base.impl.TeamImpl; -import com.sap.sailing.domain.racelog.tracking.test.mock.MockEmptyServiceFinder; -import com.sap.sailing.domain.racelog.tracking.test.mock.SmartphoneImeiIdentifier; -import com.sap.sailing.domain.racelog.tracking.test.mock.SmartphoneImeiJsonHandler; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; -import com.sap.sailing.domain.racelogtracking.PlaceHolderDeviceIdentifier; -import com.sap.sailing.domain.trackfiles.TrackFileImportDeviceIdentifierImpl; -import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; -import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; -import com.sap.sailing.server.gateway.deserialization.impl.DeviceIdentifierJsonDeserializer; -import com.sap.sailing.server.gateway.deserialization.racelog.impl.RaceLogEventDeserializer; -import com.sap.sailing.server.gateway.serialization.JsonSerializer; -import com.sap.sailing.server.gateway.serialization.impl.CompetitorJsonSerializer; -import com.sap.sailing.server.gateway.serialization.impl.DeviceIdentifierJsonSerializer; -import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogEventSerializer; -import com.sap.sailing.server.gateway.serialization.racelog.tracking.DeviceIdentifierJsonHandler; -import com.sap.sailing.server.gateway.serialization.racelog.tracking.impl.PlaceHolderDeviceIdentifierJsonHandler; -import com.sap.sse.common.TimePoint; -import com.sap.sse.common.TypeBasedServiceFinder; -import com.sap.sse.common.impl.MillisecondsTimePoint; - -public class RaceLogSerializationTest { - private JsonSerializer serializer; - private JsonDeserializer deserializer; - private final AbstractLogEventAuthor author = new LogEventAuthorImpl("test", 0); - private static final Competitor competitor = new CompetitorImpl("a", "b", null, - null, null, - new TeamImpl("a", Collections.singletonList(new PersonImpl("a", new NationalityImpl("GER"), new Date(), "abc")), null), new BoatImpl("a", new BoatClassImpl("a", true), "abc"), /* timeOnTimeFactor */ null, /* timeOnDistanceAllowancePerNauticalMile */ null); - - @Before - public void setup() { - } - - private void setup(JsonDeserializer deviceDeserializer, JsonSerializer deviceSerializer) { - JsonSerializer cSer = CompetitorJsonSerializer.create(); - serializer = RaceLogEventSerializer.create(cSer, deviceSerializer); - deserializer = RaceLogEventDeserializer.create(DomainFactory.INSTANCE, deviceDeserializer); - } - - private TimePoint t() { - return MillisecondsTimePoint.now(); - } - - @Test - public void testSerializationOfDeviceIdentifier() throws JsonDeserializationException { - setup(DeviceIdentifierJsonDeserializer.create(new SmartphoneImeiJsonHandler(), SmartphoneImeiIdentifier.TYPE), - DeviceIdentifierJsonSerializer.create(new SmartphoneImeiJsonHandler(), SmartphoneImeiIdentifier.TYPE)); - DeviceIdentifier device = new SmartphoneImeiIdentifier("abc"); - RaceLogDeviceCompetitorMappingEvent event = new RaceLogDeviceCompetitorMappingEventImpl( - t(), author, 0, competitor, device, t(), t()); - - JSONObject json = serializer.serialize(event); - - RaceLogEvent deserialized = deserializer.deserialize(json); - - assertTrue(deserialized instanceof DeviceCompetitorMappingEvent); - RaceLogDeviceCompetitorMappingEvent deserializedMapping = (RaceLogDeviceCompetitorMappingEvent) deserialized; - assertEquals(event.getDevice(), deserializedMapping.getDevice()); - } - - @Test - public void testSerializationOfDeviceIdentifierWithNoSerializer() throws JsonDeserializationException { - TypeBasedServiceFinder onlyFallback = new MockEmptyServiceFinder<>(); - onlyFallback.setFallbackService(new PlaceHolderDeviceIdentifierJsonHandler()); - - setup(new DeviceIdentifierJsonDeserializer(onlyFallback), - DeviceIdentifierJsonSerializer.create(new SmartphoneImeiJsonHandler(), SmartphoneImeiIdentifier.TYPE)); - DeviceIdentifier device = new SmartphoneImeiIdentifier("abc"); - RaceLogDeviceCompetitorMappingEvent event = new RaceLogDeviceCompetitorMappingEventImpl( - t(), author, 0, competitor, device, t(), t()); - - JSONObject json = serializer.serialize(event); - - RaceLogEvent deserialized = deserializer.deserialize(json); - - assertTrue(deserialized instanceof DeviceCompetitorMappingEvent); - RaceLogDeviceCompetitorMappingEvent deserializedMapping = (RaceLogDeviceCompetitorMappingEvent) deserialized; - assertTrue(deserializedMapping.getDevice() instanceof PlaceHolderDeviceIdentifier); - assertEquals(event.getDevice().getStringRepresentation(), deserializedMapping.getDevice().getStringRepresentation()); - assertEquals(event.getDevice().getIdentifierType(), deserializedMapping.getDevice().getIdentifierType()); - } - - @Test - public void testSerializationOfDeviceIdentifierWithNoDeserializer() throws JsonDeserializationException { - TypeBasedServiceFinder onlyFallback = new MockEmptyServiceFinder<>(); - onlyFallback.setFallbackService(new PlaceHolderDeviceIdentifierJsonHandler()); - - setup(DeviceIdentifierJsonDeserializer.create(new SmartphoneImeiJsonHandler(), SmartphoneImeiIdentifier.TYPE), - new DeviceIdentifierJsonSerializer(onlyFallback)); - //track file device id can't be restored from string rep - DeviceIdentifier device = new TrackFileImportDeviceIdentifierImpl("file", "track"); - RaceLogDeviceCompetitorMappingEvent event = new RaceLogDeviceCompetitorMappingEventImpl( - t(), author, 0, competitor, device, t(), t()); - - JSONObject json = serializer.serialize(event); - - RaceLogEvent deserialized = deserializer.deserialize(json); - - assertTrue(deserialized instanceof RaceLogDeviceCompetitorMappingEvent); - RaceLogDeviceCompetitorMappingEvent deserializedMapping = (RaceLogDeviceCompetitorMappingEvent) deserialized; - assertTrue(deserializedMapping.getDevice() instanceof PlaceHolderDeviceIdentifier); - assertEquals(event.getDevice().getStringRepresentation(), deserializedMapping.getDevice().getStringRepresentation()); - assertEquals(event.getDevice().getIdentifierType(), deserializedMapping.getDevice().getIdentifierType()); - } -} From cf4c7ec95cc8e4db37a12cca8115a7245e423397 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Thu, 10 Dec 2015 18:07:06 +0100 Subject: [PATCH 057/165] Removes RaceLogDevicMarkMapping (bug2851) --- .../impl/DomainObjectFactoryImpl.java | 23 +----------- .../impl/MongoObjectFactoryImpl.java | 18 ---------- .../impl/MongoRaceLogStoreVisitor.java | 7 ---- .../test/AbstractGPSFixStoreTest.java | 5 ++- .../impl/RaceLogRaceTracker.java | 6 ---- .../abstractlog/race/RaceLogEventVisitor.java | 3 -- .../impl/AbstractRaceLogChangedVisitor.java | 6 ---- .../race/impl/BaseRaceLogEventVisitor.java | 6 ---- .../RaceLogDeviceMarkMappingEvent.java | 11 ------ .../RaceLogDeviceMarkMappingEventImpl.java | 32 ----------------- .../impl/RaceColumnRaceLogReplicator.java | 6 ---- .../masterdataimport/TopLevelMasterData.java | 3 +- .../test/StoreAndLoadRaceLogEventsTest.java | 26 -------------- ...LogDeviceMarkMappingEventDeserializer.java | 35 ------------------- .../impl/RaceLogEventDeserializer.java | 7 ---- .../racelog/impl/RaceLogEventSerializer.java | 10 ------ .../racelog/RaceLogEventSerializerTest.java | 15 +------- 17 files changed, 5 insertions(+), 214 deletions(-) delete mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogDeviceMarkMappingEvent.java delete mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogDeviceMarkMappingEventImpl.java delete mode 100644 java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDeviceMarkMappingEventDeserializer.java diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java index 8c2622c5a6a..a13f3e7567f 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java @@ -1309,8 +1309,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { } return result; } - - @SuppressWarnings("deprecation") /*TODO: remove deprecated RaceLogEvents when migrated*/ + public RaceLogEvent loadRaceLogEvent(DBObject dbObject) { TimePoint logicalTimePoint = loadTimePoint(dbObject); TimePoint createdAt = loadTimePoint(dbObject, FieldNames.RACE_LOG_EVENT_CREATED_AT); @@ -1360,8 +1359,6 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { return loadRaceLogProtestStartTimeEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(RaceLogWindFixEvent.class.getSimpleName())) { return loadRaceLogWindFixEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); - } else if (eventClass.equals(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent.class.getSimpleName())) { - return loadRaceLogDeviceMarkMappingEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(RaceLogDenoteForTrackingEvent.class.getSimpleName())) { return loadRaceLogDenoteForTrackingEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(RaceLogStartTrackingEvent.class.getSimpleName())) { @@ -1394,24 +1391,6 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { Boolean isMagnetic = (Boolean) dbObject.get(FieldNames.IS_MAGNETIC.name()); return new RaceLogWindFixEventImpl(createdAt, logicalTimePoint, author, id, passId, wind, isMagnetic == null ? true : isMagnetic); } - - @SuppressWarnings("deprecation") - private RaceLogEvent loadRaceLogDeviceMarkMappingEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, - Serializable id, Integer passId, List competitors, DBObject dbObject) { - DeviceIdentifier device = null; - try { - device = loadDeviceId(deviceIdentifierServiceFinder, - (DBObject) dbObject.get(FieldNames.DEVICE_ID.name())); - } catch (Exception e) { - logger.log(Level.WARNING, "Could not load deviceId for RaceLogEvent", e); - e.printStackTrace(); - } - //have to load complete mark, as no order is guaranteed for loading of racelog events - Mark mappedTo = loadMark((DBObject) dbObject.get(FieldNames.MARK.name())); - TimePoint from = loadTimePoint(dbObject, FieldNames.RACE_LOG_FROM); - TimePoint to = loadTimePoint(dbObject, FieldNames.RACE_LOG_TO); - return new com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceMarkMappingEventImpl(createdAt, logicalTimePoint, author, id, passId, mappedTo, device, from, to); - } private RaceLogEvent loadRaceLogDenoteForTrackingEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java index c7611329b4b..6e1228e7913 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java @@ -843,14 +843,6 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { return result; } - @SuppressWarnings("deprecation") - public DBObject storeRaceLogEntry(RaceLogIdentifier raceLogIdentifier, com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent event) { - BasicDBObject result = new BasicDBObject(); - storeRaceLogIdentifier(raceLogIdentifier, result); - result.put(FieldNames.RACE_LOG_EVENT.name(), storeRaceLogDeviceMarkMappingEvent(event)); - return result; - } - public DBObject storeRaceLogEntry(RaceLogIdentifier raceLogIdentifier, RaceLogDenoteForTrackingEvent event) { BasicDBObject result = new BasicDBObject(); storeRaceLogIdentifier(raceLogIdentifier, result); @@ -983,16 +975,6 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { } } - @SuppressWarnings("deprecation") - private Object storeRaceLogDeviceMarkMappingEvent(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent event) { - DBObject result = new BasicDBObject(); - storeRaceLogEventProperties(event, result); - result.put(FieldNames.RACE_LOG_EVENT_CLASS.name(), com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent.class.getSimpleName()); - storeDeviceMappingEvent(event, result, FieldNames.RACE_LOG_FROM, FieldNames.RACE_LOG_TO); - result.put(FieldNames.MARK.name(), storeMark(event.getMappedTo())); - return result; - } - private Object storeRaceLogDenoteForTrackingEvent(RaceLogDenoteForTrackingEvent event) { DBObject result = new BasicDBObject(); storeRaceLogEventProperties(event, result); diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java index 93c75ba1fa8..a65b20e14ad 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java @@ -122,13 +122,6 @@ public class MongoRaceLogStoreVisitor implements RaceLogEventVisitor { mongoObjectFactory.storeRaceLogEventEvent(object); } - @SuppressWarnings("deprecation") - @Override - public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent event) { - DBObject object = mongoObjectFactory.storeRaceLogEntry(raceLogIdentifier, event); - mongoObjectFactory.storeRaceLogEventEvent(object); - } - @Override public void visit(RaceLogDenoteForTrackingEvent event) { DBObject object = mongoObjectFactory.storeRaceLogEntry(raceLogIdentifier, event); diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java index 4d7877d860b..7fec39314ed 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java @@ -10,9 +10,9 @@ import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogImpl; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceMarkMappingEventImpl; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceCompetitorMappingEventImpl; +import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceMarkMappingEventImpl; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.DomainFactory; import com.sap.sailing.domain.base.Mark; @@ -34,7 +34,6 @@ import com.sap.sailing.server.gateway.deserialization.impl.DeviceAndSessionIdent import com.sap.sailing.server.impl.RacingEventServiceImpl; import com.sap.sse.common.impl.MillisecondsTimePoint; -@SuppressWarnings("deprecation") public class AbstractGPSFixStoreTest { protected RacingEventService service; protected final MockSmartphoneImeiServiceFinderFactory serviceFinderFactory = new MockSmartphoneImeiServiceFinderFactory(); @@ -79,7 +78,7 @@ public class AbstractGPSFixStoreTest { } protected void map(Mark mark, DeviceIdentifier device, long from, long to) { - raceLog.add(new RaceLogDeviceMarkMappingEventImpl(MillisecondsTimePoint.now(), author, 0, + regattaLog.add(new RegattaLogDeviceMarkMappingEventImpl(MillisecondsTimePoint.now(), MillisecondsTimePoint.now(), author, 0, mark, device, new MillisecondsTimePoint(from), new MillisecondsTimePoint(to))); } diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java index f81c9cd399a..1fc1556b995 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java @@ -126,11 +126,6 @@ public class RaceLogRaceTracker implements RaceTracker, GPSFixReceivedListener { for (AbstractLog log : params.getLogHierarchy()) { if (log instanceof RaceLog) { RaceLogEventVisitor visitor = new BaseRaceLogEventVisitor() { - @Override - public void visit(@SuppressWarnings("deprecation") com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent event) { - RaceLogRaceTracker.this.onDeviceMarkMappingEvent(event); - } - @Override public void visit(RaceLogStartTrackingEvent event) { RaceLogRaceTracker.this.onStartTrackingEvent(event); @@ -163,7 +158,6 @@ public class RaceLogRaceTracker implements RaceTracker, GPSFixReceivedListener { RaceLogRaceTracker.this.onDeviceMarkMappingEvent(event); } - //FIXME: check with Axel whether this is the desired behavior @Override public void visit(RegattaLogDefineMarkEvent event) { RaceLogRaceTracker.this.onDefineMarkEvent(event); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventVisitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventVisitor.java index 451c93ffdfe..fb4f8d3d823 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventVisitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventVisitor.java @@ -36,9 +36,6 @@ public interface RaceLogEventVisitor { public void visit(RaceLogWindFixEvent event); - @SuppressWarnings("deprecation") - public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent event); - public void visit(RaceLogDenoteForTrackingEvent event); public void visit(RaceLogStartTrackingEvent event); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/AbstractRaceLogChangedVisitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/AbstractRaceLogChangedVisitor.java index 236595a3bd2..8407d6f2d86 100755 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/AbstractRaceLogChangedVisitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/AbstractRaceLogChangedVisitor.java @@ -89,12 +89,6 @@ public abstract class AbstractRaceLogChangedVisitor implements RaceLogEventVisit notifyListenerAboutEventAdded(event); } - @SuppressWarnings("deprecation") - @Override - public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent event) { - notifyListenerAboutEventAdded(event); - } - @Override public void visit(RaceLogDenoteForTrackingEvent event) { notifyListenerAboutEventAdded(event); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/BaseRaceLogEventVisitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/BaseRaceLogEventVisitor.java index a834c60c0f7..bff059adf00 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/BaseRaceLogEventVisitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/BaseRaceLogEventVisitor.java @@ -96,12 +96,6 @@ public abstract class BaseRaceLogEventVisitor implements RaceLogEventVisitor { } - @SuppressWarnings("deprecation") - @Override - public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent event) { - - } - @Override public void visit(RaceLogDenoteForTrackingEvent event) { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogDeviceMarkMappingEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogDeviceMarkMappingEvent.java deleted file mode 100644 index aabf7992115..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogDeviceMarkMappingEvent.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.sap.sailing.domain.abstractlog.race.tracking; - -import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; -import com.sap.sailing.domain.abstractlog.shared.events.DeviceMarkMappingEvent; - -@Deprecated //(see bug2851) -public interface RaceLogDeviceMarkMappingEvent extends RaceLogEvent, -DeviceMarkMappingEvent { - -} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogDeviceMarkMappingEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogDeviceMarkMappingEventImpl.java deleted file mode 100644 index 9af50c8269b..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogDeviceMarkMappingEventImpl.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.sap.sailing.domain.abstractlog.race.tracking.impl; - -import java.io.Serializable; - -import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; -import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent; -import com.sap.sailing.domain.base.Mark; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; -import com.sap.sse.common.TimePoint; - -@Deprecated //see bug2851 -public class RaceLogDeviceMarkMappingEventImpl extends AbstractRaceLogDeviceMappingEventImpl implements - RaceLogDeviceMarkMappingEvent { - private static final long serialVersionUID = -7223543830755457196L; - - public RaceLogDeviceMarkMappingEventImpl(TimePoint createdAt, TimePoint logicalTimePoint, - AbstractLogEventAuthor author, Serializable pId, int pPassId, Mark mappedTo, DeviceIdentifier device, - TimePoint from, TimePoint to) { - super(createdAt, logicalTimePoint, author, pId, pPassId, mappedTo, device, from, to); - } - - public RaceLogDeviceMarkMappingEventImpl(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int pPassId, - Mark mappedTo, DeviceIdentifier device, TimePoint from, TimePoint to) { - super(logicalTimePoint, author, pPassId, mappedTo, device, from, to); - } - - @Override - public void accept(RaceLogEventVisitor visitor) { - visitor.visit(this); - } -} diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java index b9cc0757a89..55ac0fcd741 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java @@ -114,12 +114,6 @@ public class RaceColumnRaceLogReplicator implements RaceLogEventVisitor, Seriali notifyOnAdd(event); } - @SuppressWarnings("deprecation") - @Override - public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent event) { - notifyOnAdd(event); - } - @Override public void visit(RaceLogDenoteForTrackingEvent event) { notifyOnAdd(event); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/masterdataimport/TopLevelMasterData.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/masterdataimport/TopLevelMasterData.java index d4d3a5c7742..1630d884685 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/masterdataimport/TopLevelMasterData.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/masterdataimport/TopLevelMasterData.java @@ -156,10 +156,9 @@ public class TopLevelMasterData implements Serializable { } } - @SuppressWarnings("deprecation") private boolean isMarkMappingEvent(DeviceMappingEvent mappingEvent) { boolean isMarkMappingEvent = false; - if (mappingEvent instanceof com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent || mappingEvent instanceof RegattaLogDeviceMarkMappingEvent) { + if (mappingEvent instanceof RegattaLogDeviceMarkMappingEvent) { isMarkMappingEvent = true; } return isMarkMappingEvent; diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java index ba87c51d690..488ef888b67 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java @@ -34,15 +34,12 @@ import com.sap.sailing.domain.abstractlog.race.impl.RaceLogRaceStatusEventImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogRevokeEventImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogStartTimeEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; -import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDenoteForTrackingEventImpl; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceMarkMappingEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogRegisterCompetitorEventImpl; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.DomainFactory; -import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.domain.persistence.PersistenceFactory; @@ -51,13 +48,10 @@ import com.sap.sailing.domain.persistence.impl.FieldNames; import com.sap.sailing.domain.persistence.impl.MongoObjectFactoryImpl; import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.racelog.tracking.test.mock.MockSmartphoneImeiServiceFinderFactory; -import com.sap.sailing.domain.racelog.tracking.test.mock.SmartphoneImeiIdentifier; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; -@SuppressWarnings("deprecation") public class StoreAndLoadRaceLogEventsTest extends AbstractMongoDBTest { protected MongoObjectFactoryImpl mongoFactory = (MongoObjectFactoryImpl) PersistenceFactory.INSTANCE @@ -177,26 +171,6 @@ public class StoreAndLoadRaceLogEventsTest extends AbstractMongoDBTest { assertEquals(startTime, actualEvent.getStartTime()); } - @Test - public void testStoreAndLoadDeviceMarkMappingEvent() { - DeviceIdentifier device = new SmartphoneImeiIdentifier("a"); - Mark mappedTo = DomainFactory.INSTANCE.getOrCreateMark("abc", "abc"); - TimePoint from = new MillisecondsTimePoint(20); - TimePoint to = new MillisecondsTimePoint(30); - RaceLogDeviceMarkMappingEvent expectedEvent = new RaceLogDeviceMarkMappingEventImpl( - expectedEventTime, expectedEventTime, author, expectedId, expectedPassId, - mappedTo, device, from, to); - - DBObject dbObject = mongoFactory.storeRaceLogEntry(logIdentifier, expectedEvent); - RaceLogDeviceMarkMappingEvent actualEvent = loadEvent(dbObject); - - assertBaseFields(expectedEvent, actualEvent); - assertEquals(device, actualEvent.getDevice()); - assertEquals(from, actualEvent.getFrom()); - assertEquals(to, actualEvent.getTo()); - assertEquals(mappedTo, actualEvent.getMappedTo()); - } - @Test public void testStoreAndLoadDenoteForTrackingEvent() { String raceName = "race"; diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDeviceMarkMappingEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDeviceMarkMappingEventDeserializer.java deleted file mode 100644 index cccd763371c..00000000000 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDeviceMarkMappingEventDeserializer.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.sap.sailing.server.gateway.deserialization.racelog.impl; - -import java.io.Serializable; - -import org.json.simple.JSONObject; - -import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; -import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.base.Mark; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; -import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; -import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; -import com.sap.sse.common.TimePoint; - -public class RaceLogDeviceMarkMappingEventDeserializer extends RaceLogDeviceMappingEventDeserializer { - private final JsonDeserializer markDeserializer; - - public RaceLogDeviceMarkMappingEventDeserializer(JsonDeserializer competitorDeserializer, - JsonDeserializer markDeserializer, JsonDeserializer deviceDeserializer) { - super(competitorDeserializer, deviceDeserializer); - this.markDeserializer = markDeserializer; - } - - @SuppressWarnings("deprecation") - @Override - protected RaceLogEvent furtherDeserialize(JSONObject itemObject, TimePoint from, TimePoint to, - DeviceIdentifier device, Serializable id, TimePoint createdAt, AbstractLogEventAuthor author, - TimePoint timePoint, int passId) throws JsonDeserializationException { - Mark mappedTo = (Mark) markDeserializer.deserialize(itemObject); - return new com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceMarkMappingEventImpl(createdAt, - timePoint, author, id, passId, mappedTo, device, from, to); - } - -} diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogEventDeserializer.java index 34a892a5b15..8201335ef90 100755 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogEventDeserializer.java @@ -24,7 +24,6 @@ import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogCourseAr import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogCourseDesignChangedEventSerializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogDenoteForTrackingEventSerializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogDependentStartTimeEventSerializer; -import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogDeviceMarkMappingEventSerializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogEndOfTrackingEventSerializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogFinishPositioningConfirmedEventSerializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogFinishPositioningListChangedEventSerializer; @@ -78,7 +77,6 @@ public class RaceLogEventDeserializer implements JsonDeserializer new RaceLogWindFixEventDeserializer(competitorDeserializer, new WindJsonDeserializer( new PositionJsonDeserializer())), - new RaceLogDeviceMarkMappingEventDeserializer(competitorDeserializer, new MarkDeserializer(domainFactory), deviceDeserializer), new RaceLogDenoteForTrackingEventDeserializer(competitorDeserializer, domainFactory), new RaceLogStartTrackingEventDeserializer(competitorDeserializer), new RaceLogRevokeEventDeserializer(competitorDeserializer), @@ -105,7 +103,6 @@ public class RaceLogEventDeserializer implements JsonDeserializer protected final JsonDeserializer startProcedureChangedEventDeserializer; protected final JsonDeserializer protestStartTimeEventDeserializer; protected final JsonDeserializer windFixEventDeserializer; - protected final JsonDeserializer deviceMarkMappingEventDeserializer; protected final JsonDeserializer denoteForTrackingEventDeserializer; protected final JsonDeserializer startTrackingEventDeserializer; protected final JsonDeserializer revokeEventDeserializer; @@ -131,7 +128,6 @@ public class RaceLogEventDeserializer implements JsonDeserializer JsonDeserializer startProcedureChangedEventDeserializer, JsonDeserializer protestStartTimeEventDeserializer, JsonDeserializer windFixEventDeserializer, - JsonDeserializer deviceMarkMappingEventDeserializer, JsonDeserializer denoteForTrackingEventDeserializer, JsonDeserializer startTrackingEventDeserializer, JsonDeserializer revokeEventDeserializer, @@ -156,7 +152,6 @@ public class RaceLogEventDeserializer implements JsonDeserializer this.startProcedureChangedEventDeserializer = startProcedureChangedEventDeserializer; this.protestStartTimeEventDeserializer = protestStartTimeEventDeserializer; this.windFixEventDeserializer = windFixEventDeserializer; - this.deviceMarkMappingEventDeserializer = deviceMarkMappingEventDeserializer; this.denoteForTrackingEventDeserializer = denoteForTrackingEventDeserializer; this.startTrackingEventDeserializer = startTrackingEventDeserializer; this.revokeEventDeserializer = revokeEventDeserializer; @@ -200,8 +195,6 @@ public class RaceLogEventDeserializer implements JsonDeserializer return protestStartTimeEventDeserializer; } else if (type.equals(RaceLogWindFixEventSerializer.VALUE_CLASS)) { return windFixEventDeserializer; - } else if (type.equals(RaceLogDeviceMarkMappingEventSerializer.VALUE_CLASS)) { - return deviceMarkMappingEventDeserializer; } else if (type.equals(RaceLogDenoteForTrackingEventSerializer.VALUE_CLASS)) { return denoteForTrackingEventDeserializer; } else if (type.equals(RaceLogStartTrackingEventSerializer.VALUE_CLASS)) { diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java index b95c5c840ac..9f466062a45 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java @@ -71,7 +71,6 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac new RaceLogWindFixEventSerializer(competitorSerializer, new WindJsonSerializer( new PositionJsonSerializer())), - new RaceLogDeviceMarkMappingEventSerializer(competitorSerializer, new MarkJsonSerializer(), deviceSerializer), new RaceLogDenoteForTrackingEventSerializer(competitorSerializer), new RaceLogStartTrackingEventSerializer(competitorSerializer), new RaceLogRevokeEventSerializer(competitorSerializer), @@ -98,7 +97,6 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac private final JsonSerializer startProcedureChangedEventSerializer; private final JsonSerializer protestStartTimeEventSerializer; private final JsonSerializer windFixEventSerializer; - private final JsonSerializer deviceMarkMappingSerializer; private final JsonSerializer denoteForTrackingSerializer; private final JsonSerializer startTrackingSerializer; private final JsonSerializer revokeSerializer; @@ -128,7 +126,6 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac JsonSerializer startProcedureChangedEventSerializer, JsonSerializer protestStartTimeEventSerializer, JsonSerializer windFixEventSerializer, - JsonSerializer deviceMarkMappingSerializer, JsonSerializer denoteForTrackingSerializer, JsonSerializer createRaceSerializer, JsonSerializer revokeSerializer, @@ -153,7 +150,6 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac this.startProcedureChangedEventSerializer = startProcedureChangedEventSerializer; this.protestStartTimeEventSerializer = protestStartTimeEventSerializer; this.windFixEventSerializer = windFixEventSerializer; - this.deviceMarkMappingSerializer = deviceMarkMappingSerializer; this.denoteForTrackingSerializer = denoteForTrackingSerializer; this.startTrackingSerializer = createRaceSerializer; this.revokeSerializer = revokeSerializer; @@ -250,12 +246,6 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac chosenSerializer = windFixEventSerializer; } - @SuppressWarnings("deprecation") - @Override - public void visit(com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDeviceMarkMappingEvent event) { - chosenSerializer = deviceMarkMappingSerializer; - } - @Override public void visit(RaceLogDenoteForTrackingEvent event) { chosenSerializer = denoteForTrackingSerializer; diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java index b2ebfe5814f..f47dd00c129 100644 --- a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java +++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java @@ -26,7 +26,6 @@ import com.sap.sailing.domain.abstractlog.race.impl.RaceLogStartProcedureChanged import com.sap.sailing.domain.abstractlog.race.impl.RaceLogStartTimeEventImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogWindFixEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDenoteForTrackingEventImpl; -import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceMarkMappingEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogRegisterCompetitorEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogStartTrackingEventImpl; import com.sap.sailing.domain.base.DomainFactory; @@ -36,7 +35,6 @@ import com.sap.sailing.server.gateway.serialization.JsonSerializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogEventSerializer; import com.sap.sse.common.impl.MillisecondsTimePoint; -@SuppressWarnings("deprecation") public class RaceLogEventSerializerTest { private RaceLogEventSerializer serializer; @@ -54,7 +52,6 @@ public class RaceLogEventSerializerTest { private JsonSerializer startProcedureTypeChangedEventSerializer; private JsonSerializer protestStartTimeEventSerializer; private JsonSerializer windFixEventSerializer; - private JsonSerializer deviceMarkMappingEventSerializer; private JsonSerializer denoteForTrackingEventSerializer; private JsonSerializer startTrackingEventSerializer; private JsonSerializer revokeEventSerializer; @@ -85,7 +82,6 @@ public class RaceLogEventSerializerTest { startProcedureTypeChangedEventSerializer = mock(JsonSerializer.class); protestStartTimeEventSerializer = mock(JsonSerializer.class); windFixEventSerializer = mock(JsonSerializer.class); - deviceMarkMappingEventSerializer = mock(JsonSerializer.class); denoteForTrackingEventSerializer = mock(JsonSerializer.class); startTrackingEventSerializer = mock(JsonSerializer.class); revokeEventSerializer = mock(JsonSerializer.class); @@ -103,7 +99,6 @@ public class RaceLogEventSerializerTest { finishPositioningListChangedEventSerializer, finishPositioningConfirmedEventSerializer, pathfinderEventSerializer, gateLineOpeningTimeEventSerializer, startProcedureTypeChangedEventSerializer, protestStartTimeEventSerializer, windFixEventSerializer, - deviceMarkMappingEventSerializer, denoteForTrackingEventSerializer, startTrackingEventSerializer, revokeEventSerializer, registerCompetitorEventSerializer, fixedMarkPassingEventSerializer, suppressedMarkPassingsSerializer, additionalScoringInformationSerializer, dependentStartTimeEventSerializer, @@ -214,15 +209,7 @@ public class RaceLogEventSerializerTest { serializer.serialize(event); verify(windFixEventSerializer).serialize(event); } - - @Test - public void testDeviceMarkMappingSerializer() { - // we use the real event type here because we do not want to re-implement the dispatching. - RaceLogEvent event = new RaceLogDeviceMarkMappingEventImpl(null, author, 0, null, null, null, null); - serializer.serialize(event); - verify(deviceMarkMappingEventSerializer).serialize(event); - } - + @Test public void testDenoteForTrackingSerializer() { // we use the real event type here because we do not want to re-implement the dispatching. From 2a9c6741720e3b07537783aeb56715d544a5b254 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Thu, 10 Dec 2015 19:00:36 +0100 Subject: [PATCH 058/165] Refactorings as Mapping Events are from now on only present on RegattaLog --- .../impl/MongoObjectFactoryImpl.java | 4 +- .../tracking/impl/MongoGPSFixStoreImpl.java | 23 ++++---- .../impl/RaceLogRaceTracker.java | 47 ++++++++------- .../test/DeviceMappingFinderTest.java | 4 +- .../RaceLogDenoteForTrackingEvent.java | 4 +- .../RaceLogLastPingMappingEventFinder.java | 16 ------ ...AbstractRaceLogDeviceMappingEventImpl.java | 49 ---------------- ...taLogCloseOpenEndedDeviceMappingEvent.java | 26 +++++++-- ...egattaLogDeviceCompetitorMappingEvent.java | 17 +++--- .../events/RegattaLogDeviceMappingEvent.java} | 8 +-- .../RegattaLogDeviceMappingEventImpl.java} | 12 ++-- .../RegattaLogDeviceMarkMappingEvent.java | 19 +++---- ...gCloseOpenEndedDeviceMappingEventImpl.java | 44 +++++++++----- ...taLogDeviceCompetitorMappingEventImpl.java | 10 ++-- .../RegattaLogDeviceMarkMappingEventImpl.java | 11 ++-- .../impl/LastPingMappingEventFinder.java | 32 +++++++++++ ...gattaLogDeviceCompetitorMappingFinder.java | 18 ++++++ .../impl/RegattaLogDeviceMappingFinder.java} | 57 +++++++------------ .../RegattaLogDeviceMarkMappingFinder.java | 18 ++++++ ...egattaLogOpenEndedDeviceMappingCloser.java | 48 ++++++++++++---- .../DeviceCompetitorMappingFinder.java | 34 ----------- .../analyzing/DeviceMarkMappingFinder.java | 34 ----------- .../analyzing/LastPingMappingEventFinder.java | 35 ------------ .../OpenEndedDeviceMappingCloser.java | 53 ----------------- .../CloseOpenEndedDeviceMappingEvent.java | 26 --------- .../events/DeviceCompetitorMappingEvent.java | 7 --- .../shared/events/DeviceMarkMappingEvent.java | 8 --- ...eCloseOpenEndedDeviceMappingEventImpl.java | 43 -------------- .../domain/racelogtracking/DeviceMapping.java | 4 +- .../impl/DeviceMappingImpl.java | 4 +- .../masterdataimport/TopLevelMasterData.java | 10 ++-- .../racelog/tracking/EmptyGPSFixStore.java | 10 ++-- .../domain/racelog/tracking/GPSFixStore.java | 22 +++---- .../sailing/domain/tracking/TrackedRace.java | 4 +- .../tracking/impl/DynamicTrackedRaceImpl.java | 1 - .../domain/tracking/impl/TrackedRaceImpl.java | 45 +++------------ ...egattaLogTrackingDeviceMappingsDialog.java | 2 +- .../sailing/gwt/ui/client/SailingService.java | 7 +-- .../gwt/ui/client/SailingServiceAsync.java | 11 +--- .../gwt/ui/server/SailingServiceImpl.java | 45 +++++---------- ...RaceLogDeviceMappingEventDeserializer.java | 49 ---------------- ...eviceCompetitorMappingEventSerializer.java | 28 --------- .../RaceLogDeviceMappingEventSerializer.java | 39 ------------- ...ceLogDeviceMarkMappingEventSerializer.java | 32 ----------- .../api/LeaderboardsResourcePingMarkTest.java | 6 +- ...LeaderboardsResourceCheckinAndOutTest.java | 6 +- .../jaxrs/api/LeaderboardsResource.java | 2 +- 47 files changed, 317 insertions(+), 717 deletions(-) delete mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceLogLastPingMappingEventFinder.java delete mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/AbstractRaceLogDeviceMappingEventImpl.java rename java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/{shared/events/DeviceMappingEvent.java => regatta/events/RegattaLogDeviceMappingEvent.java} (82%) rename java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/{shared/events/impl/AbstractDeviceMappingEventImpl.java => regatta/events/RegattaLogDeviceMappingEventImpl.java} (73%) create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/LastPingMappingEventFinder.java create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceCompetitorMappingFinder.java rename java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/{shared/analyzing/DeviceMappingFinder.java => regatta/tracking/analyzing/impl/RegattaLogDeviceMappingFinder.java} (55%) create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceMarkMappingFinder.java delete mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/DeviceCompetitorMappingFinder.java delete mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/DeviceMarkMappingFinder.java delete mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/LastPingMappingEventFinder.java delete mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/OpenEndedDeviceMappingCloser.java delete mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/CloseOpenEndedDeviceMappingEvent.java delete mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/DeviceCompetitorMappingEvent.java delete mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/DeviceMarkMappingEvent.java delete mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/impl/BaseCloseOpenEndedDeviceMappingEventImpl.java delete mode 100644 java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDeviceMappingEventDeserializer.java delete mode 100644 java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogDeviceCompetitorMappingEventSerializer.java delete mode 100644 java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogDeviceMappingEventSerializer.java delete mode 100644 java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogDeviceMarkMappingEventSerializer.java diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java index 6e1228e7913..3420c0b09a1 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java @@ -48,12 +48,12 @@ import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogCloseOpenEndedDeviceMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDefineMarkEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceCompetitorMappingEvent; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogRegisterCompetitorEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogRevokeEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogSetCompetitorTimeOnDistanceAllowancePerNauticalMileEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogSetCompetitorTimeOnTimeFactorEvent; -import com.sap.sailing.domain.abstractlog.shared.events.DeviceMappingEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.ControlPoint; import com.sap.sailing.domain.base.ControlPointWithTwoMarks; @@ -961,7 +961,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { return result; } - private void storeDeviceMappingEvent(DeviceMappingEvent event, DBObject result, FieldNames fromField, FieldNames toField) { + private void storeDeviceMappingEvent(RegattaLogDeviceMappingEvent event, DBObject result, FieldNames fromField, FieldNames toField) { try { result.put(FieldNames.DEVICE_ID.name(), storeDeviceId(deviceIdentifierServiceFinder, event.getDevice())); } catch (TransformationException | NoCorrespondingServiceRegisteredException e) { diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/racelog/tracking/impl/MongoGPSFixStoreImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/racelog/tracking/impl/MongoGPSFixStoreImpl.java index 9fe5ba23215..bee06e81e00 100755 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/racelog/tracking/impl/MongoGPSFixStoreImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/racelog/tracking/impl/MongoGPSFixStoreImpl.java @@ -14,9 +14,9 @@ import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.DBObject; import com.mongodb.QueryBuilder; -import com.sap.sailing.domain.abstractlog.AbstractLog; -import com.sap.sailing.domain.abstractlog.shared.analyzing.DeviceCompetitorMappingFinder; -import com.sap.sailing.domain.abstractlog.shared.analyzing.DeviceMarkMappingFinder; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; +import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogDeviceCompetitorMappingFinder; +import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogDeviceMarkMappingFinder; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; @@ -107,9 +107,9 @@ public class MongoGPSFixStoreImpl implements MongoGPSFixStore { } @Override - public void loadCompetitorTrack(DynamicGPSFixTrack track, AbstractLog log, Competitor competitor) + public void loadCompetitorTrack(DynamicGPSFixTrack track, RegattaLog log, Competitor competitor) throws NoCorrespondingServiceRegisteredException, TransformationException{ - List> mappings = new DeviceCompetitorMappingFinder<>(log).analyze().get(competitor); + List> mappings = new RegattaLogDeviceCompetitorMappingFinder(log).analyze().get(competitor); if (mappings != null) { for (DeviceMapping mapping : mappings) { loadTrack(track, mapping.getDevice(), mapping.getTimeRange().from(), mapping.getTimeRange().to(), true /*inclusive*/); @@ -118,9 +118,9 @@ public class MongoGPSFixStoreImpl implements MongoGPSFixStore { } @Override - public void loadMarkTrack(DynamicGPSFixTrack track, AbstractLog log, Mark mark) + public void loadMarkTrack(DynamicGPSFixTrack track, RegattaLog log, Mark mark) throws NoCorrespondingServiceRegisteredException, TransformationException{ - List> mappings = new DeviceMarkMappingFinder<>(log).analyze().get(mark); + List> mappings = new RegattaLogDeviceMarkMappingFinder(log).analyze().get(mark); if (mappings != null) { for (DeviceMapping mapping : mappings) { loadTrack(track, mapping.getDevice(), mapping.getTimeRange().from(), mapping.getTimeRange().to(), true /*inclusive*/); @@ -192,9 +192,9 @@ public class MongoGPSFixStoreImpl implements MongoGPSFixStore { } @Override - public void loadCompetitorTrack(DynamicGPSFixTrack track, AbstractLog log, + public void loadCompetitorTrack(DynamicGPSFixTrack track, RegattaLog log, Competitor competitor, TimePoint start, TimePoint end) throws TransformationException { - List> mappings = new DeviceCompetitorMappingFinder<>(log).analyze().get(competitor); + List> mappings = new RegattaLogDeviceCompetitorMappingFinder(log).analyze().get(competitor); if (mappings != null) { for (DeviceMapping mapping : mappings) { final TimePoint from = Util.getLatestOfTimePoints(start, mapping.getTimeRange().from()); @@ -211,9 +211,9 @@ public class MongoGPSFixStoreImpl implements MongoGPSFixStore { } @Override - public void loadMarkTrack(DynamicGPSFixTrack track, AbstractLog log, Mark mark, + public void loadMarkTrack(DynamicGPSFixTrack track, RegattaLog log, Mark mark, TimePoint start, TimePoint end) throws TransformationException, NoCorrespondingServiceRegisteredException { - List> mappings = new DeviceMarkMappingFinder<>(log).analyze().get(mark); + List> mappings = new RegattaLogDeviceMarkMappingFinder(log).analyze().get(mark); if (mappings != null) { for (DeviceMapping mapping : mappings) { final TimePoint from = Util.getLatestOfTimePoints(start, mapping.getTimeRange().from()); @@ -261,5 +261,4 @@ public class MongoGPSFixStoreImpl implements MongoGPSFixStore { } return ((Number) result.get(FieldNames.NUM_FIXES.name())).longValue(); } - } diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java index 1fc1556b995..9d514a64671 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java @@ -13,8 +13,6 @@ import java.util.logging.Level; import java.util.logging.Logger; import com.sap.sailing.domain.abstractlog.AbstractLog; -import com.sap.sailing.domain.abstractlog.MultiLogAnalyzer; -import com.sap.sailing.domain.abstractlog.MultiLogAnalyzer.MapWithValueCollectionReducer; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogEndOfTrackingEvent; @@ -33,11 +31,9 @@ import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDefineMarkEve import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceCompetitorMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.impl.BaseRegattaLogEventVisitor; -import com.sap.sailing.domain.abstractlog.shared.analyzing.DeviceCompetitorMappingFinder; -import com.sap.sailing.domain.abstractlog.shared.analyzing.DeviceMarkMappingFinder; +import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogDeviceCompetitorMappingFinder; +import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogDeviceMarkMappingFinder; import com.sap.sailing.domain.abstractlog.shared.events.DefineMarkEvent; -import com.sap.sailing.domain.abstractlog.shared.events.DeviceCompetitorMappingEvent; -import com.sap.sailing.domain.abstractlog.shared.events.DeviceMarkMappingEvent; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.ControlPoint; @@ -57,6 +53,7 @@ import com.sap.sailing.domain.common.PassingInstruction; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.TrackedRaceStatusEnum; import com.sap.sailing.domain.common.abstractlog.NotRevokableException; +import com.sap.sailing.domain.common.racelog.tracking.DoesNotHaveRegattaLogException; import com.sap.sailing.domain.common.racelog.tracking.RaceLogTrackingState; import com.sap.sailing.domain.common.racelog.tracking.RaceNotCreatedException; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; @@ -235,14 +232,12 @@ public class RaceLogRaceTracker implements RaceTracker, GPSFixReceivedListener { return params.getRaceLog().getId(); } - private Map>> getNewCompetitorMappings() { - return new MultiLogAnalyzer<>(new DeviceCompetitorMappingFinder.Factory(), - new MapWithValueCollectionReducer<>(), params.getLogHierarchy()).analyze(); + private Map>> getNewCompetitorMappings() throws DoesNotHaveRegattaLogException { + return new RegattaLogDeviceCompetitorMappingFinder(params.getRegattaLog()).analyze(); } - private Map>> getNewMarkMappings() { - return new MultiLogAnalyzer<>(new DeviceMarkMappingFinder.Factory(), new MapWithValueCollectionReducer<>(), - params.getLogHierarchy()).analyze(); + private Map>> getNewMarkMappings() throws DoesNotHaveRegattaLogException { + return new RegattaLogDeviceMarkMappingFinder(params.getRegattaLog()).analyze(); } /** @@ -314,7 +309,7 @@ public class RaceLogRaceTracker implements RaceTracker, GPSFixReceivedListener { return result; } - private void updateMarkMappings(boolean loadIfNotCovered) { + private void updateMarkMappings(boolean loadIfNotCovered) throws DoesNotHaveRegattaLogException { assert trackedRace != null; // TODO remove fixes, if mappings have been removed // check if there are new time ranges not covered so far @@ -348,9 +343,13 @@ public class RaceLogRaceTracker implements RaceTracker, GPSFixReceivedListener { updateStartAndEndOfTracking(); } - private void onDeviceMarkMappingEvent(DeviceMarkMappingEvent event) { + private void onDeviceMarkMappingEvent(RegattaLogDeviceMarkMappingEvent event) { if (trackedRace != null) { - updateMarkMappings(true); + try { + updateMarkMappings(true); + } catch (DoesNotHaveRegattaLogException e) { + logger.warning("Could not load update mark mappings as RegattaLog couldn't be found"); + } gpsFixStore.addListener(this, event.getDevice()); } } @@ -367,14 +366,18 @@ public class RaceLogRaceTracker implements RaceTracker, GPSFixReceivedListener { } } - private void onDeviceCompetitorMappingEvent(DeviceCompetitorMappingEvent event) { + private void onDeviceCompetitorMappingEvent(RegattaLogDeviceCompetitorMappingEvent event) { if (trackedRace != null) { - updateCompetitorMappings(true); + try { + updateCompetitorMappings(true); + } catch (DoesNotHaveRegattaLogException e) { + logger.warning("Could not load update competitor mappings as RegattaLog couldn't be found"); + } gpsFixStore.addListener(this, event.getDevice()); } } - private void updateCompetitorMappings(boolean loadIfNotCovered) { + private void updateCompetitorMappings(boolean loadIfNotCovered) throws DoesNotHaveRegattaLogException { // TODO remove fixes, if mappings have been removed // check if there are new time ranges not covered so far @@ -472,8 +475,12 @@ public class RaceLogRaceTracker implements RaceTracker, GPSFixReceivedListener { } } // update the device mappings (without loading the fixes, as the TrackedRace does this itself on startup) - updateCompetitorMappings(false); - updateMarkMappings(false); + try { + updateCompetitorMappings(false); + updateMarkMappings(false); + } catch (DoesNotHaveRegattaLogException e) { + logger.warning("Could not load update mark and competitor mappings as RegattaLog couldn't be found"); + } // add listeners for devices in mappings already present addListeners(competitorMappings); addListeners(markMappings); diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/regattalog/tracking/analyzing/test/DeviceMappingFinderTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/regattalog/tracking/analyzing/test/DeviceMappingFinderTest.java index 1360ce0dfd9..39b26f4124f 100644 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/regattalog/tracking/analyzing/test/DeviceMappingFinderTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/regattalog/tracking/analyzing/test/DeviceMappingFinderTest.java @@ -14,7 +14,7 @@ import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogCloseOpenEndedDeviceMappingEventImpl; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceCompetitorMappingEventImpl; -import com.sap.sailing.domain.abstractlog.shared.analyzing.DeviceCompetitorMappingFinder; +import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogDeviceCompetitorMappingFinder; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.impl.CompetitorImpl; import com.sap.sailing.domain.racelog.tracking.test.mock.SmartphoneImeiIdentifier; @@ -31,7 +31,7 @@ public class DeviceMappingFinderTest extends AbstractRegattaLogTrackingTest { private int time = 0; private List> getMappings() { - return new DeviceCompetitorMappingFinder<>(log).analyze().get(competitor); + return new RegattaLogDeviceCompetitorMappingFinder(log).analyze().get(competitor); } private TimePoint t() { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogDenoteForTrackingEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogDenoteForTrackingEvent.java index 9035e3b53a6..2115177e8f5 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogDenoteForTrackingEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogDenoteForTrackingEvent.java @@ -5,7 +5,7 @@ import java.io.Serializable; import com.sap.sailing.domain.abstractlog.Revokable; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.abstractlog.shared.events.DeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMappingEvent; import com.sap.sailing.domain.base.BoatClass; /** @@ -13,7 +13,7 @@ import com.sap.sailing.domain.base.BoatClass; * for creating this race will be accumulated in this RaceLog. Once it is present, the * actual {@link TrackedRace} can then be created from this information, and fixes for * competitors and marks that arrive on the server, for which a corresponding - * {@link DeviceMappingEvent} exists will be added to the race. + * {@link RegattaLogDeviceMappingEvent} exists will be added to the race. * @author Fredrik Teschke * */ diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceLogLastPingMappingEventFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceLogLastPingMappingEventFinder.java deleted file mode 100644 index dd484bce77a..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceLogLastPingMappingEventFinder.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl; - -import com.sap.sailing.domain.abstractlog.race.RaceLog; -import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; -import com.sap.sailing.domain.abstractlog.shared.analyzing.LastPingMappingEventFinder; -import com.sap.sse.common.WithID; - -public class RaceLogLastPingMappingEventFinder -extends LastPingMappingEventFinder { - - public RaceLogLastPingMappingEventFinder(RaceLog log, WithID forItem) { - super(log, forItem); - } - -} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/AbstractRaceLogDeviceMappingEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/AbstractRaceLogDeviceMappingEventImpl.java deleted file mode 100644 index 5729089b331..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/AbstractRaceLogDeviceMappingEventImpl.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.sap.sailing.domain.abstractlog.race.tracking.impl; - -import java.io.Serializable; -import java.util.List; - -import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; -import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.abstractlog.race.RaceLogEventData; -import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; -import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventDataImpl; -import com.sap.sailing.domain.abstractlog.shared.events.impl.AbstractDeviceMappingEventImpl; -import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; -import com.sap.sse.common.TimePoint; -import com.sap.sse.common.WithID; - -public abstract class AbstractRaceLogDeviceMappingEventImpl -extends AbstractDeviceMappingEventImpl implements RaceLogEvent { - private static final long serialVersionUID = -5114645637316367845L; - private final RaceLogEventData raceLogEventData; - - public AbstractRaceLogDeviceMappingEventImpl(TimePoint createdAt, TimePoint logicalTimePoint, - AbstractLogEventAuthor author, Serializable id, int passId, ItemT mappedTo, DeviceIdentifier device, - TimePoint from, TimePoint to) { - super(createdAt, logicalTimePoint, author, id, mappedTo, device, from, to); - this.raceLogEventData = new RaceLogEventDataImpl(null, passId); - } - - public AbstractRaceLogDeviceMappingEventImpl(TimePoint logicalTimePoint, - AbstractLogEventAuthor author, int passId, ItemT mappedTo, DeviceIdentifier device, - TimePoint from, TimePoint to) { - this(now(), logicalTimePoint, author, randId(), passId, mappedTo, device, from, to); - } - - @Override - public int getPassId() { - return raceLogEventData.getPassId(); - } - - @Override - public List getInvolvedBoats() { - return raceLogEventData.getInvolvedBoats(); - } - - @Override - public String toString() { - return raceLogEventData.toString(); - } -} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogCloseOpenEndedDeviceMappingEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogCloseOpenEndedDeviceMappingEvent.java index 31729ef4e2b..af41a6417b3 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogCloseOpenEndedDeviceMappingEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogCloseOpenEndedDeviceMappingEvent.java @@ -1,10 +1,26 @@ package com.sap.sailing.domain.abstractlog.regatta.events; +import java.io.Serializable; + +import com.sap.sailing.domain.abstractlog.Revokable; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; -import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; -import com.sap.sailing.domain.abstractlog.shared.events.CloseOpenEndedDeviceMappingEvent; - -public interface RegattaLogCloseOpenEndedDeviceMappingEvent extends RegattaLogEvent, -CloseOpenEndedDeviceMappingEvent { +import com.sap.sse.common.TimePoint; +/** + * Closes the time range of a {@link RegattaLogDeviceMappingEvent}. This means that the {@link #getClosingTimePoint() timepoint} provided + * by this event is substituted for the missing timepoint in the {@code DeviceMappingEvent} it refers to. + * @author Fredrik Teschke + * + */ +public interface RegattaLogCloseOpenEndedDeviceMappingEvent extends RegattaLogEvent, Revokable { + /** + * Returns the timepoint that shall substitute the missing one in the corresponding {@link RegattaLogDeviceMappingEvent}. + */ + TimePoint getClosingTimePoint(); + + /** + * Returns the {@code id} of the event for which this event provides the closing timepoint. + * @return + */ + Serializable getDeviceMappingEventId(); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogDeviceCompetitorMappingEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogDeviceCompetitorMappingEvent.java index 9ac5a429372..67e73aa1528 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogDeviceCompetitorMappingEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogDeviceCompetitorMappingEvent.java @@ -1,10 +1,7 @@ -package com.sap.sailing.domain.abstractlog.regatta.events; - -import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; -import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; -import com.sap.sailing.domain.abstractlog.shared.events.DeviceCompetitorMappingEvent; - -public interface RegattaLogDeviceCompetitorMappingEvent extends RegattaLogEvent, - DeviceCompetitorMappingEvent { - -} +package com.sap.sailing.domain.abstractlog.regatta.events; + +import com.sap.sailing.domain.base.Competitor; + +public interface RegattaLogDeviceCompetitorMappingEvent extends RegattaLogDeviceMappingEvent { + +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/DeviceMappingEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogDeviceMappingEvent.java similarity index 82% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/DeviceMappingEvent.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogDeviceMappingEvent.java index 19058c8c2ec..5bce4d51ef9 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/DeviceMappingEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogDeviceMappingEvent.java @@ -1,7 +1,7 @@ -package com.sap.sailing.domain.abstractlog.shared.events; +package com.sap.sailing.domain.abstractlog.regatta.events; -import com.sap.sailing.domain.abstractlog.AbstractLogEvent; import com.sap.sailing.domain.abstractlog.Revokable; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogDefinedMarkAnalyzer; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Mark; @@ -17,12 +17,12 @@ import com.sap.sse.common.WithID; * as the semantics of somehow later limiting this range would become unclear *

* If one end of the time range enclosed by {@link #getFrom()} and {@link #getTo()} is open, this can be closed - * by a {@link CloseOpenEndedDeviceMappingEvent}. + * by a {@link RegattaLogCloseOpenEndedDeviceMappingEvent}. * * @see RegattaLogDefinedMarkAnalyzer for rules by which {@link DeviceMapping}s are derived from these events. * @author Fredrik Teschke */ -public interface DeviceMappingEvent extends AbstractLogEvent, Revokable { +public interface RegattaLogDeviceMappingEvent extends RegattaLogEvent, Revokable { ItemType getMappedTo(); DeviceIdentifier getDevice(); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/impl/AbstractDeviceMappingEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogDeviceMappingEventImpl.java similarity index 73% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/impl/AbstractDeviceMappingEventImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogDeviceMappingEventImpl.java index 65a4d94129f..faeecc9eb1f 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/impl/AbstractDeviceMappingEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogDeviceMappingEventImpl.java @@ -1,16 +1,16 @@ -package com.sap.sailing.domain.abstractlog.shared.events.impl; +package com.sap.sailing.domain.abstractlog.regatta.events; import java.io.Serializable; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.impl.AbstractLogEventImpl; -import com.sap.sailing.domain.abstractlog.shared.events.DeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sse.common.TimePoint; import com.sap.sse.common.WithID; -public abstract class AbstractDeviceMappingEventImpl extends AbstractLogEventImpl implements -DeviceMappingEvent { +public abstract class RegattaLogDeviceMappingEventImpl extends AbstractLogEventImpl implements +RegattaLogDeviceMappingEvent { private static final long serialVersionUID = -8439653251231710356L; private final ItemType mappedTo; @@ -18,7 +18,7 @@ DeviceMappingEvent { private final TimePoint from; private final TimePoint to; - public AbstractDeviceMappingEventImpl(TimePoint createdAt, TimePoint logicalTimePoint, + public RegattaLogDeviceMappingEventImpl(TimePoint createdAt, TimePoint logicalTimePoint, AbstractLogEventAuthor author, Serializable id, ItemType mappedTo, DeviceIdentifier device, TimePoint from, TimePoint to) { super(createdAt, logicalTimePoint, author, id); @@ -28,7 +28,7 @@ DeviceMappingEvent { this.to = to; } - public AbstractDeviceMappingEventImpl(TimePoint logicalTimePoint, + public RegattaLogDeviceMappingEventImpl(TimePoint logicalTimePoint, AbstractLogEventAuthor author, ItemType mappedTo, DeviceIdentifier device, TimePoint from, TimePoint to) { this(now(), logicalTimePoint, author, randId(), mappedTo, device, from, to); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogDeviceMarkMappingEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogDeviceMarkMappingEvent.java index c51078cdcdd..0bf70f85644 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogDeviceMarkMappingEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogDeviceMarkMappingEvent.java @@ -1,10 +1,9 @@ -package com.sap.sailing.domain.abstractlog.regatta.events; - -import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; -import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; -import com.sap.sailing.domain.abstractlog.shared.events.DeviceMarkMappingEvent; - -public interface RegattaLogDeviceMarkMappingEvent extends RegattaLogEvent, - DeviceMarkMappingEvent { - -} +package com.sap.sailing.domain.abstractlog.regatta.events; + +import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; +import com.sap.sailing.domain.base.Mark; + + +public interface RegattaLogDeviceMarkMappingEvent extends RegattaLogDeviceMappingEvent, RegattaLogEvent { + +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogCloseOpenEndedDeviceMappingEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogCloseOpenEndedDeviceMappingEventImpl.java index 834b6a08bbe..8d45195d2a0 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogCloseOpenEndedDeviceMappingEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogCloseOpenEndedDeviceMappingEventImpl.java @@ -3,25 +3,43 @@ package com.sap.sailing.domain.abstractlog.regatta.events.impl; import java.io.Serializable; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.impl.AbstractLogEventImpl; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogCloseOpenEndedDeviceMappingEvent; -import com.sap.sailing.domain.abstractlog.shared.events.impl.BaseCloseOpenEndedDeviceMappingEventImpl; import com.sap.sse.common.TimePoint; -public class RegattaLogCloseOpenEndedDeviceMappingEventImpl extends BaseCloseOpenEndedDeviceMappingEventImpl -implements RegattaLogCloseOpenEndedDeviceMappingEvent { +public class RegattaLogCloseOpenEndedDeviceMappingEventImpl extends AbstractLogEventImpl + implements RegattaLogCloseOpenEndedDeviceMappingEvent { private static final long serialVersionUID = -5114645637316367845L; - - public RegattaLogCloseOpenEndedDeviceMappingEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, - TimePoint logicalTimePoint, Serializable id, Serializable deviceMappingEventId, - TimePoint closingTimePoint) { - super(createdAt, logicalTimePoint, author, id, deviceMappingEventId, closingTimePoint); + + private final Serializable deviceMappingEventId; + private final TimePoint closingTimePoint; + + public RegattaLogCloseOpenEndedDeviceMappingEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, + Serializable pId, Serializable deviceMappingEventId, TimePoint closingTimePoint) { + super(createdAt, logicalTimePoint, author, pId); + this.deviceMappingEventId = deviceMappingEventId; + this.closingTimePoint = closingTimePoint; } - - public RegattaLogCloseOpenEndedDeviceMappingEventImpl(AbstractLogEventAuthor author, - TimePoint logicalTimePoint, Serializable deviceMappingEventId, - TimePoint closingTimePoint) { - super(logicalTimePoint, author, deviceMappingEventId, closingTimePoint); + + public RegattaLogCloseOpenEndedDeviceMappingEventImpl(TimePoint logicalTimePoint, AbstractLogEventAuthor author, + Serializable deviceMappingEventId, TimePoint closingTimePoint) { + this( now(), author, logicalTimePoint, randId(), deviceMappingEventId, closingTimePoint); + } + + @Override + public Serializable getDeviceMappingEventId() { + return deviceMappingEventId; + } + + @Override + public TimePoint getClosingTimePoint() { + return closingTimePoint; + } + + @Override + public String getShortInfo() { + return "closing mapping (id: " + deviceMappingEventId + ") at " + closingTimePoint; } @Override diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDeviceCompetitorMappingEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDeviceCompetitorMappingEventImpl.java index aaf28ee10f2..f969abeb0f4 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDeviceCompetitorMappingEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDeviceCompetitorMappingEventImpl.java @@ -5,13 +5,12 @@ import java.io.Serializable; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceCompetitorMappingEvent; -import com.sap.sailing.domain.abstractlog.shared.events.impl.AbstractDeviceMappingEventImpl; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMappingEventImpl; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sse.common.TimePoint; -public class RegattaLogDeviceCompetitorMappingEventImpl extends - AbstractDeviceMappingEventImpl implements +public class RegattaLogDeviceCompetitorMappingEventImpl extends RegattaLogDeviceMappingEventImpl implements RegattaLogDeviceCompetitorMappingEvent { public RegattaLogDeviceCompetitorMappingEventImpl(TimePoint createdAt, TimePoint logicalTimePoint, AbstractLogEventAuthor author, Serializable pId, Competitor mappedTo, DeviceIdentifier device, @@ -19,9 +18,8 @@ public class RegattaLogDeviceCompetitorMappingEventImpl extends super(createdAt, logicalTimePoint, author, pId, mappedTo, device, from, to); } - public RegattaLogDeviceCompetitorMappingEventImpl(TimePoint logicalTimePoint, - AbstractLogEventAuthor author, Competitor mappedTo, DeviceIdentifier device, - TimePoint from, TimePoint to) { + public RegattaLogDeviceCompetitorMappingEventImpl(TimePoint logicalTimePoint, AbstractLogEventAuthor author, + Competitor mappedTo, DeviceIdentifier device, TimePoint from, TimePoint to) { super(logicalTimePoint, author, mappedTo, device, from, to); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDeviceMarkMappingEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDeviceMarkMappingEventImpl.java index f00b34d389d..fcf242deadb 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDeviceMarkMappingEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDeviceMarkMappingEventImpl.java @@ -4,18 +4,19 @@ import java.io.Serializable; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMappingEventImpl; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMarkMappingEvent; -import com.sap.sailing.domain.abstractlog.shared.events.impl.AbstractDeviceMappingEventImpl; import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sse.common.TimePoint; -public class RegattaLogDeviceMarkMappingEventImpl extends AbstractDeviceMappingEventImpl -implements RegattaLogDeviceMarkMappingEvent { +public class RegattaLogDeviceMarkMappingEventImpl extends RegattaLogDeviceMappingEventImpl implements + RegattaLogDeviceMarkMappingEvent { private static final long serialVersionUID = -7223543830755457196L; - public RegattaLogDeviceMarkMappingEventImpl(TimePoint createdAt, TimePoint logicalTimePoint, AbstractLogEventAuthor author, - Serializable pId, Mark mappedTo, DeviceIdentifier device, TimePoint from, TimePoint to) { + public RegattaLogDeviceMarkMappingEventImpl(TimePoint createdAt, TimePoint logicalTimePoint, + AbstractLogEventAuthor author, Serializable pId, Mark mappedTo, DeviceIdentifier device, TimePoint from, + TimePoint to) { super(createdAt, logicalTimePoint, author, pId, mappedTo, device, from, to); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/LastPingMappingEventFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/LastPingMappingEventFinder.java new file mode 100644 index 00000000000..e347dc02eca --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/LastPingMappingEventFinder.java @@ -0,0 +1,32 @@ +package com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl; + +import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMappingEvent; +import com.sap.sse.common.WithID; + +public class LastPingMappingEventFinder extends RegattaLogAnalyzer> { + private final WithID item; + + public LastPingMappingEventFinder(RegattaLog log, WithID forItem) { + super(log); + this.item = forItem; + } + + @Override + protected RegattaLogDeviceMappingEvent performAnalysis() { + for (RegattaLogEvent e : getLog().getUnrevokedEventsDescending()) { + if (e instanceof RegattaLogDeviceMappingEvent) { + RegattaLogDeviceMappingEvent mappingEvent = (RegattaLogDeviceMappingEvent) e; + if (item.equals(mappingEvent.getMappedTo()) && mappingEvent.getFrom() != null && + mappingEvent.getTo() != null && mappingEvent.getFrom().equals(mappingEvent.getTo())) { + @SuppressWarnings("unchecked") + RegattaLogDeviceMappingEvent cast = (RegattaLogDeviceMappingEvent) mappingEvent; + return cast; + } + } + } + return null; + } + +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceCompetitorMappingFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceCompetitorMappingFinder.java new file mode 100644 index 00000000000..a8eb5d6ee8c --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceCompetitorMappingFinder.java @@ -0,0 +1,18 @@ +package com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl; + +import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceCompetitorMappingEvent; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMappingEvent; +import com.sap.sailing.domain.base.Competitor; + +public class RegattaLogDeviceCompetitorMappingFinder extends RegattaLogDeviceMappingFinder { + + public RegattaLogDeviceCompetitorMappingFinder(RegattaLog log) { + super(log); + } + + @Override + protected boolean isValidMapping(RegattaLogDeviceMappingEvent mapping) { + return mapping instanceof RegattaLogDeviceCompetitorMappingEvent; + } +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/DeviceMappingFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceMappingFinder.java similarity index 55% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/DeviceMappingFinder.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceMappingFinder.java index b973abcdca9..25f2a087686 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/DeviceMappingFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceMappingFinder.java @@ -1,4 +1,4 @@ -package com.sap.sailing.domain.abstractlog.shared.analyzing; +package com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl; import java.io.Serializable; import java.util.ArrayList; @@ -8,14 +8,11 @@ import java.util.List; import java.util.Map; import java.util.logging.Logger; -import com.sap.sailing.domain.abstractlog.AbstractLog; -import com.sap.sailing.domain.abstractlog.AbstractLogEvent; -import com.sap.sailing.domain.abstractlog.BaseLogAnalyzer; -import com.sap.sailing.domain.abstractlog.LogAnalyzer; -import com.sap.sailing.domain.abstractlog.MultiLogAnalyzer.AnalyzerFactory; import com.sap.sailing.domain.abstractlog.race.RaceLog; -import com.sap.sailing.domain.abstractlog.shared.events.CloseOpenEndedDeviceMappingEvent; -import com.sap.sailing.domain.abstractlog.shared.events.DeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogCloseOpenEndedDeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMappingEvent; import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.racelogtracking.DeviceMapping; import com.sap.sailing.domain.racelogtracking.impl.DeviceMappingImpl; @@ -26,36 +23,26 @@ import com.sap.sse.common.impl.TimeRangeImpl; /** * Extracts the {@link DeviceMapping}s with the appropriate {@link TimeRange}s from the {@link RaceLog}. - * Based on the {@link DeviceMappingEvent}s found in the {@code RaceLog} for the tracked {@code items} + * Based on the {@link RegattaLogDeviceMappingEvent}s found in the {@code RaceLog} for the tracked {@code items} * ({@code Competitor}s and {@code Marks}), the actual mappings are created. *

* Mappings can be defined with an open-ended time range (e.g. track this from now on), which should then be - * closed by a corresponding {@link CloseOpenEndedDeviceMappingEvent}. + * closed by a corresponding {@link RegattaLogCloseOpenEndedDeviceMappingEvent}. *

* The process of removing conflicts between mappings to ensure that only one mapping was active for * one tracked item has been removed. Instead, every {@code DeviceMappingEvent} now results directly in one * {@code DeviceMapping}, the only changes being introduced by closing open time ranges in cases where an * according {@code CloseOpenEndedDeviceMappingEvent} exists. */ -public class DeviceMappingFinder, EventT extends AbstractLogEvent, -VisitorT, ItemT extends WithID> extends BaseLogAnalyzer>>> { +public class RegattaLogDeviceMappingFinder extends RegattaLogAnalyzer>>> { + private static Logger logger = Logger.getLogger(RegattaLogDeviceMappingFinder.class.getName()); - public static class Factory implements AnalyzerFactory>>> { - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public LogAnalyzer>>> createAnalyzer(AbstractLog log) { - return new DeviceMappingFinder(log); - } - } - - private static Logger logger = Logger.getLogger(DeviceMappingFinder.class.getName()); - - public DeviceMappingFinder(LogT log) { + public RegattaLogDeviceMappingFinder(RegattaLog log) { super(log); } - protected boolean isValidMapping(DeviceMappingEvent mapping) { - return mapping instanceof DeviceMappingEvent; + protected boolean isValidMapping(RegattaLogDeviceMappingEvent mapping) { + return mapping instanceof RegattaLogDeviceMappingEvent; } protected DeviceMapping getMapping(DeviceIdentifier device, ItemT item, @@ -74,18 +61,18 @@ VisitorT, ItemT extends WithID> extends BaseLogAnalyzer>> performAnalysis() { - Map>> events = new HashMap>>(); + Map>> events = new HashMap>>(); Map>> mappings = new HashMap>>(); - Map> closingEvents = new HashMap>(); + Map closingEvents = new HashMap(); - for (EventT e : getLog().getUnrevokedEvents()) { - if (e instanceof DeviceMappingEvent && isValidMapping(((DeviceMappingEvent) e))) { + for (RegattaLogEvent e : getLog().getUnrevokedEvents()) { + if (e instanceof RegattaLogDeviceMappingEvent && isValidMapping(((RegattaLogDeviceMappingEvent) e))) { @SuppressWarnings("unchecked") - DeviceMappingEvent mappingEvent = (DeviceMappingEvent) e; + RegattaLogDeviceMappingEvent mappingEvent = (RegattaLogDeviceMappingEvent) e; getItemSet(events, mappingEvent.getMappedTo()).add(mappingEvent); - } else if (e instanceof CloseOpenEndedDeviceMappingEvent) { + } else if (e instanceof RegattaLogCloseOpenEndedDeviceMappingEvent) { //a higher priority closing events for the same mapping event overwrites the lower priority one - CloseOpenEndedDeviceMappingEvent closingEvent = (CloseOpenEndedDeviceMappingEvent) e; + RegattaLogCloseOpenEndedDeviceMappingEvent closingEvent = (RegattaLogCloseOpenEndedDeviceMappingEvent) e; closingEvents.put(closingEvent.getDeviceMappingEventId(), closingEvent); } } @@ -97,11 +84,11 @@ VisitorT, ItemT extends WithID> extends BaseLogAnalyzer> closeOpenRanges(List> events, ItemT item, - Map> closingEvents) { + private List> closeOpenRanges(List> events, ItemT item, + Map closingEvents) { List> result = new ArrayList>(); - for (DeviceMappingEvent event : events) { + for (RegattaLogDeviceMappingEvent event : events) { TimePoint from = event.getFrom(); TimePoint to = event.getTo(); TimePoint closingTimePoint = closingEvents.containsKey(event.getId()) ? diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceMarkMappingFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceMarkMappingFinder.java new file mode 100644 index 00000000000..910011038b8 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceMarkMappingFinder.java @@ -0,0 +1,18 @@ +package com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl; + +import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceCompetitorMappingEvent; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMappingEvent; +import com.sap.sailing.domain.base.Mark; + +public class RegattaLogDeviceMarkMappingFinder extends RegattaLogDeviceMappingFinder { + + public RegattaLogDeviceMarkMappingFinder(RegattaLog log) { + super(log); + } + + @Override + protected boolean isValidMapping(RegattaLogDeviceMappingEvent mapping) { + return mapping instanceof RegattaLogDeviceCompetitorMappingEvent; + } +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogOpenEndedDeviceMappingCloser.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogOpenEndedDeviceMappingCloser.java index 783d3872c1c..431f644d934 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogOpenEndedDeviceMappingCloser.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogOpenEndedDeviceMappingCloser.java @@ -1,29 +1,55 @@ package com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl; import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; -import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; -import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogCloseOpenEndedDeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogCloseOpenEndedDeviceMappingEventImpl; -import com.sap.sailing.domain.abstractlog.shared.analyzing.OpenEndedDeviceMappingCloser; import com.sap.sailing.domain.racelogtracking.DeviceMapping; import com.sap.sse.common.TimePoint; +import com.sap.sse.common.impl.MillisecondsTimePoint; +/** + * Generates events that close the events that are responsible for the {@link #mapping} that is passed to the + * constructor. + * + * @author Fredrik Teschke + * + */ public class RegattaLogOpenEndedDeviceMappingCloser extends - OpenEndedDeviceMappingCloser { + RegattaLogAnalyzer> { + private final DeviceMapping mapping; + protected final AbstractLogEventAuthor author; + protected final TimePoint closingTimePoint; - public RegattaLogOpenEndedDeviceMappingCloser(RegattaLog log, DeviceMapping mapping, AbstractLogEventAuthor author, - TimePoint closingTimePoint) { - super(log, mapping, author, closingTimePoint); + public RegattaLogOpenEndedDeviceMappingCloser(RegattaLog log, DeviceMapping mapping, + AbstractLogEventAuthor author, TimePoint closingTimePoint) { + super(log); + this.mapping = mapping; + this.author = author; + this.closingTimePoint = closingTimePoint; + } + + protected RegattaLogCloseOpenEndedDeviceMappingEvent createCloseEvent(TimePoint logicalTimePoint, + Serializable eventToCloseId) { + return new RegattaLogCloseOpenEndedDeviceMappingEventImpl(logicalTimePoint, author, eventToCloseId, + closingTimePoint); } @Override - protected RegattaLogCloseOpenEndedDeviceMappingEvent createCloseEvent(TimePoint logicalTimePoint, - Serializable eventToCloseId) { - return new RegattaLogCloseOpenEndedDeviceMappingEventImpl(author, - logicalTimePoint, eventToCloseId, closingTimePoint); + protected List performAnalysis() { + List result = new ArrayList(); + + for (Serializable eventId : mapping.getOriginalRaceLogEventIds()) { + RegattaLogDeviceMappingEvent event = (RegattaLogDeviceMappingEvent) getLog().getEventById(eventId); + if (event.getFrom() == null || event.getTo() == null) { + result.add(createCloseEvent(MillisecondsTimePoint.now(), event.getId())); + } + } + return result; } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/DeviceCompetitorMappingFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/DeviceCompetitorMappingFinder.java deleted file mode 100644 index c562f1e6066..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/DeviceCompetitorMappingFinder.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.sap.sailing.domain.abstractlog.shared.analyzing; - -import java.util.List; -import java.util.Map; - -import com.sap.sailing.domain.abstractlog.AbstractLog; -import com.sap.sailing.domain.abstractlog.AbstractLogEvent; -import com.sap.sailing.domain.abstractlog.LogAnalyzer; -import com.sap.sailing.domain.abstractlog.MultiLogAnalyzer.AnalyzerFactory; -import com.sap.sailing.domain.abstractlog.shared.events.DeviceCompetitorMappingEvent; -import com.sap.sailing.domain.abstractlog.shared.events.DeviceMappingEvent; -import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelogtracking.DeviceMapping; - -public class DeviceCompetitorMappingFinder, EventT extends AbstractLogEvent, VisitorT> - extends DeviceMappingFinder { - - public static class Factory implements AnalyzerFactory>>> { - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public LogAnalyzer>>> createAnalyzer(AbstractLog log) { - return new DeviceCompetitorMappingFinder(log); - } - } - - public DeviceCompetitorMappingFinder(LogT log) { - super(log); - } - - @Override - protected boolean isValidMapping(DeviceMappingEvent mapping) { - return mapping instanceof DeviceCompetitorMappingEvent; - } -} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/DeviceMarkMappingFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/DeviceMarkMappingFinder.java deleted file mode 100644 index c8ef195833f..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/DeviceMarkMappingFinder.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.sap.sailing.domain.abstractlog.shared.analyzing; - -import java.util.List; -import java.util.Map; - -import com.sap.sailing.domain.abstractlog.AbstractLog; -import com.sap.sailing.domain.abstractlog.AbstractLogEvent; -import com.sap.sailing.domain.abstractlog.LogAnalyzer; -import com.sap.sailing.domain.abstractlog.MultiLogAnalyzer.AnalyzerFactory; -import com.sap.sailing.domain.abstractlog.shared.events.DeviceMappingEvent; -import com.sap.sailing.domain.abstractlog.shared.events.DeviceMarkMappingEvent; -import com.sap.sailing.domain.base.Mark; -import com.sap.sailing.domain.racelogtracking.DeviceMapping; - -public class DeviceMarkMappingFinder, EventT extends AbstractLogEvent, VisitorT> - extends DeviceMappingFinder { - - public static class Factory implements AnalyzerFactory>>> { - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public LogAnalyzer>>> createAnalyzer(AbstractLog log) { - return new DeviceMarkMappingFinder(log); - } - } - - public DeviceMarkMappingFinder(LogT log) { - super(log); - } - - @Override - protected boolean isValidMapping(DeviceMappingEvent mapping) { - return mapping instanceof DeviceMarkMappingEvent; - } -} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/LastPingMappingEventFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/LastPingMappingEventFinder.java deleted file mode 100644 index 045dbbab2a8..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/LastPingMappingEventFinder.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.sap.sailing.domain.abstractlog.shared.analyzing; - -import com.sap.sailing.domain.abstractlog.AbstractLog; -import com.sap.sailing.domain.abstractlog.AbstractLogEvent; -import com.sap.sailing.domain.abstractlog.BaseLogAnalyzer; -import com.sap.sailing.domain.abstractlog.shared.events.DeviceMappingEvent; -import com.sap.sse.common.WithID; - -public class LastPingMappingEventFinder , -EventT extends AbstractLogEvent, VisitorT, ItemT extends WithID> -extends BaseLogAnalyzer> { - private final WithID item; - - public LastPingMappingEventFinder(LogT log, WithID forItem) { - super(log); - this.item = forItem; - } - - @Override - protected DeviceMappingEvent performAnalysis() { - for (EventT e : getLog().getUnrevokedEventsDescending()) { - if (e instanceof DeviceMappingEvent) { - DeviceMappingEvent mappingEvent = (DeviceMappingEvent) e; - if (item.equals(mappingEvent.getMappedTo()) && mappingEvent.getFrom() != null && - mappingEvent.getTo() != null && mappingEvent.getFrom().equals(mappingEvent.getTo())) { - @SuppressWarnings("unchecked") - DeviceMappingEvent cast = (DeviceMappingEvent) mappingEvent; - return cast; - } - } - } - return null; - } - -} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/OpenEndedDeviceMappingCloser.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/OpenEndedDeviceMappingCloser.java deleted file mode 100644 index df6d098f905..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/OpenEndedDeviceMappingCloser.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.sap.sailing.domain.abstractlog.shared.analyzing; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; - -import com.sap.sailing.domain.abstractlog.AbstractLog; -import com.sap.sailing.domain.abstractlog.AbstractLogEvent; -import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; -import com.sap.sailing.domain.abstractlog.BaseLogAnalyzer; -import com.sap.sailing.domain.abstractlog.shared.events.CloseOpenEndedDeviceMappingEvent; -import com.sap.sailing.domain.abstractlog.shared.events.DeviceMappingEvent; -import com.sap.sailing.domain.racelogtracking.DeviceMapping; -import com.sap.sse.common.TimePoint; -import com.sap.sse.common.impl.MillisecondsTimePoint; - -/** - * Generates events that close the events that are responsible for the {@link #mapping} - * that is passed to the constructor. - * @author Fredrik Teschke - * - */ -public abstract class OpenEndedDeviceMappingCloser, -EventT extends AbstractLogEvent,VisitorT, CloseEventT extends CloseOpenEndedDeviceMappingEvent> -extends BaseLogAnalyzer> { - private final DeviceMapping mapping; - protected final AbstractLogEventAuthor author; - protected final TimePoint closingTimePoint; - - public OpenEndedDeviceMappingCloser(LogT log, DeviceMapping mapping, AbstractLogEventAuthor author, - TimePoint closingTimePoint) { - super(log); - this.mapping = mapping; - this.author = author; - this.closingTimePoint = closingTimePoint; - } - - protected abstract CloseEventT createCloseEvent(TimePoint logicalTimePoint, - Serializable eventToCloseId); - - @Override - protected List performAnalysis() { - List result = new ArrayList(); - - for (Serializable eventId : mapping.getOriginalRaceLogEventIds()) { - DeviceMappingEvent event = (DeviceMappingEvent) getLog().getEventById(eventId); - if (event.getFrom() == null || event.getTo() == null) { - result.add(createCloseEvent(MillisecondsTimePoint.now(), event.getId())); - } - } - return result; - } -} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/CloseOpenEndedDeviceMappingEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/CloseOpenEndedDeviceMappingEvent.java deleted file mode 100644 index b68af413ed0..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/CloseOpenEndedDeviceMappingEvent.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.sap.sailing.domain.abstractlog.shared.events; - -import java.io.Serializable; - -import com.sap.sailing.domain.abstractlog.AbstractLogEvent; -import com.sap.sailing.domain.abstractlog.Revokable; -import com.sap.sse.common.TimePoint; - -/** - * Closes the time range of a {@link DeviceMappingEvent}. This means that the {@link #getClosingTimePoint() timepoint} provided - * by this event is substituted for the missing timepoint in the {@code DeviceMappingEvent} it refers to. - * @author Fredrik Teschke - * - */ -public interface CloseOpenEndedDeviceMappingEvent extends AbstractLogEvent, Revokable { - /** - * Returns the timepoint that shall substitute the missing one in the corresponding {@link DeviceMappingEvent}. - */ - TimePoint getClosingTimePoint(); - - /** - * Returns the {@code id} of the event for which this event provides the closing timepoint. - * @return - */ - Serializable getDeviceMappingEventId(); -} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/DeviceCompetitorMappingEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/DeviceCompetitorMappingEvent.java deleted file mode 100644 index b69f0a013da..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/DeviceCompetitorMappingEvent.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.sap.sailing.domain.abstractlog.shared.events; - -import com.sap.sailing.domain.base.Competitor; - -public interface DeviceCompetitorMappingEvent extends DeviceMappingEvent { - -} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/DeviceMarkMappingEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/DeviceMarkMappingEvent.java deleted file mode 100644 index 57cf64aa6c9..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/DeviceMarkMappingEvent.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.sap.sailing.domain.abstractlog.shared.events; - -import com.sap.sailing.domain.base.Mark; - - -public interface DeviceMarkMappingEvent extends DeviceMappingEvent { - -} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/impl/BaseCloseOpenEndedDeviceMappingEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/impl/BaseCloseOpenEndedDeviceMappingEventImpl.java deleted file mode 100644 index 82f1b490017..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/impl/BaseCloseOpenEndedDeviceMappingEventImpl.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.sap.sailing.domain.abstractlog.shared.events.impl; - -import java.io.Serializable; - -import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; -import com.sap.sailing.domain.abstractlog.impl.AbstractLogEventImpl; -import com.sap.sailing.domain.abstractlog.shared.events.CloseOpenEndedDeviceMappingEvent; -import com.sap.sse.common.TimePoint; - -public abstract class BaseCloseOpenEndedDeviceMappingEventImpl extends AbstractLogEventImpl - implements CloseOpenEndedDeviceMappingEvent { - private static final long serialVersionUID = -2401732623610224918L; - - private final Serializable deviceMappingEventId; - private final TimePoint closingTimePoint; - - public BaseCloseOpenEndedDeviceMappingEventImpl(TimePoint createdAt, TimePoint logicalTimePoint, - AbstractLogEventAuthor author, Serializable pId, Serializable deviceMappingEventId, TimePoint closingTimePoint) { - super(createdAt, logicalTimePoint, author, pId); - this.deviceMappingEventId = deviceMappingEventId; - this.closingTimePoint = closingTimePoint; - } - - public BaseCloseOpenEndedDeviceMappingEventImpl(TimePoint logicalTimePoint, AbstractLogEventAuthor author, - Serializable deviceMappingEventId, TimePoint closingTimePoint) { - this(now(), logicalTimePoint, author, randId(), deviceMappingEventId, closingTimePoint); - } - - @Override - public Serializable getDeviceMappingEventId() { - return deviceMappingEventId; - } - - @Override - public TimePoint getClosingTimePoint() { - return closingTimePoint; - } - - @Override - public String getShortInfo() { - return "closing mapping (id: " + deviceMappingEventId + ") at " + closingTimePoint; - } -} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/DeviceMapping.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/DeviceMapping.java index 1e7554055d6..6a2fd5f831d 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/DeviceMapping.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/DeviceMapping.java @@ -3,13 +3,13 @@ package com.sap.sailing.domain.racelogtracking; import java.io.Serializable; import java.util.List; -import com.sap.sailing.domain.abstractlog.shared.analyzing.DeviceMappingFinder; +import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogDeviceMappingFinder; import com.sap.sse.common.TimeRange; import com.sap.sse.common.Timed; import com.sap.sse.common.WithID; /** - * @see DeviceMappingFinder {@code DeviceMappings} are derived from {@code DeviceMappingEvents}. The {@link Timed} interface + * @see RegattaLogDeviceMappingFinder {@code DeviceMappings} are derived from {@code DeviceMappingEvents}. The {@link Timed} interface * is to be implemented as providing the {@link TimeRange#from()} time point as the answer to {@link Timed#getTimePoint()}. * * @author Fredrik Teschke diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/impl/DeviceMappingImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/impl/DeviceMappingImpl.java index 7e916b7779b..c97d346d67b 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/impl/DeviceMappingImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/impl/DeviceMappingImpl.java @@ -4,7 +4,7 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.List; -import com.sap.sailing.domain.abstractlog.shared.events.DeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMappingEvent; import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.racelogtracking.DeviceMapping; import com.sap.sse.common.TimePoint; @@ -56,7 +56,7 @@ public class DeviceMappingImpl implements DeviceMapping return timeRange.from(); } - public static DeviceMapping convertToDeviceMapping(DeviceMappingEvent event) { + public static DeviceMapping convertToDeviceMapping(RegattaLogDeviceMappingEvent event) { return new DeviceMappingImpl(event.getMappedTo(), event.getDevice(), new TimeRangeImpl(event.getFrom(), event.getTo()), event.getId()); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/masterdataimport/TopLevelMasterData.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/masterdataimport/TopLevelMasterData.java index 1630d884685..6bdf06fb83b 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/masterdataimport/TopLevelMasterData.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/masterdataimport/TopLevelMasterData.java @@ -15,8 +15,8 @@ import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMarkMappingEvent; -import com.sap.sailing.domain.abstractlog.shared.events.DeviceMappingEvent; import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.Event; import com.sap.sailing.domain.base.Fleet; @@ -120,8 +120,8 @@ public class TopLevelMasterData implements Serializable { private void addAllFixesIfMappingEvent(GPSFixStore gpsFixStore, Map> relevantFixes, AbstractLogEvent logEvent) { - if (logEvent instanceof DeviceMappingEvent) { - DeviceMappingEvent mappingEvent = (DeviceMappingEvent) logEvent; + if (logEvent instanceof RegattaLogDeviceMappingEvent) { + RegattaLogDeviceMappingEvent mappingEvent = (RegattaLogDeviceMappingEvent) logEvent; try { addAllFixesForMappingEvent(gpsFixStore, relevantFixes, mappingEvent); } catch (NoCorrespondingServiceRegisteredException | TransformationException e) { @@ -132,7 +132,7 @@ public class TopLevelMasterData implements Serializable { } private void addAllFixesForMappingEvent(GPSFixStore gpsFixStore, Map> relevantFixes, - DeviceMappingEvent mappingEvent) throws NoCorrespondingServiceRegisteredException, TransformationException { + RegattaLogDeviceMappingEvent mappingEvent) throws NoCorrespondingServiceRegisteredException, TransformationException { DynamicGPSFixTrack track; if (isMarkMappingEvent(mappingEvent)) { track = new DynamicGPSFixTrackImpl(mappingEvent.getMappedTo(), 10000); @@ -156,7 +156,7 @@ public class TopLevelMasterData implements Serializable { } } - private boolean isMarkMappingEvent(DeviceMappingEvent mappingEvent) { + private boolean isMarkMappingEvent(RegattaLogDeviceMappingEvent mappingEvent) { boolean isMarkMappingEvent = false; if (mappingEvent instanceof RegattaLogDeviceMarkMappingEvent) { isMarkMappingEvent = true; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/EmptyGPSFixStore.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/EmptyGPSFixStore.java index a763c559b66..e88b8d4ca52 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/EmptyGPSFixStore.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/EmptyGPSFixStore.java @@ -1,6 +1,6 @@ package com.sap.sailing.domain.racelog.tracking; -import com.sap.sailing.domain.abstractlog.AbstractLog; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; @@ -23,12 +23,12 @@ public enum EmptyGPSFixStore implements GPSFixStore { @Override public void loadCompetitorTrack(DynamicGPSFixTrack track, - AbstractLog log, Competitor competitor) { + RegattaLog log, Competitor competitor) { } @Override public void loadMarkTrack(DynamicGPSFixTrack track, - AbstractLog log, Mark mark) { + RegattaLog log, Mark mark) { } @Override @@ -68,12 +68,12 @@ public enum EmptyGPSFixStore implements GPSFixStore { } @Override - public void loadCompetitorTrack(DynamicGPSFixTrack track, AbstractLog log, + public void loadCompetitorTrack(DynamicGPSFixTrack track, RegattaLog log, Competitor competitor, TimePoint start, TimePoint end) throws TransformationException { } @Override - public void loadMarkTrack(DynamicGPSFixTrack track, AbstractLog log, Mark mark, + public void loadMarkTrack(DynamicGPSFixTrack track, RegattaLog log, Mark mark, TimePoint start, TimePoint end) throws TransformationException, NoCorrespondingServiceRegisteredException { } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/GPSFixStore.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/GPSFixStore.java index eedda260a79..d0f3c30c81f 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/GPSFixStore.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/GPSFixStore.java @@ -1,8 +1,8 @@ package com.sap.sailing.domain.racelog.tracking; -import com.sap.sailing.domain.abstractlog.AbstractLog; -import com.sap.sailing.domain.abstractlog.shared.events.DeviceCompetitorMappingEvent; -import com.sap.sailing.domain.abstractlog.shared.events.DeviceMarkMappingEvent; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceCompetitorMappingEvent; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMarkMappingEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; @@ -19,14 +19,14 @@ import com.sap.sse.common.WithID; public interface GPSFixStore { /** - * Load all fixes that correspond to the {@link DeviceCompetitorMappingEvent}s found in the {@code raceLog}. + * Load all fixes that correspond to the {@link RegattaLogDeviceCompetitorMappingEvent}s found in the {@code raceLog}. */ - void loadCompetitorTrack(DynamicGPSFixTrack track, AbstractLog log, + void loadCompetitorTrack(DynamicGPSFixTrack track, RegattaLog log, Competitor competitor) throws TransformationException; /** * Load all fixes within the start and end time point (inclusive) that correspond to the - * {@link DeviceCompetitorMappingEvent}s found in the {@code raceLog}. + * {@link RegattaLogDeviceCompetitorMappingEvent}s found in the {@code raceLog}. * * @param start * if null, the start of the time range for which to load fixes is only constrained by the @@ -35,18 +35,18 @@ public interface GPSFixStore { * if null, the end of the time range for which to load fixes is only constrained by the * device mapping intervals */ - void loadCompetitorTrack(DynamicGPSFixTrack track, AbstractLog log, + void loadCompetitorTrack(DynamicGPSFixTrack track, RegattaLog log, Competitor competitor, TimePoint start, TimePoint end) throws TransformationException; /** - * Load all fixes that correspond to the {@link DeviceMarkMappingEvent}s found in the {@code raceLog}. + * Load all fixes that correspond to the {@link RegattaLogDeviceMarkMappingEvent}s found in the {@code raceLog}. */ - void loadMarkTrack(DynamicGPSFixTrack track, AbstractLog log, Mark mark) throws TransformationException, + void loadMarkTrack(DynamicGPSFixTrack track, RegattaLog log, Mark mark) throws TransformationException, NoCorrespondingServiceRegisteredException; /** * Load all fixes within the start and end time point (inclusive) that correspond to the - * {@link DeviceMarkMappingEvent}s found in the {@code raceLog}. + * {@link RegattaLogDeviceMarkMappingEvent}s found in the {@code raceLog}. * * @param start * if null, the start of the time range for which to load fixes is only constrained by the @@ -55,7 +55,7 @@ public interface GPSFixStore { * if null, the end of the time range for which to load fixes is only constrained by the * device mapping intervals */ - void loadMarkTrack(DynamicGPSFixTrack track, AbstractLog log, Mark mark, TimePoint start, + void loadMarkTrack(DynamicGPSFixTrack track, RegattaLog log, Mark mark, TimePoint start, TimePoint end) throws TransformationException, NoCorrespondingServiceRegisteredException; /** diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java index 290b6e31eb1..efe85b87bf7 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java @@ -10,7 +10,7 @@ import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver; import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedure; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; -import com.sap.sailing.domain.abstractlog.shared.events.DeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMappingEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Course; import com.sap.sailing.domain.base.Leg; @@ -690,7 +690,7 @@ public interface TrackedRace extends Serializable, IsManagedByCache { @Override public void attachRaceLog(RaceLog raceLog) { - super.attachRaceLog(raceLog); logListener.addTo(raceLog); } 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 f825b121646..27632a6d7de 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 @@ -33,9 +33,6 @@ import java.util.logging.Level; import java.util.logging.Logger; import com.sap.sailing.domain.abstractlog.AbstractLog; -import com.sap.sailing.domain.abstractlog.AbstractLogEvent; -import com.sap.sailing.domain.abstractlog.MultiLogAnalyzer; -import com.sap.sailing.domain.abstractlog.MultiLogAnalyzer.MapWithValueCollectionReducer; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogDependentStartTimeEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogEndOfTrackingEvent; @@ -52,7 +49,7 @@ import com.sap.sailing.domain.abstractlog.race.state.impl.RaceStateImpl; import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ReadonlyRacingProcedure; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogDefinedMarkAnalyzer; -import com.sap.sailing.domain.abstractlog.shared.analyzing.DeviceMarkMappingFinder; +import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogDeviceMarkMappingFinder; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Course; @@ -1835,10 +1832,6 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl } private void loadGPSFixesForExtendedTimeRange(final TimePoint start, final TimePoint end, final boolean waitForGPSFixesToLoad) { - for (final RaceLog raceLog : attachedRaceLogs.values()) { - loadFixesForLog(raceLog, /* no need to addLogToMap because log has already been added during attachRaceLog */ null, - /* startOfTimeWindowToLoad */ start, /* endOfTimeWindowToLoad */ end, waitForGPSFixesToLoad); - } for (final RegattaLog regattaLog : attachedRegattaLogs.values()) { loadFixesForLog(regattaLog, /* no need to addLogToMap because log has already been added during attachRaceLog */ null, /* startOfTimeWindowToLoad */ start, /* endOfTimeWindowToLoad */ end, waitForGPSFixesToLoad); @@ -3202,8 +3195,8 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl * waiters on this object are notified when done with adding the log to * addLogToMap. */ - private , EventT extends AbstractLogEvent, VisitorT> void loadFixesForLog( - final LogT log, ConcurrentHashMap addLogToMap, final boolean waitForGPSFixesToLoad) { + private void loadFixesForLog( + final RegattaLog log, ConcurrentHashMap addLogToMap, final boolean waitForGPSFixesToLoad) { if (log != null) { // Use the new log, that possibly contains device mappings, to load GPSFix tracks from the DB // When this tracked race is to be serialized, wait for the loading from stores to complete. @@ -3234,8 +3227,8 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl * the time to use to crop the end of the time range for which to load fixes; if null, * the end of the time range will be restricted only by the device mapping intervals */ - private , EventT extends AbstractLogEvent, VisitorT> void loadFixesForLog(final LogT log, - ConcurrentHashMap addLogToMap, final TimePoint startOfTimeWindowToLoad, + private void loadFixesForLog(final RegattaLog log, + ConcurrentHashMap addLogToMap, final TimePoint startOfTimeWindowToLoad, final TimePoint endOfTimeWindowToLoad, final boolean waitForGPSFixesToLoad) { Thread t = new Thread("Mongo mark and competitor track loader for tracked race " + getRace().getName() + ", log " + log.getId()+" from "+startOfTimeWindowToLoad+" to "+endOfTimeWindowToLoad) { @@ -3311,23 +3304,6 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl return loadingFromGPSFixStore; } - /** - * This can trigger fixes to be loaded, if there are {@link DeviceMapping}s in the {@code RaceLog}. - * If multiple race logs are attached, the threads that are spawned to load fixes will do so one - * after another, as they acquire a write lock on the {@link #loadingFromGPSFixStoreLock}. - */ - @Override - public void attachRaceLog(final RaceLog raceLog) { - loadFixesForLog(raceLog, attachedRaceLogs, /* wait for fixes to load */ false); - try { - // The log is attached to the tracked race by a background thread; this method wants - // to guarantee that the log is at least really attached to the TrackedRace before returning: - waitForLoadingFromGPSFixStoreToFinishRunning(raceLog); - } catch (InterruptedException e) { - logger.log(Level.WARNING, "Interrupted while waiting for race log being attached", e); - } - } - @Override public void attachRaceExecutionProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { if (raceExecutionOrderProvider != null && !attachedRaceExecutionOrderProviders.containsKey(raceExecutionOrderProvider)) { @@ -3921,21 +3897,16 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl @Override public Iterable getMarksFromRaceAndLogs() { - final List> allLogs = new ArrayList>(); - final List> raceLogs = new ArrayList<>(); - raceLogs.addAll(attachedRaceLogs.values()); - allLogs.addAll(raceLogs); - allLogs.addAll(attachedRegattaLogs.values()); - final Map>> markMappings = new MultiLogAnalyzer<>(new DeviceMarkMappingFinder.Factory(), - new MapWithValueCollectionReducer<>(), allLogs).analyze(); + final Map>> markMappings = new HashMap<>(); final Set result = new HashSet<>(); - result.addAll(markMappings.keySet()); Set marksDefinedInRegattaLog = new HashSet(); for (RegattaLog log: attachedRegattaLogs.values()){ marksDefinedInRegattaLog.addAll(new RegattaLogDefinedMarkAnalyzer(log).analyze()); + markMappings.putAll(new RegattaLogDeviceMarkMappingFinder(log).analyze()); } result.addAll(marksDefinedInRegattaLog); + result.addAll(markMappings.keySet()); return result; } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogTrackingDeviceMappingsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogTrackingDeviceMappingsDialog.java index 86672aeb74a..fb0ad4b1207 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogTrackingDeviceMappingsDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogTrackingDeviceMappingsDialog.java @@ -25,7 +25,7 @@ public class RegattaLogTrackingDeviceMappingsDialog extends AbstractLogTrackingD @Override protected void refresh() { - sailingService.getDeviceMappingsFromLogHierarchy(leaderboardName, new AsyncCallback>() { + sailingService.getDeviceMappings(leaderboardName, new AsyncCallback>() { @Override public void onSuccess(List result) { mappings = result; 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 7afdc835482..fc5c25987da 100755 --- 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 @@ -485,9 +485,6 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS */ void pingMark(String leaderboardName, MarkDTO mark, Position position) throws DoesNotHaveRegattaLogException; - List getDeviceMappingsFromRaceLog(String leaderboardName, String raceColumnName, String fleetName) - throws TransformationException, NotFoundException; - List getDeserializableDeviceIdentifierTypes(); /** @@ -548,8 +545,6 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS Integer getStructureImportOperationProgress(); - List getDeviceMappingsFromLogHierarchy(String leaderboardName, String raceColumnName, - String fleetName) throws TransformationException, NotFoundException; void inviteCompetitorsForTrackingViaEmail(String serverUrlWithoutTrailingSlash, EventDTO event, String leaderboardName, Collection competitors, String localeInfo) throws MailException; @@ -560,7 +555,7 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS Iterable getMarksInRegattaLog(String leaderboardName) throws DoesNotHaveRegattaLogException; - List getDeviceMappingsFromLogHierarchy(String leaderboardName) throws TransformationException; + List getDeviceMappings(String leaderboardName) throws DoesNotHaveRegattaLogException, TransformationException; void revokeRaceAndRegattaLogEvents(String leaderboardName, List eventIds) throws NotRevokableException, DoesNotHaveRegattaLogException; 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 293fcff46ec..de885604ebb 100755 --- 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 @@ -642,15 +642,6 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan void getDeserializableDeviceIdentifierTypes(AsyncCallback> callback); - /** - * Do not only use the racelog, but also other logs (e.g. RegattaLogs) in the hierarchy of the race. - */ - void getDeviceMappingsFromLogHierarchy(String leaderboardName, String raceColumnName, String fleetName, - AsyncCallback> callback); - - void getDeviceMappingsFromRaceLog(String leaderboardName, String raceColumnName, String fleetName, - AsyncCallback> callback); - void revokeRaceAndRegattaLogEvents(String leaderboardName, String raceColumnName, String fleetName, List eventIds, AsyncCallback callback); @@ -706,7 +697,7 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan void getMarksInRegattaLog(String leaderboardName, AsyncCallback> callback); - void getDeviceMappingsFromLogHierarchy(String leaderboardName, AsyncCallback> asyncCallback); + void getDeviceMappings(String leaderboardName, AsyncCallback> asyncCallback); void revokeRaceAndRegattaLogEvents(String leaderboardName, List eventIds, AsyncCallback callback); 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 d288eb50ae3..03cda85673b 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 @@ -58,7 +58,6 @@ import org.osgi.util.tracker.ServiceTracker; import com.sap.sailing.domain.abstractlog.AbstractLog; import com.sap.sailing.domain.abstractlog.AbstractLogEvent; -import com.sap.sailing.domain.abstractlog.MultiLogAnalyzer; import com.sap.sailing.domain.abstractlog.impl.AllEventsOfTypeFinder; import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; import com.sap.sailing.domain.abstractlog.race.RaceLog; @@ -90,9 +89,9 @@ import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDefineMa import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceCompetitorMappingEventImpl; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceMarkMappingEventImpl; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogRevokeEventImpl; +import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogDeviceCompetitorMappingFinder; +import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogDeviceMarkMappingFinder; import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogOpenEndedDeviceMappingCloser; -import com.sap.sailing.domain.abstractlog.shared.analyzing.DeviceCompetitorMappingFinder; -import com.sap.sailing.domain.abstractlog.shared.analyzing.DeviceMarkMappingFinder; import com.sap.sailing.domain.base.Boat; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; @@ -159,7 +158,6 @@ import com.sap.sailing.domain.common.PolarSheetsXYDiagramData; import com.sap.sailing.domain.common.Position; import com.sap.sailing.domain.common.RaceFetcher; import com.sap.sailing.domain.common.RaceIdentifier; -import com.sap.sailing.domain.common.UnableToCloseDeviceMappingException; import com.sap.sailing.domain.common.RankingMetrics; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.RegattaFetcher; @@ -174,6 +172,7 @@ import com.sap.sailing.domain.common.ScoringSchemeType; import com.sap.sailing.domain.common.Speed; import com.sap.sailing.domain.common.SpeedWithBearing; import com.sap.sailing.domain.common.Tack; +import com.sap.sailing.domain.common.UnableToCloseDeviceMappingException; import com.sap.sailing.domain.common.Wind; import com.sap.sailing.domain.common.WindSource; import com.sap.sailing.domain.common.WindSourceType; @@ -5347,21 +5346,15 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S return result; } - private List getDeviceMappingsFromLogs(List> logs) + private List getDeviceMappings(RegattaLog regattaLog) throws TransformationException { List result = new ArrayList(); - for (List> list : new MultiLogAnalyzer<>( - new DeviceCompetitorMappingFinder.Factory(), - new MultiLogAnalyzer.MapWithValueCollectionReducer, List>>(), - logs).analyze().values()) { + for (List> list : new RegattaLogDeviceCompetitorMappingFinder(regattaLog).analyze().values()) { for (DeviceMapping mapping : list) { result.add(convertToDeviceMappingDTO(mapping)); } } - for (List> list : new MultiLogAnalyzer<>( - new DeviceMarkMappingFinder.Factory(), - new MultiLogAnalyzer.MapWithValueCollectionReducer, List>>(), - logs).analyze().values()) { + for (List> list : new RegattaLogDeviceMarkMappingFinder(regattaLog).analyze().values()) { for (DeviceMapping mapping : list) { result.add(convertToDeviceMappingDTO(mapping)); } @@ -5369,19 +5362,6 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S return result; } - @Override - public List getDeviceMappingsFromLogHierarchy(String leaderboardName, String raceColumnName, - String fleetName) throws TransformationException, NotFoundException { - return getDeviceMappingsFromLogs(getLogHierarchy(leaderboardName, raceColumnName, fleetName)); - } - - @Override - public List getDeviceMappingsFromRaceLog(String leaderboardName, String raceColumnName, - String fleetName) throws TransformationException, NotFoundException { - RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); - return getDeviceMappingsFromLogs(Collections.>singletonList(raceLog)); - } - @Override public void addDeviceMappingToRegattaLog(String leaderboardName, DeviceMappingDTO dto) throws NoCorrespondingServiceRegisteredException, TransformationException, DoesNotHaveRegattaLogException { @@ -5824,12 +5804,6 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S } return result; } - - @Override - public List getDeviceMappingsFromLogHierarchy(String leaderboardName) throws TransformationException { - List> logs = getLogHierarchy(leaderboardName); - return getDeviceMappingsFromLogs(logs); - } /** * Gets all Marks defined in the RegattaLog and the trackedRace @@ -6053,4 +6027,11 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S return new Pair(marksAreUsedInOtherRaceLogs, racesInCollision.substring(0, Math.max(0, racesInCollision.length()-2))); } + + @Override + public List getDeviceMappings(String leaderboardName) + throws DoesNotHaveRegattaLogException, TransformationException { + RegattaLog regattaLog = getRegattaLogInternal(leaderboardName); + return getDeviceMappings(regattaLog); + } } diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDeviceMappingEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDeviceMappingEventDeserializer.java deleted file mode 100644 index d107823a514..00000000000 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDeviceMappingEventDeserializer.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.sap.sailing.server.gateway.deserialization.racelog.impl; - -import java.io.Serializable; -import java.util.List; - -import org.json.simple.JSONObject; - -import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; -import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; -import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; -import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; -import com.sap.sailing.server.gateway.deserialization.impl.Helpers; -import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogDeviceMappingEventSerializer; -import com.sap.sse.common.TimePoint; -import com.sap.sse.common.WithID; -import com.sap.sse.common.impl.MillisecondsTimePoint; - -public abstract class RaceLogDeviceMappingEventDeserializer -extends BaseRaceLogEventDeserializer { - protected final JsonDeserializer deviceDeserializer; - - public RaceLogDeviceMappingEventDeserializer( - JsonDeserializer competitorDeserializer, - JsonDeserializer deviceDeserializer) { - super(competitorDeserializer); - this.deviceDeserializer = deviceDeserializer; - } - - protected abstract RaceLogEvent furtherDeserialize(JSONObject itemObject, TimePoint from, TimePoint to, - DeviceIdentifier device, Serializable id, TimePoint createdAt, AbstractLogEventAuthor author, - TimePoint timePoint, int passId) throws JsonDeserializationException; - - @Override - protected RaceLogEvent deserialize(JSONObject object, Serializable id, - TimePoint createdAt, AbstractLogEventAuthor author, - TimePoint timePoint, int passId, List competitors) - throws JsonDeserializationException { - JSONObject deviceJson = Helpers.toJSONObjectSafe(object.get(RaceLogDeviceMappingEventSerializer.FIELD_DEVICE)); - DeviceIdentifier device = deviceDeserializer.deserialize(deviceJson); - JSONObject itemObject = Helpers.getNestedObjectSafe(object, RaceLogDeviceMappingEventSerializer.FIELD_ITEM); - long fromMillis = (Long) object.get(RaceLogDeviceMappingEventSerializer.FIELD_FROM_MILLIS); - long toMillis = (Long) object.get(RaceLogDeviceMappingEventSerializer.FIELD_TO_MILLIS); - TimePoint from = new MillisecondsTimePoint(fromMillis); - TimePoint to = new MillisecondsTimePoint(toMillis); - return furtherDeserialize(itemObject, from, to, device, id, createdAt, author, timePoint, passId); - } -} diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogDeviceCompetitorMappingEventSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogDeviceCompetitorMappingEventSerializer.java deleted file mode 100644 index 424a12d1ff7..00000000000 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogDeviceCompetitorMappingEventSerializer.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.sap.sailing.server.gateway.serialization.racelog.impl; - -import org.json.simple.JSONObject; - -import com.sap.sailing.domain.abstractlog.shared.events.DeviceCompetitorMappingEvent; -import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; -import com.sap.sailing.server.gateway.serialization.JsonSerializer; - -public class RaceLogDeviceCompetitorMappingEventSerializer extends RaceLogDeviceMappingEventSerializer { - public static final String VALUE_CLASS = DeviceCompetitorMappingEvent.class.getSimpleName(); - - public RaceLogDeviceCompetitorMappingEventSerializer( - JsonSerializer competitorSerializer, - JsonSerializer deviceSerializer) { - super(competitorSerializer, deviceSerializer); - } - - @Override - protected String getClassFieldValue() { - return VALUE_CLASS; - } - - @Override - protected JSONObject serializeItem(Competitor item) { - return competitorSerializer.serialize(item); - } -} diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogDeviceMappingEventSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogDeviceMappingEventSerializer.java deleted file mode 100644 index 5629f84da5d..00000000000 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogDeviceMappingEventSerializer.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.sap.sailing.server.gateway.serialization.racelog.impl; - -import org.json.simple.JSONObject; - -import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.abstractlog.shared.events.DeviceMappingEvent; -import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; -import com.sap.sailing.server.gateway.serialization.JsonSerializer; -import com.sap.sse.common.WithID; - -public abstract class RaceLogDeviceMappingEventSerializer extends BaseRaceLogEventSerializer { - private final JsonSerializer deviceSerializer; - public static final String FIELD_ITEM = "item"; - public static final String FIELD_DEVICE = "device"; - public static final String FIELD_FROM_MILLIS = "fromMillis"; - public static final String FIELD_TO_MILLIS = "toMillis"; - - public RaceLogDeviceMappingEventSerializer(JsonSerializer competitorSerializer, - JsonSerializer deviceSerializer) { - super(competitorSerializer); - this.deviceSerializer = deviceSerializer; - } - - protected abstract JSONObject serializeItem(ItemT item); - - @Override - public JSONObject serialize(RaceLogEvent object) { - @SuppressWarnings("unchecked") - DeviceMappingEvent event = (DeviceMappingEvent) object; - JSONObject result = super.serialize(object); - result.put(FIELD_FROM_MILLIS, event.getFrom().asMillis()); - result.put(FIELD_TO_MILLIS, event.getTo().asMillis()); - result.put(FIELD_ITEM, serializeItem(event.getMappedTo())); - result.put(FIELD_DEVICE, deviceSerializer.serialize(event.getDevice())); - return result; - } - -} diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogDeviceMarkMappingEventSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogDeviceMarkMappingEventSerializer.java deleted file mode 100644 index aa5bbf0a571..00000000000 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogDeviceMarkMappingEventSerializer.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.sap.sailing.server.gateway.serialization.racelog.impl; - -import org.json.simple.JSONObject; - -import com.sap.sailing.domain.abstractlog.shared.events.DeviceMarkMappingEvent; -import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.base.ControlPoint; -import com.sap.sailing.domain.base.Mark; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; -import com.sap.sailing.server.gateway.serialization.JsonSerializer; - -public class RaceLogDeviceMarkMappingEventSerializer extends RaceLogDeviceMappingEventSerializer { - public static final String VALUE_CLASS = DeviceMarkMappingEvent.class.getSimpleName(); - private final JsonSerializer markSerializer; - - public RaceLogDeviceMarkMappingEventSerializer( - JsonSerializer competitorSerializer, JsonSerializer markSerializer, - JsonSerializer deviceSerializer) { - super(competitorSerializer, deviceSerializer); - this.markSerializer = markSerializer; - } - - @Override - protected String getClassFieldValue() { - return VALUE_CLASS; - } - - @Override - protected JSONObject serializeItem(Mark item) { - return markSerializer.serialize(item); - } -} diff --git a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourcePingMarkTest.java b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourcePingMarkTest.java index 6285ecd2a37..2f7220464db 100644 --- a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourcePingMarkTest.java +++ b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourcePingMarkTest.java @@ -15,7 +15,7 @@ import org.junit.Before; import org.junit.Test; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; -import com.sap.sailing.domain.abstractlog.shared.analyzing.DeviceMarkMappingFinder; +import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogDeviceMarkMappingFinder; import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.impl.BoatClassImpl; @@ -77,7 +77,7 @@ public class LeaderboardsResourcePingMarkTest extends AbstractJaxRsApiTest { { Response response = resource.pingMark(PING_MARK_JSON, leaderboard.getName(), mark.getId().toString()); assertThat("response is ok", response.getStatus(), equalTo(Response.Status.OK.getStatusCode())); - Map>> mappings = new DeviceMarkMappingFinder<>(log).analyze(); + Map>> mappings = new RegattaLogDeviceMarkMappingFinder(log).analyze(); List> mappingsForMark = mappings.get(mark); assertThat("one mapping was created for the one ping", mappingsForMark.size(), equalTo(1)); assertOneFixPerMapping(mappingsForMark); @@ -87,7 +87,7 @@ public class LeaderboardsResourcePingMarkTest extends AbstractJaxRsApiTest { // position, and another one with the new position. Response response = resource.pingMark(PING2_MARK_JSON, leaderboard.getName(), mark.getId().toString()); assertThat("response is ok", response.getStatus(), equalTo(Response.Status.OK.getStatusCode())); - Map>> mappings = new DeviceMarkMappingFinder<>(log).analyze(); + Map>> mappings = new RegattaLogDeviceMarkMappingFinder(log).analyze(); List> mappingsForMark = mappings.get(mark); assertThat("Assert an additional mapping was created for the second ping", mappingsForMark.size(), equalTo(2)); assertOneFixPerMapping(mappingsForMark); diff --git a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourceCheckinAndOutTest.java b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourceCheckinAndOutTest.java index c6b8224805a..ce41334c142 100644 --- a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourceCheckinAndOutTest.java +++ b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourceCheckinAndOutTest.java @@ -17,8 +17,8 @@ import org.junit.Before; import org.junit.Test; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; +import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogDeviceCompetitorMappingFinder; import com.sap.sailing.domain.abstractlog.shared.analyzing.CompetitorsInLogAnalyzer; -import com.sap.sailing.domain.abstractlog.shared.analyzing.DeviceCompetitorMappingFinder; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.impl.BoatClassImpl; @@ -74,7 +74,7 @@ public class LeaderboardsResourceCheckinAndOutTest extends AbstractJaxRsApiTest assertThat("checkin returns OK", response.getStatus(), equalTo(Response.Status.OK.getStatusCode())); Set registeredCompetitors = new CompetitorsInLogAnalyzer<>(log).analyze(); - Map>> mappings = new DeviceCompetitorMappingFinder<>(log).analyze(); + Map>> mappings = new RegattaLogDeviceCompetitorMappingFinder(log).analyze(); assertThat("competitor was registered", registeredCompetitors.size(), equalTo(1)); assertThat("device mappings for competitor exist", mappings.size(), equalTo(1)); @@ -97,7 +97,7 @@ public class LeaderboardsResourceCheckinAndOutTest extends AbstractJaxRsApiTest response = resource.postCheckout(json.toString(), leaderboard.getName()); assertThat("checkout returns OK", response.getStatus(), equalTo(Response.Status.OK.getStatusCode())); - mappings = new DeviceCompetitorMappingFinder<>(log).analyze(); + mappings = new RegattaLogDeviceCompetitorMappingFinder(log).analyze(); mappingForC = mappings.get(competitor).get(0); assertThat("mapping now ends at checkout timepoint", mappingForC.getTimeRange().to().asMillis(), equalTo(toMillis)); diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java index 17b4d0ad881..a8ac335e2eb 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java @@ -494,7 +494,7 @@ public class LeaderboardsResource extends AbstractSailingServerResource { } RegattaLogCloseOpenEndedDeviceMappingEventImpl event = new RegattaLogCloseOpenEndedDeviceMappingEventImpl( - author, now, deviceMappingEventId, closingTimePoint); + now, author, deviceMappingEventId, closingTimePoint); isRegattaLike.getRegattaLog().add(event); logger.fine("Successfully checked out competitor " + mappedTo.getName()); From 4714b14b26a7e95cecb4aae3185eb53c8939c302 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Thu, 10 Dec 2015 19:03:52 +0100 Subject: [PATCH 059/165] Refactor DefindeMarkEvent --- .../impl/RaceLogRaceTracker.java | 3 +- .../events/RegattaLogDefineMarkEvent.java | 5 +-- .../impl/RegattaLogDefineMarkEventImpl.java | 19 +++++++++-- .../shared/events/DefineMarkEvent.java | 9 ----- .../impl/AbstractDefineMarkEventImpl.java | 33 ------------------- 5 files changed, 18 insertions(+), 51 deletions(-) delete mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/DefineMarkEvent.java delete mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/impl/AbstractDefineMarkEventImpl.java diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java index 9d514a64671..0c94ca999c6 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java @@ -33,7 +33,6 @@ import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMarkMap import com.sap.sailing.domain.abstractlog.regatta.impl.BaseRegattaLogEventVisitor; import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogDeviceCompetitorMappingFinder; import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogDeviceMarkMappingFinder; -import com.sap.sailing.domain.abstractlog.shared.events.DefineMarkEvent; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.ControlPoint; @@ -360,7 +359,7 @@ public class RaceLogRaceTracker implements RaceTracker, GPSFixReceivedListener { * {@link RaceLogDefineMarkEvent} is received, the existence of the track for that mark in the {@link TrackedRace} * has to be ensured, also ensuring that the mark will exist in the mark tracks map key set. */ - private void onDefineMarkEvent(DefineMarkEvent event) { + private void onDefineMarkEvent(RegattaLogDefineMarkEvent event) { if (trackedRace != null) { trackedRace.getOrCreateTrack(event.getMark()); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogDefineMarkEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogDefineMarkEvent.java index bb8c7fa5229..03c39fb4e67 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogDefineMarkEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogDefineMarkEvent.java @@ -1,15 +1,12 @@ package com.sap.sailing.domain.abstractlog.regatta.events; -import com.sap.sailing.domain.abstractlog.Revokable; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; -import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; -import com.sap.sailing.domain.abstractlog.shared.events.DefineMarkEvent; import com.sap.sailing.domain.base.Mark; /** * Defines a mark, that can then be used to build a course. * */ -public interface RegattaLogDefineMarkEvent extends DefineMarkEvent, RegattaLogEvent, Revokable { +public interface RegattaLogDefineMarkEvent extends RegattaLogEvent { Mark getMark(); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDefineMarkEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDefineMarkEventImpl.java index 3698880617b..88b6bda748d 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDefineMarkEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDefineMarkEventImpl.java @@ -3,23 +3,36 @@ package com.sap.sailing.domain.abstractlog.regatta.events.impl; import java.io.Serializable; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.impl.AbstractLogEventImpl; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDefineMarkEvent; -import com.sap.sailing.domain.abstractlog.shared.events.impl.AbstractDefineMarkEventImpl; import com.sap.sailing.domain.base.Mark; import com.sap.sse.common.TimePoint; -public class RegattaLogDefineMarkEventImpl extends AbstractDefineMarkEventImpl implements RegattaLogDefineMarkEvent { +public class RegattaLogDefineMarkEventImpl extends AbstractLogEventImpl implements RegattaLogDefineMarkEvent { private static final long serialVersionUID = -5114645637316367845L; + + protected final Mark mark; public RegattaLogDefineMarkEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, Mark mark) { - super(createdAt, author, logicalTimePoint, pId, mark); + super(createdAt, logicalTimePoint, author, pId); + this.mark = mark; } @Override public void accept(RegattaLogEventVisitor visitor) { visitor.visit(this); } + + @Override + public Mark getMark() { + return mark; + } + + @Override + public String getShortInfo() { + return "mark: "+mark.toString(); + } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/DefineMarkEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/DefineMarkEvent.java deleted file mode 100644 index e014178ee87..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/DefineMarkEvent.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.sap.sailing.domain.abstractlog.shared.events; - -import com.sap.sailing.domain.abstractlog.AbstractLogEvent; -import com.sap.sailing.domain.abstractlog.Revokable; -import com.sap.sailing.domain.base.Mark; - -public interface DefineMarkEvent extends AbstractLogEvent, Revokable { - Mark getMark(); -} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/impl/AbstractDefineMarkEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/impl/AbstractDefineMarkEventImpl.java deleted file mode 100644 index e03f7c5e960..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/events/impl/AbstractDefineMarkEventImpl.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.sap.sailing.domain.abstractlog.shared.events.impl; - -import java.io.Serializable; - -import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; -import com.sap.sailing.domain.abstractlog.impl.AbstractLogEventImpl; -import com.sap.sailing.domain.abstractlog.shared.events.DefineMarkEvent; -import com.sap.sailing.domain.base.Mark; -import com.sap.sse.common.TimePoint; - -public abstract class AbstractDefineMarkEventImpl extends AbstractLogEventImpl implements -DefineMarkEvent { - - private static final long serialVersionUID = 5865183507521850320L; - - protected final Mark mark; - - public AbstractDefineMarkEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, - Serializable pId, Mark mark) { - super(createdAt, logicalTimePoint, author, pId); - this.mark = mark; - } - - @Override - public Mark getMark() { - return mark; - } - - @Override - public String getShortInfo() { - return "mark: "+mark.toString(); - } -} From 619a18c9efec3c008b257980420cc97582451d03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Fri, 11 Dec 2015 08:49:58 +0100 Subject: [PATCH 060/165] Fixes DeviceMarkMappingFinder --- .../analyzing/impl/RegattaLogDeviceMarkMappingFinder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceMarkMappingFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceMarkMappingFinder.java index 910011038b8..c692f4d22ba 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceMarkMappingFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceMarkMappingFinder.java @@ -1,8 +1,8 @@ package com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; -import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceCompetitorMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMappingEvent; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMarkMappingEvent; import com.sap.sailing.domain.base.Mark; public class RegattaLogDeviceMarkMappingFinder extends RegattaLogDeviceMappingFinder { @@ -13,6 +13,6 @@ public class RegattaLogDeviceMarkMappingFinder extends RegattaLogDeviceMappingFi @Override protected boolean isValidMapping(RegattaLogDeviceMappingEvent mapping) { - return mapping instanceof RegattaLogDeviceCompetitorMappingEvent; + return mapping instanceof RegattaLogDeviceMarkMappingEvent; } } From 288107a38616f25f02374463a5e091e9d3bba55a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Fri, 11 Dec 2015 14:51:33 +0100 Subject: [PATCH 061/165] Fix one test case and break another ;-) --- .../test/AbstractGPSFixStoreTest.java | 6 +++-- .../impl/CreateAndTrackWithRaceLogTest.java | 2 +- .../test/impl/TrackedRaceLoadsFixesTest.java | 25 ++++++++++--------- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java index 7fec39314ed..8822a180daa 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java @@ -13,6 +13,7 @@ import com.sap.sailing.domain.abstractlog.race.impl.RaceLogImpl; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceCompetitorMappingEventImpl; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceMarkMappingEventImpl; +import com.sap.sailing.domain.abstractlog.regatta.impl.RegattaLogImpl; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.DomainFactory; import com.sap.sailing.domain.base.Mark; @@ -57,6 +58,7 @@ public class AbstractGPSFixStoreTest { public void setServiceAndRaceLog() { service = new RacingEventServiceImpl(null, null, serviceFinderFactory); raceLog = new RaceLogImpl("racelog"); + regattaLog = new RegattaLogImpl("regattalog"); store = new MongoGPSFixStoreImpl(service.getMongoObjectFactory(), service.getDomainObjectFactory(), serviceFinderFactory); } @@ -68,13 +70,13 @@ public class AbstractGPSFixStoreTest { mongoOF.getGPSFixMetadataCollection().drop(); } - protected void map(RaceLog raceLog, Competitor comp, DeviceIdentifier device, long from, long to) { + protected void map(RegattaLog regattaLog, Competitor comp, DeviceIdentifier device, long from, long to) { regattaLog.add(new RegattaLogDeviceCompetitorMappingEventImpl(MillisecondsTimePoint.now(), MillisecondsTimePoint.now(), author, 0, comp, device, new MillisecondsTimePoint(from), new MillisecondsTimePoint(to))); } protected void map(Competitor comp, DeviceIdentifier device, long from, long to) { - map(raceLog, comp, device, from, to); + map(regattaLog, comp, device, from, to); } protected void map(Mark mark, DeviceIdentifier device, long from, long to) { diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java index 403e239ee22..7525270de13 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java @@ -183,7 +183,7 @@ public class CreateAndTrackWithRaceLogTest { TrackedRace race = column.getTrackedRace(fleet); assertNotNull(race); - race.waitForLoadingFromGPSFixStoreToFinishRunning(raceLog); + race.waitForLoadingFromGPSFixStoreToFinishRunning(regattaLog); addFixes1(race, comp1, dev1); regattaLog.add(new RegattaLogDeviceCompetitorMappingEventImpl(t(), t(), author, 0, comp1, dev1, t(11), t(20))); diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java index 6aed04386ee..96f4e3cbd15 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java @@ -11,9 +11,9 @@ import java.util.Collections; import org.junit.Test; -import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver; -import com.sap.sailing.domain.abstractlog.race.impl.RaceLogImpl; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; +import com.sap.sailing.domain.abstractlog.regatta.impl.RegattaLogImpl; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Course; @@ -81,7 +81,7 @@ public class TrackedRaceLoadsFixesTest extends AbstractGPSFixStoreTest { trackedRace.attachRaceLog(raceLog); trackedRace.attachRegattaLog(regattaLog); - trackedRace.waitForLoadingFromGPSFixStoreToFinishRunning(raceLog); + trackedRace.waitForLoadingFromGPSFixStoreToFinishRunning(regattaLog); testNumberOfRawFixes(trackedRace.getTrack(comp), 1); testNumberOfRawFixes(trackedRace.getOrCreateTrack(mark), 1); @@ -129,9 +129,10 @@ public class TrackedRaceLoadsFixesTest extends AbstractGPSFixStoreTest { DynamicTrackedRaceImpl trackedRace = new DynamicTrackedRaceImpl(regatta, race, Collections. emptyList(), EmptyWindStore.INSTANCE, store, 0, 0, 0, /*useMarkPassingCalculator*/ false, OneDesignRankingMetric::new, mock(RaceLogResolver.class)); - + trackedRace.attachRaceLog(raceLog); - trackedRace.waitForLoadingFromGPSFixStoreToFinishRunning(raceLog); + trackedRace.attachRegattaLog(regattaLog); + trackedRace.waitForLoadingFromGPSFixStoreToFinishRunning(regattaLog); testNumberOfRawFixes(trackedRace.getTrack(comp), 10002); testNumberOfRawFixes(trackedRace.getTrack(comp2), 1); @@ -154,16 +155,16 @@ public class TrackedRaceLoadsFixesTest extends AbstractGPSFixStoreTest { } @Test - public void attachTwoRaceLogsAndSeeIfLoadingIsSerializedNicely() throws TransformationException, + public void attachTwoRegattaLogsAndSeeIfLoadingIsSerializedNicely() throws TransformationException, NoCorrespondingServiceRegisteredException, InterruptedException { Course course = new CourseImpl("course", Collections. emptyList()); RaceDefinition race = new RaceDefinitionImpl("race", course, boatClass, Arrays.asList(new Competitor[] { comp })); - RaceLog raceLog2 = new RaceLogImpl("raceLog 2"); + RegattaLog regattaLog2 = new RegattaLogImpl("raceLog 2"); final int numFixes = 10000; map(comp, device, 0, numFixes / 2); - map(raceLog2, comp, device, numFixes / 2 + 1, numFixes); + map(regattaLog2, comp, device, numFixes / 2 + 1, numFixes); for (int i = 0; i < numFixes; i++) { store.storeFix(device, createFix(i, 10, 20, 30, 40)); @@ -190,11 +191,11 @@ public class TrackedRaceLoadsFixesTest extends AbstractGPSFixStoreTest { } }); - trackedRace.attachRaceLog(raceLog); - trackedRace.attachRaceLog(raceLog2); + trackedRace.attachRegattaLog(regattaLog); + trackedRace.attachRegattaLog(regattaLog2); - trackedRace.waitForLoadingFromGPSFixStoreToFinishRunning(raceLog); - trackedRace.waitForLoadingFromGPSFixStoreToFinishRunning(raceLog2); + trackedRace.waitForLoadingFromGPSFixStoreToFinishRunning(regattaLog); + trackedRace.waitForLoadingFromGPSFixStoreToFinishRunning(regattaLog2); assertThat("switch at most once between the two race logs while loading", numberOfSwitchesBetweenLoadingRaceLogs, lessThanOrEqualTo(1)); From c39d8a9357e0f8c5e89f574d6ff1ea58784fb1ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Fri, 11 Dec 2015 14:59:44 +0100 Subject: [PATCH 062/165] Remove wait for RaceLog from TrackedRace --- .../sailing/domain/test/mock/MockedTrackedRace.java | 4 ---- .../mock/MockedTrackedRaceWithStartTimeAndRanks.java | 4 ---- .../com/sap/sailing/domain/tracking/TrackedRace.java | 11 +++-------- .../sailing/domain/tracking/impl/TrackedRaceImpl.java | 7 ------- .../sap/sailing/gwt/ui/test/MockedTrackedRace.java | 4 ---- .../sailing/server/masterdata/DummyTrackedRace.java | 4 ---- 6 files changed, 3 insertions(+), 31 deletions(-) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java index f2dd6734253..19a57f5125f 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java @@ -926,10 +926,6 @@ public class MockedTrackedRace implements DynamicTrackedRace { return null; } - @Override - public void waitForLoadingFromGPSFixStoreToFinishRunning(RaceLog forRaceLog) throws InterruptedException { - } - @Override public void addRaceAbortedListener(RaceAbortedListener listener) { } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java index 2267dc3d786..95715cebb2c 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java @@ -554,10 +554,6 @@ public class MockedTrackedRaceWithStartTimeAndRanks implements TrackedRace { return null; } - @Override - public void waitForLoadingFromGPSFixStoreToFinishRunning(RaceLog forRaceLog) throws InterruptedException { - } - @Override public void addRaceAbortedListener(RaceAbortedListener listener) { } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java index efe85b87bf7..672cda040e8 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java @@ -658,15 +658,10 @@ public interface TrackedRace extends Serializable, IsManagedByCache Date: Fri, 11 Dec 2015 16:09:25 +0100 Subject: [PATCH 063/165] Remove failing test, interleaving of multiple RaceLogs when analyzing in TrackedRace no longer necessary, as RegattaLog holds all necessary information and RaceLogs are no more longer analyzed --- .../test/AbstractGPSFixStoreTest.java | 6 ++- .../test/impl/TrackedRaceLoadsFixesTest.java | 49 ------------------- .../domain/tracking/impl/TrackedRaceImpl.java | 2 + 3 files changed, 6 insertions(+), 51 deletions(-) diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java index 8822a180daa..2c36ae15a3c 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java @@ -3,6 +3,8 @@ package com.sap.sailing.domain.racelogtracking.test; import static com.sap.sse.common.Util.size; import static junit.framework.Assert.assertEquals; +import java.util.UUID; + import org.junit.After; import org.junit.Before; @@ -71,7 +73,7 @@ public class AbstractGPSFixStoreTest { } protected void map(RegattaLog regattaLog, Competitor comp, DeviceIdentifier device, long from, long to) { - regattaLog.add(new RegattaLogDeviceCompetitorMappingEventImpl(MillisecondsTimePoint.now(), MillisecondsTimePoint.now(), author, 0, + regattaLog.add(new RegattaLogDeviceCompetitorMappingEventImpl(MillisecondsTimePoint.now(), MillisecondsTimePoint.now(), author, UUID.randomUUID(), comp, device, new MillisecondsTimePoint(from), new MillisecondsTimePoint(to))); } @@ -80,7 +82,7 @@ public class AbstractGPSFixStoreTest { } protected void map(Mark mark, DeviceIdentifier device, long from, long to) { - regattaLog.add(new RegattaLogDeviceMarkMappingEventImpl(MillisecondsTimePoint.now(), MillisecondsTimePoint.now(), author, 0, + regattaLog.add(new RegattaLogDeviceMarkMappingEventImpl(MillisecondsTimePoint.now(), MillisecondsTimePoint.now(), author, UUID.randomUUID(), mark, device, new MillisecondsTimePoint(from), new MillisecondsTimePoint(to))); } diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java index 96f4e3cbd15..44b1884a5d3 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java @@ -153,53 +153,4 @@ public class TrackedRaceLoadsFixesTest extends AbstractGPSFixStoreTest { assertEquals(2, store.getNumberOfFixes(device)); assertEquals(TimeRangeImpl.create(100, 200), store.getTimeRangeCoveredByFixes(device)); } - - @Test - public void attachTwoRegattaLogsAndSeeIfLoadingIsSerializedNicely() throws TransformationException, - NoCorrespondingServiceRegisteredException, InterruptedException { - Course course = new CourseImpl("course", Collections. emptyList()); - RaceDefinition race = new RaceDefinitionImpl("race", course, boatClass, - Arrays.asList(new Competitor[] { comp })); - RegattaLog regattaLog2 = new RegattaLogImpl("raceLog 2"); - - final int numFixes = 10000; - map(comp, device, 0, numFixes / 2); - map(regattaLog2, comp, device, numFixes / 2 + 1, numFixes); - - for (int i = 0; i < numFixes; i++) { - store.storeFix(device, createFix(i, 10, 20, 30, 40)); - } - - TrackedRegatta regatta = new DynamicTrackedRegattaImpl(new RegattaImpl(EmptyRaceLogStore.INSTANCE, - EmptyRegattaLogStore.INSTANCE, RegattaImpl.getDefaultName("regatta", boatClass.getName()), boatClass, /* startDate */ - null, /* endDate */null, null, null, "a", null)); - DynamicTrackedRaceImpl trackedRace = new DynamicTrackedRaceImpl(regatta, race, - Collections. emptyList(), EmptyWindStore.INSTANCE, store, 0, 0, 0, /*useMarkPassingCalculator*/ false, - OneDesignRankingMetric::new, mock(RaceLogResolver.class)); - - trackedRace.addListener(new AbstractRaceChangeListener() { - @Override - public void competitorPositionChanged(GPSFixMoving fix, Competitor competitor) { - numFixesReceived++; - int currentlyLoading = fix.getTimePoint().asMillis() <= numFixes / 2 ? 1 : 2; - if (previouslyLoading == null) { - previouslyLoading = currentlyLoading; - } else if (previouslyLoading != currentlyLoading) { - previouslyLoading = currentlyLoading; - numberOfSwitchesBetweenLoadingRaceLogs++; - } - } - }); - - trackedRace.attachRegattaLog(regattaLog); - trackedRace.attachRegattaLog(regattaLog2); - - trackedRace.waitForLoadingFromGPSFixStoreToFinishRunning(regattaLog); - trackedRace.waitForLoadingFromGPSFixStoreToFinishRunning(regattaLog2); - - assertThat("switch at most once between the two race logs while loading", - numberOfSwitchesBetweenLoadingRaceLogs, lessThanOrEqualTo(1)); - assertThat("number of fixes added to race equal to number of fixes in GPSFixStore", numFixesReceived, - equalTo(numFixes)); - } } 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 1ff030578d1..c2ffc4d1c91 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 @@ -3893,6 +3893,8 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl final Map>> markMappings = new HashMap<>(); final Set result = new HashSet<>(); + race.getCourse().getWaypoints().forEach(waypoint -> Util.addAll(waypoint.getMarks(), result)); + Set marksDefinedInRegattaLog = new HashSet(); for (RegattaLog log: attachedRegattaLogs.values()){ marksDefinedInRegattaLog.addAll(new RegattaLogDefinedMarkAnalyzer(log).analyze()); From cdbdad65393ba21f172cfe1d0bc9fb8fc8b8e251 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Fri, 11 Dec 2015 16:14:41 +0100 Subject: [PATCH 064/165] Remove unused variables and imports --- .../test/impl/TrackedRaceLoadsFixesTest.java | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java index 44b1884a5d3..fd62591f81b 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java @@ -1,9 +1,6 @@ package com.sap.sailing.domain.racelogtracking.test.impl; import static junit.framework.Assert.assertEquals; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.lessThanOrEqualTo; import static org.mockito.Mockito.mock; import java.util.Arrays; @@ -12,8 +9,6 @@ import java.util.Collections; import org.junit.Test; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver; -import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; -import com.sap.sailing.domain.abstractlog.regatta.impl.RegattaLogImpl; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Course; @@ -27,7 +22,6 @@ import com.sap.sailing.domain.base.impl.RaceDefinitionImpl; import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.base.impl.WaypointImpl; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; -import com.sap.sailing.domain.common.tracking.GPSFixMoving; import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore; import com.sap.sailing.domain.racelog.tracking.test.mock.SmartphoneImeiIdentifier; import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; @@ -35,7 +29,6 @@ import com.sap.sailing.domain.racelogtracking.test.AbstractGPSFixStoreTest; import com.sap.sailing.domain.ranking.OneDesignRankingMetric; import com.sap.sailing.domain.regattalog.impl.EmptyRegattaLogStore; import com.sap.sailing.domain.tracking.TrackedRegatta; -import com.sap.sailing.domain.tracking.impl.AbstractRaceChangeListener; import com.sap.sailing.domain.tracking.impl.DynamicTrackedRaceImpl; import com.sap.sailing.domain.tracking.impl.DynamicTrackedRegattaImpl; import com.sap.sailing.domain.tracking.impl.EmptyWindStore; @@ -46,10 +39,6 @@ import com.sap.sse.common.impl.TimeRangeImpl; public class TrackedRaceLoadsFixesTest extends AbstractGPSFixStoreTest { private final BoatClass boatClass = DomainFactory.INSTANCE.getOrCreateBoatClass("49er"); - private int numberOfSwitchesBetweenLoadingRaceLogs = 0; - private Integer previouslyLoading = null; - private int numFixesReceived = 0; - @Test public void doesRaceLoadOnlyBetweenStartAndEndOfTracking() throws TransformationException, NoCorrespondingServiceRegisteredException, InterruptedException { From a56e32fc9c154a6bbb628d2bbdd5f31a2c3c3a91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Fri, 11 Dec 2015 16:39:00 +0100 Subject: [PATCH 065/165] Fixes startTime Bug --- .../sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java index b3643471139..0925c09f7ba 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java @@ -756,6 +756,10 @@ DynamicTrackedRace, GPSTrackListener { @Override public void attachRaceLog(RaceLog raceLog) { logListener.addTo(raceLog); + synchronized (DynamicTrackedRaceImpl.this) { + attachedRaceLogs.put(raceLog.getId(), raceLog); + notifyAll(); + } } @Override From a4f51cb88383bbf22559027ff2b8f0f5b9a60b82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Fri, 11 Dec 2015 18:00:15 +0100 Subject: [PATCH 066/165] Add logic to servlet to access GPSFixStore --- .../jaxrs/api/LeaderboardsResource.java | 51 ++++++++++++------- 1 file changed, 33 insertions(+), 18 deletions(-) diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java index a8ac335e2eb..f3ddf72dfb8 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java @@ -33,6 +33,7 @@ import org.json.simple.JSONObject; import org.json.simple.JSONValue; import org.json.simple.parser.ParseException; +import com.sap.sailing.domain.abstractlog.AbstractLog; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; @@ -58,6 +59,7 @@ import com.sap.sailing.domain.common.dto.LeaderboardRowDTO; import com.sap.sailing.domain.common.dto.RaceColumnDTO; import com.sap.sailing.domain.common.racelog.RaceLogServletConstants; import com.sap.sailing.domain.common.racelog.tracking.DeviceMappingConstants; +import com.sap.sailing.domain.common.racelog.tracking.TransformationException; import com.sap.sailing.domain.common.tracking.GPSFix; import com.sap.sailing.domain.common.tracking.impl.GPSFixImpl; import com.sap.sailing.domain.leaderboard.Leaderboard; @@ -71,6 +73,7 @@ import com.sap.sailing.domain.regattalike.IsRegattaLike; import com.sap.sailing.domain.regattalike.LeaderboardThatHasRegattaLike; import com.sap.sailing.domain.tracking.MarkPassing; import com.sap.sailing.domain.tracking.TrackedRace; +import com.sap.sailing.domain.tracking.impl.DynamicGPSFixTrackImpl; import com.sap.sailing.domain.tracking.impl.GPSFixTrackImpl; import com.sap.sailing.server.RacingEventService; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; @@ -401,11 +404,12 @@ public class LeaderboardsResource extends AbstractSailingServerResource { return Response.status(Status.BAD_REQUEST).entity("No competitor found for id " + competitorId) .type(MediaType.TEXT_PLAIN).build(); } - + Set registered = (Set) hasRegattaLike.getCompetitorsRegisteredInRegattaLog(); if (!registered.contains(mappedTo)) { logger.warning("Competitor found but not registered on a race of " + leaderboardName); - return Response.status(Status.BAD_REQUEST).entity("Competitor found but not registered on a race of " + leaderboardName) + return Response.status(Status.BAD_REQUEST) + .entity("Competitor found but not registered on a race of " + leaderboardName) .type(MediaType.TEXT_PLAIN).build(); } DeviceIdentifier device = new SmartphoneUUIDIdentifierImpl(UUID.fromString(deviceUuid)); @@ -493,8 +497,8 @@ public class LeaderboardsResource extends AbstractSailingServerResource { .type(MediaType.TEXT_PLAIN).build(); } - RegattaLogCloseOpenEndedDeviceMappingEventImpl event = new RegattaLogCloseOpenEndedDeviceMappingEventImpl( - now, author, deviceMappingEventId, closingTimePoint); + RegattaLogCloseOpenEndedDeviceMappingEventImpl event = new RegattaLogCloseOpenEndedDeviceMappingEventImpl(now, + author, deviceMappingEventId, closingTimePoint); isRegattaLike.getRegattaLog().add(event); logger.fine("Successfully checked out competitor " + mappedTo.getName()); @@ -540,23 +544,23 @@ public class LeaderboardsResource extends AbstractSailingServerResource { .entity("Could not find a leaderboard with name '" + leaderboardName + "'.") .type(MediaType.TEXT_PLAIN).build(); } - - if (! (leaderboard instanceof HasRegattaLike)) { + + if (!(leaderboard instanceof HasRegattaLike)) { return Response.status(Status.NOT_FOUND) - .entity("Leaderboard with name '"+ leaderboardName+ "'does not contain a RegattaLog'.") + .entity("Leaderboard with name '" + leaderboardName + "'does not contain a RegattaLog'.") .type(MediaType.TEXT_PLAIN).build(); } - + final Set marks = new HashSet(); if (raceColumnName == null) { if (fleetName != null) { return Response - .status(Status.BAD_REQUEST) - .entity("Either specify neither raceColumnName nor fleetName, only raceColumnName, or raceColumnName and fleetName but not only fleetName") - .type(MediaType.TEXT_PLAIN).build(); + .status(Status.BAD_REQUEST) + .entity("Either specify neither raceColumnName nor fleetName, only raceColumnName, or raceColumnName and fleetName but not only fleetName") + .type(MediaType.TEXT_PLAIN).build(); } else { for (RaceColumn raceColumn : leaderboard.getRaceColumns()) { - Util.addAll(raceColumn.getAllMarks(), marks); + Util.addAll(raceColumn.getAllMarks(), marks); } } } else { @@ -588,7 +592,7 @@ public class LeaderboardsResource extends AbstractSailingServerResource { final TimePoint now = MillisecondsTimePoint.now(); Position lastKnownPosition = getService().getMarkPosition(mark, (LeaderboardThatHasRegattaLike) leaderboard, now, - /* raceLog==null means use all race logs */ null); + /* raceLog==null means use all race logs */null); array.add(markWithPositionSerializer.serialize(new Pair<>(mark, lastKnownPosition))); } JSONObject result = new JSONObject(); @@ -597,7 +601,8 @@ public class LeaderboardsResource extends AbstractSailingServerResource { } private final MarkJsonSerializer markSerializer = new MarkJsonSerializer(); - private final MarkJsonSerializerWithPosition markWithPositionSerializer = new MarkJsonSerializerWithPosition(markSerializer, new FlatGPSFixJsonSerializer()); + private final MarkJsonSerializerWithPosition markWithPositionSerializer = new MarkJsonSerializerWithPosition( + markSerializer, new FlatGPSFixJsonSerializer()); private final FlatGPSFixJsonDeserializer fixDeserializer = new FlatGPSFixJsonDeserializer(); private final FlatGPSFixJsonSerializer fixSerializer = new FlatGPSFixJsonSerializer(); @@ -645,9 +650,9 @@ public class LeaderboardsResource extends AbstractSailingServerResource { .type(MediaType.TEXT_PLAIN).build(); } TimePoint now = MillisecondsTimePoint.now(); - Position lastKnownPosition = getService().getMarkPosition(mark, - (LeaderboardThatHasRegattaLike) leaderboard, now, - /* raceLog==null means use all race logs */ null); + Position lastKnownPosition = getService().getMarkPosition(mark, (LeaderboardThatHasRegattaLike) leaderboard, + now, + /* raceLog==null means use all race logs */null); GPSFix fix = null; try { Object requestBody = JSONValue.parseWithException(json); @@ -662,17 +667,27 @@ public class LeaderboardsResource extends AbstractSailingServerResource { RaceLogTrackingAdapter adapter = getRaceLogTrackingAdapter(); RacingEventService service = getService(); try { + if (lastKnownPosition == null) { + // Look into GPSFixStore + DynamicGPSFixTrackImpl loadedTrack = new DynamicGPSFixTrackImpl(mark, 0); + getService().getGPSFixStore().loadMarkTrack(loadedTrack, regattaLog, mark); + lastKnownPosition = loadedTrack.getEstimatedPosition(now, /* extrapolate */ false); + } + if (lastKnownPosition != null) { // ping again to avoid interpolation, avoid filtering by paying attention to maxSpeedForSmoothing final Distance distance = lastKnownPosition.getDistance(fix.getPosition()); final Duration minDuration = GPSFixTrackImpl.getDefaultMaxSpeedForSmoothing().getDuration(distance); - final GPSFix repeatedFixAvoidingCreepingMark = new GPSFixImpl(lastKnownPosition, fix.getTimePoint().minus(minDuration)); + final GPSFix repeatedFixAvoidingCreepingMark = new GPSFixImpl(lastKnownPosition, fix.getTimePoint() + .minus(minDuration)); adapter.pingMark(regattaLog, mark, repeatedFixAvoidingCreepingMark, service); } adapter.pingMark(regattaLog, mark, fix, service); logger.log(Level.INFO, "Pinged mark " + mark.getName()); } catch (NoCorrespondingServiceRegisteredException e) { logger.log(Level.WARNING, "Could not ping mark " + mark.getName()); + } catch (TransformationException e) { + logger.log(Level.WARNING, "Could not ping mark " + mark.getName()); } if (lastKnownPosition != null) { From 7fe3a15114bb1d76c2472459a7f66199f77d10ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Sat, 12 Dec 2015 11:11:18 +0100 Subject: [PATCH 067/165] Revert ping mark test to original, reping of mark is now tested --- .../gateway/jaxrs/api/LeaderboardsResourcePingMarkTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourcePingMarkTest.java b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourcePingMarkTest.java index 2f7220464db..805ec188b63 100644 --- a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourcePingMarkTest.java +++ b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourcePingMarkTest.java @@ -89,7 +89,7 @@ public class LeaderboardsResourcePingMarkTest extends AbstractJaxRsApiTest { assertThat("response is ok", response.getStatus(), equalTo(Response.Status.OK.getStatusCode())); Map>> mappings = new RegattaLogDeviceMarkMappingFinder(log).analyze(); List> mappingsForMark = mappings.get(mark); - assertThat("Assert an additional mapping was created for the second ping", mappingsForMark.size(), equalTo(2)); + assertThat("Assert an additional mapping was created for the second ping", mappingsForMark.size(), equalTo(3)); assertOneFixPerMapping(mappingsForMark); } } From 5650c97a51f77819d49f5bc02f5af9af0c306bbf Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 13 Jan 2016 09:47:09 +0100 Subject: [PATCH 068/165] consolidated imports to remove warnings Change-Id: Ibba9a42165dc0baaf6fb76986ad0c0de6c4a6587 --- .../sailing/server/gateway/jaxrs/api/LeaderboardsResource.java | 1 - 1 file changed, 1 deletion(-) diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java index 79bcac5afd3..6fce0ae346f 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java @@ -34,7 +34,6 @@ import org.json.simple.JSONObject; import org.json.simple.JSONValue; import org.json.simple.parser.ParseException; -import com.sap.sailing.domain.abstractlog.AbstractLog; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; From 382abdc75354cee43da3a37ad5627b814509c639 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 13 Jan 2016 12:08:43 +0100 Subject: [PATCH 069/165] comment changes only Change-Id: Ia66089522900b0e3d3374071ef102a940b33d2fc --- .../src/com/sap/sailing/domain/base/RaceColumn.java | 9 +++++---- .../sap/sailing/domain/base/impl/AbstractRaceColumn.java | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java index 7b8339dee10..6d5506049ac 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java @@ -48,8 +48,9 @@ public interface RaceColumn extends Named { RaceLog getRaceLog(Fleet fleet); /** - * Gets the regatta log associated with race column's race and the passed fleet. Note that the result may be null - * particularly for columns in a {@link MetaLeaderboard}. + * Gets the regatta log associated with the regatta-like structure (either a regatta if this is a + * {@link RaceColumnInSeries} or a flexible leaderboard). Note that the result may be null particularly + * for columns in a {@link MetaLeaderboard}. * * @return the regatta log or null in case this column belongs to a {@link MetaLeaderboard} */ @@ -241,8 +242,8 @@ public interface RaceColumn extends Named { /** * Provides the combined set of competitors from all {@link #getTrackedRace(Fleet) tracked races attached to this * column} or, in case a fleet does not have a tracked race attached, the competitors registered through the - * respective {@link RaceLog} {@link #getRaceLog(Fleet)} or {@link RegattaLog} {@link #getRegattaLog()} attached to - * this column for that fleet. + * respective {@link RaceLog} {@link #getRaceLog(Fleet)} attached to this column for that fleet or registered + * through the {@link #getRegattaLog() regatta log}. */ Iterable getAllCompetitors(); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java index b3aa6fc0457..08bbcf5e5e1 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java @@ -349,7 +349,7 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem Util.addAll(waypoint.getMarks(), result); } } else { - // if no tracked race is found, use marks regatta log + // if no tracked race is found, use marks from regatta log RegattaLog regattaLog = getRegattaLog(); Collection viaRegattaLog = new RegattaLogDefinedMarkAnalyzer(regattaLog).analyze(); result.addAll(viaRegattaLog); From 4c400fedb854a08bb042631c433a33982a2e3c3d Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 13 Jan 2016 14:20:31 +0100 Subject: [PATCH 070/165] in AbstractRaceColumn.getAllMarks add marks from regatta log at most once Change-Id: I69ada9e9bb476cdceaee2c8b084a67ef4290fc73 --- .../src/com/sap/sailing/domain/base/RaceColumn.java | 4 ++-- .../sap/sailing/domain/base/impl/AbstractRaceColumn.java | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java index 6d5506049ac..6b153c6ea79 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java @@ -255,13 +255,13 @@ public interface RaceColumn extends Named { /** * Provides the combined set of marks from all {@link #getTrackedRace(Fleet) tracked races attached to this * column} or, in case a fleet does not have a tracked race attached, the competitors registered through the - * respective {@link RaceLog} {@link #getRaceLog(Fleet)} or {@link RegattaLog} {@link #getRegattaLog()} attached to + * respective {@link #getRaceLog(Fleet) race log} or {@link #getRegattaLog()} attached to * this column for that fleet. */ Iterable getAllMarks(); /** - * Same as {@link #getAllCompetitors()}, but restricted to the single race identified by the fleet parameter. + * Same as {@link #getAllMarks()}, but restricted to the single race identified by the fleet parameter. */ Iterable getAllMarks(Fleet fleet); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java index 08bbcf5e5e1..13949dd71fd 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java @@ -341,18 +341,22 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem @Override public Iterable getAllMarks() { - Set result = new HashSet<>(); + final Set result = new HashSet<>(); + // if the marks from the regatta log are to be used because a slot has no TrackedRace attached, + // those regatta log marks only need to be added to the result once + boolean regattaLogMarksAlreadyAdded = false; for (Fleet fleet : getFleets()) { TrackedRace trackedRace = getTrackedRace(fleet); if (trackedRace != null) { for (Waypoint waypoint : trackedRace.getRace().getCourse().getWaypoints()) { Util.addAll(waypoint.getMarks(), result); } - } else { + } else if (!regattaLogMarksAlreadyAdded) { // if no tracked race is found, use marks from regatta log RegattaLog regattaLog = getRegattaLog(); Collection viaRegattaLog = new RegattaLogDefinedMarkAnalyzer(regattaLog).analyze(); result.addAll(viaRegattaLog); + regattaLogMarksAlreadyAdded = true; } } return result; From 11da982397c72909400e90f80a4bec5bde789bab Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 13 Jan 2016 14:43:41 +0100 Subject: [PATCH 071/165] renamed getAllMarks(Fleet) to getMarks(Fleet) because it doesn't deliver *all* marks defined on the column's regatta but only those used in races Change-Id: Ieb2f9697f0a5349797b8c3419a00ea73ec91200e --- .../impl/LastPublishedCourseDesignFinder.java | 2 -- .../src/com/sap/sailing/domain/base/RaceColumn.java | 2 +- .../sailing/domain/base/impl/AbstractRaceColumn.java | 11 +++++------ .../leaderboard/meta/MetaLeaderboardColumn.java | 2 +- .../gateway/impl/rc/MarksJsonExportServlet.java | 2 +- .../gateway/jaxrs/api/LeaderboardsResource.java | 2 +- 6 files changed, 9 insertions(+), 12 deletions(-) diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/LastPublishedCourseDesignFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/LastPublishedCourseDesignFinder.java index bbb8ddcc0ce..d5101afd45d 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/LastPublishedCourseDesignFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/LastPublishedCourseDesignFinder.java @@ -19,8 +19,6 @@ public class LastPublishedCourseDesignFinder extends RaceLogAnalyzer return courseDesignEvent.getCourseDesign(); } } - return null; } - } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java index 6b153c6ea79..3302b7288de 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java @@ -263,7 +263,7 @@ public interface RaceColumn extends Named { /** * Same as {@link #getAllMarks()}, but restricted to the single race identified by the fleet parameter. */ - Iterable getAllMarks(Fleet fleet); + Iterable getMarks(Fleet fleet); /** * Returns the competitor set registered in the race column's race log associated to the passed fleet. diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java index 13949dd71fd..6b6619d75db 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java @@ -363,9 +363,9 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem } @Override - public Iterable getAllMarks(Fleet fleet) { - Set result = new HashSet<>(); - TrackedRace trackedRace = getTrackedRace(fleet); + public Iterable getMarks(Fleet fleet) { + final Set result = new HashSet<>(); + final TrackedRace trackedRace = getTrackedRace(fleet); if (trackedRace != null) { for (Waypoint waypoint : trackedRace.getRace().getCourse().getWaypoints()) { Util.addAll(waypoint.getMarks(), result); @@ -373,10 +373,9 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem } else { // if no tracked race is found, use marks from race course if present in racelog // if not the marks defined in the regatta log - LastPublishedCourseDesignFinder courseDesginFinder = new LastPublishedCourseDesignFinder(getRaceLog(fleet)); - CourseBase courseBase = courseDesginFinder.analyze(); - if (courseBase != null){ + final CourseBase courseBase = courseDesginFinder.analyze(); + if (courseBase != null) { courseBase.getWaypoints().forEach((waypoint) -> Util.addAll(waypoint.getMarks(), result)); } else { Util.addAll(new RegattaLogDefinedMarkAnalyzer(getRegattaLog()).analyze(), result); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java index ed3d4009931..47574d23f18 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java @@ -242,7 +242,7 @@ public class MetaLeaderboardColumn extends SimpleAbstractRaceColumn implements R } @Override - public Iterable getAllMarks(Fleet fleet) { + public Iterable getMarks(Fleet fleet) { TrackedRace trackedRace = getTrackedRace(fleet); return trackedRace.getMarks(); } diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarksJsonExportServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarksJsonExportServlet.java index e877a7dbe42..efcb71cc9f5 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarksJsonExportServlet.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarksJsonExportServlet.java @@ -58,7 +58,7 @@ public class MarksJsonExportServlet extends AbstractJsonHttpServlet { return; } JSONArray result = new JSONArray(); - final Iterable marks = raceColumn.getAllMarks(fleet); + final Iterable marks = raceColumn.getMarks(fleet); MarkJsonSerializer serializer = new MarkJsonSerializer(); for (Mark mark : marks) { if (toUUID(mark.getId().toString()) != null) { diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java index 6fce0ae346f..23bf5fd9f2b 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java @@ -578,7 +578,7 @@ public class LeaderboardsResource extends AbstractSailingServerResource { StringEscapeUtils.escapeHtml(leaderboardName) + "'.").type(MediaType.TEXT_PLAIN).build(); } else { - Util.addAll(raceColumn.getAllMarks(fleet), marks); + Util.addAll(raceColumn.getMarks(fleet), marks); } } else { // Return all marks for a certain race column From 4a6bee544fea3223b3656a3ce7b7da9bcb58137c Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 13 Jan 2016 14:46:17 +0100 Subject: [PATCH 072/165] enhanced Javadoc Change-Id: I4543650ffe938d549434774b2d49fb229eb99166 --- .../src/com/sap/sailing/domain/base/RaceColumn.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java index 3302b7288de..1d448d3e169 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java @@ -266,10 +266,13 @@ public interface RaceColumn extends Named { Iterable getMarks(Fleet fleet); /** - * Returns the competitor set registered in the race column's race log associated to the passed fleet. - * If competitor registration in RaceLog is disabled or in case of a MetaLeaderboardColumn an empty set is returned. - * @param fleet - * @return competitors in RaceLog if registration enabled or empty set in case this column belongs to a {@link MetaLeaderboard} + * Returns the competitor set registered in the race column's race log associated to the passed fleet. If competitor + * registration in RaceLog is {@link #disableCompetitorRegistrationOnRaceLog(Fleet) disabled} or in case of a + * MetaLeaderboardColumn an empty set is returned. + * + * @return competitors in RaceLog if registration {@link #enableCompetitorRegistrationOnRaceLog(Fleet) enabled} or + * empty set in case registration is {@link #disableCompetitorRegistrationOnRaceLog(Fleet) disabled} or this + * column belongs to a {@link MetaLeaderboard} */ Iterable getCompetitorsRegisteredInRacelog(Fleet fleet); From 7ba94f7895bc2a15bc057c387ab5c7cc52ad6f52 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 13 Jan 2016 14:57:50 +0100 Subject: [PATCH 073/165] some clean-up and improvements to Javadocs Change-Id: Idedf1391bebb9ce40692e970180074755e346dad --- .../impl/AllEventsOfTypeFinder.java | 2 +- ...RaceLogUseCompetitorsFromRaceLogEvent.java | 13 ++++++---- .../RaceLogUsesOwnCompetitorsAnalyzer.java | 17 ++++++------- .../impl/RegisteredCompetitorsAnalyzer.java | 25 +++++++++++-------- .../sap/sailing/domain/base/RaceColumn.java | 18 +++++++------ .../domain/base/impl/AbstractRaceColumn.java | 7 ++---- 6 files changed, 44 insertions(+), 38 deletions(-) diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AllEventsOfTypeFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AllEventsOfTypeFinder.java index 02f11683e67..0608dbba198 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AllEventsOfTypeFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AllEventsOfTypeFinder.java @@ -9,8 +9,8 @@ import com.sap.sailing.domain.abstractlog.BaseLogAnalyzer; /** * Finds all events in the log which is an {@code instanceof} {@link #ofType}. + * * @author Fredrik Teschke - * */ public class AllEventsOfTypeFinder, EventT extends AbstractLogEvent, VisitorT> extends BaseLogAnalyzer> { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogUseCompetitorsFromRaceLogEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogUseCompetitorsFromRaceLogEvent.java index dd45e37ab76..fa91d9bf970 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogUseCompetitorsFromRaceLogEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/RaceLogUseCompetitorsFromRaceLogEvent.java @@ -2,14 +2,17 @@ package com.sap.sailing.domain.abstractlog.race.tracking; import com.sap.sailing.domain.abstractlog.Revokable; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogUsesOwnCompetitorsAnalyzer; /** - * This is a marker event, which marks a RaceLog for using it's own competitor registrations. - * When present competitors are not registered on the RegattaLog corresponding to the RaceLog, but on the RaceLog itself. - * This is for example used for split fleets. + * This is a marker event, which marks a {@link RaceLog} for using it's own competitor registrations. When present, + * competitors are not registered on the RegattaLog corresponding to the RaceLog, but on the RaceLog itself. This is for + * example used for split fleets. * - * See bug2851 - * @author D056848 + * See bug2851. + * + * @see RaceLogUsesOwnCompetitorsAnalyzer + * @author Jan Bross (D056848) * */ public interface RaceLogUseCompetitorsFromRaceLogEvent extends RaceLogEvent, Revokable { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceLogUsesOwnCompetitorsAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceLogUsesOwnCompetitorsAnalyzer.java index 557f0e72c22..ce8327b5cf4 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceLogUsesOwnCompetitorsAnalyzer.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RaceLogUsesOwnCompetitorsAnalyzer.java @@ -8,8 +8,14 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogAnalyzer; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; +/** + * Determines whether the race log claims to authoritatively define the competitors for the race to which it belongs. + * This depends on the presence of an unrevoked {@link RaceLogUseCompetitorsFromRaceLogEvent} event in the race log. + * + * @author Jan Bross + * + */ public class RaceLogUsesOwnCompetitorsAnalyzer extends RaceLogAnalyzer{ - public RaceLogUsesOwnCompetitorsAnalyzer(RaceLog raceLog) { super(raceLog); } @@ -17,14 +23,7 @@ public class RaceLogUsesOwnCompetitorsAnalyzer extends RaceLogAnalyzer{ @Override protected Boolean performAnalysis() { RaceLog raceLog = getLog(); - List event = new AllEventsOfTypeFinder<>(raceLog, /*only unrevoked*/ true, RaceLogUseCompetitorsFromRaceLogEvent.class).analyze(); - - if (event.size() >= 1){ - return true; - } else { - return false; - } + return event.size() >= 1; } - } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RegisteredCompetitorsAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RegisteredCompetitorsAnalyzer.java index f710c2736b5..3efe4f5f786 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RegisteredCompetitorsAnalyzer.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/analyzing/impl/RegisteredCompetitorsAnalyzer.java @@ -9,16 +9,17 @@ import com.sap.sailing.domain.abstractlog.shared.analyzing.CompetitorsInLogAnaly import com.sap.sailing.domain.base.Competitor; /** - * Used to find competitors of a race. Checks whether the competitors for the given race are registered on the RaceLog - * via {@link RaceLogUsesOwnCompetitorsAnalyzer} or on the RegattaLog and fetches the competitors appropriately. + * Used to find competitors of a race based on {@link RaceLog} and {@link RegattaLog} contents. Checks whether the + * competitors for the given race are registered on the RaceLog via {@link RaceLogUsesOwnCompetitorsAnalyzer} or on the + * RegattaLog and fetches the competitors appropriately. * - * Should not be used. Instead get the competitor set from the RaceColumn, which automatically checks wether a - * tracked race is present, which has precedence over the Race/RegattaLog + * Should not be used by clients directly. Instead, get the competitor set from the {@code RaceColumn}, using either one + * of {@code getAllCompetitors()} and {@code getAllCompetitors(Fleet)}. Those methods automatically check whether a + * tracked race is present, which takes precedence over the Race/RegattaLog. * - * @author D056848 + * @author Jan Bross (D056848) * */ - public class RegisteredCompetitorsAnalyzer extends RaceLogAnalyzer> { private RegattaLog regattaLog; @@ -29,12 +30,14 @@ public class RegisteredCompetitorsAnalyzer extends RaceLogAnalyzer performAnalysis() { - if (new RaceLogUsesOwnCompetitorsAnalyzer(getLog()).analyze()){ - //get Events from RaceLog - return new CompetitorsInLogAnalyzer<>(getLog()).analyze(); + final Set result; + if (new RaceLogUsesOwnCompetitorsAnalyzer(getLog()).analyze()) { + // get Events from RaceLog + result = new CompetitorsInLogAnalyzer<>(getLog()).analyze(); } else { - //get Events from RegattaLog - return new CompetitorsInLogAnalyzer<>(regattaLog).analyze(); + // get Events from RegattaLog + result = new CompetitorsInLogAnalyzer<>(regattaLog).analyze(); } + return result; } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java index 1d448d3e169..903b4518b6f 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java @@ -242,8 +242,9 @@ public interface RaceColumn extends Named { /** * Provides the combined set of competitors from all {@link #getTrackedRace(Fleet) tracked races attached to this * column} or, in case a fleet does not have a tracked race attached, the competitors registered through the - * respective {@link RaceLog} {@link #getRaceLog(Fleet)} attached to this column for that fleet or registered - * through the {@link #getRegattaLog() regatta log}. + * respective {@link RaceLog} {@link #getRaceLog(Fleet)} attached to this column for that fleet (if this is + * {@link #enableCompetitorRegistrationOnRaceLog(Fleet) enabled) or registered through the {@link #getRegattaLog() + * regatta log}. */ Iterable getAllCompetitors(); @@ -278,22 +279,25 @@ public interface RaceColumn extends Named { /** * Checks whether competitor registration on RaceLog is enabled. - * @param fleet - * @return boolean if competitor registration on the RaceLog is enabled, false in case this column belongs to a {@link MetaLeaderboard} + * + * @return boolean if competitor registration on the RaceLog is enabled, false in case this column belongs to a + * {@link MetaLeaderboard} + * + * @see #enableCompetitorRegistrationOnRaceLog(Fleet) + * @see #disableCompetitorRegistrationOnRaceLog(Fleet) */ boolean isCompetitorRegistrationInRacelogEnabled(Fleet fleet); /** - * Activates competitor registration on the race column's race log associated to the passed fleet. + * Activates competitor registration on the race column's race log associated to the passed fleet. As a result, + * * Performs nothing in case this column belongs to a {@link MetaLeaderboard}. - * @param fleetByName */ void enableCompetitorRegistrationOnRaceLog(Fleet fleet); /** * Disables competitor registration on the race column's race log associated to the passed fleet. * Performs nothing in case this column belongs to a {@link MetaLeaderboard}. - * @param fleetByName */ void disableCompetitorRegistrationOnRaceLog(Fleet fleet); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java index 6b6619d75db..6e79c77df32 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java @@ -258,8 +258,7 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem // race exists, its competitors set takes precedence over what's in the race log. Usually, // the tracked race will have the same competitors as those in the race log, or more because // those from the regatta log are added to the tracked race as well. - RegattaLog regattaLog = getRegattaLog(); - Set viaRaceLog = new RegisteredCompetitorsAnalyzer(getRaceLog(fleet), regattaLog).analyze(); + Set viaRaceLog = new RegisteredCompetitorsAnalyzer(getRaceLog(fleet), getRegattaLog()).analyze(); result.addAll(viaRaceLog); } } @@ -278,9 +277,7 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem // race exists, its competitors set takes precedence over what's in the race log. Usually, // the tracked race will have the same competitors as those in the race log, or more because // those from the regatta log are added to the tracked race as well. - RegattaLog regattaLog = getRegattaLog(); - //FIXME: soon to be removed, as RaceLogDefineMarkEvent is deprecated - Set viaRaceLog = new RegisteredCompetitorsAnalyzer(getRaceLog(fleet), regattaLog).analyze(); + Set viaRaceLog = new RegisteredCompetitorsAnalyzer(getRaceLog(fleet), getRegattaLog()).analyze(); result = viaRaceLog; } return result; From 01335c4aa73864993b0a5ad4125121bd2f2fd6d1 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 13 Jan 2016 14:59:36 +0100 Subject: [PATCH 074/165] removed redundancy between AbstractRaceColumn.getAllCompetitors() and getAllCompetitors(Fleet) by using the latter from the former Change-Id: I8981556c60e3edd786b68a1e214b997f709fc19f --- .../domain/base/impl/AbstractRaceColumn.java | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java index 6e79c77df32..bc5a2c2d3c0 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java @@ -249,18 +249,7 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem public Iterable getAllCompetitors() { Set result = new HashSet<>(); for (Fleet fleet : getFleets()) { - TrackedRace trackedRace = getTrackedRace(fleet); - if (trackedRace != null) { - Util.addAll(trackedRace.getRace().getCompetitors(), result); - } else { - // if no tracked race is found, use competitors from race/regatta log depending on whether - // the mapping event is present or not; this assumes that if a tracked - // race exists, its competitors set takes precedence over what's in the race log. Usually, - // the tracked race will have the same competitors as those in the race log, or more because - // those from the regatta log are added to the tracked race as well. - Set viaRaceLog = new RegisteredCompetitorsAnalyzer(getRaceLog(fleet), getRegattaLog()).analyze(); - result.addAll(viaRaceLog); - } + Util.addAll(getAllCompetitors(fleet), result); } return result; } From 5182ff212aa182f42c3a655f3b298934abad1632 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 13 Jan 2016 15:01:30 +0100 Subject: [PATCH 075/165] adjusted Javadoc for RaceColumn.getAllMarks() Change-Id: I820343904d3d9169b05134e5269a823690330756 --- .../src/com/sap/sailing/domain/base/RaceColumn.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java index 903b4518b6f..91acaa6e9ce 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java @@ -255,9 +255,9 @@ public interface RaceColumn extends Named { /** * Provides the combined set of marks from all {@link #getTrackedRace(Fleet) tracked races attached to this - * column} or, in case a fleet does not have a tracked race attached, the competitors registered through the - * respective {@link #getRaceLog(Fleet) race log} or {@link #getRegattaLog()} attached to - * this column for that fleet. + * column} or, in case a fleet does not have a tracked race attached, the marks registered through the + * {@link #getRegattaLog() regatta log} for the regatta-like object to which this column belongs (flexible + * leaderboard or regatta). */ Iterable getAllMarks(); From 62a1cb8b304c12906350f61f0e247f6b14be5d7c Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 13 Jan 2016 15:41:09 +0100 Subject: [PATCH 076/165] escalate the NotRevokableException on disableCompetitorRegistrationOnRaceLog Change-Id: I068d78761dbc4dd8a0a37374e5f169ec79cee6b1 --- .../sap/sailing/domain/base/RaceColumn.java | 31 ++++++++++++++----- .../domain/base/impl/AbstractRaceColumn.java | 1 + .../sailing/domain/tracking/TrackedRace.java | 5 ++- .../domain/tracking/impl/TrackedRaceImpl.java | 6 ++-- 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java index 91acaa6e9ce..5312521f8ba 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java @@ -3,6 +3,7 @@ package com.sap.sailing.domain.base; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.common.RaceIdentifier; +import com.sap.sailing.domain.common.abstractlog.NotRevokableException; import com.sap.sailing.domain.common.racelog.tracking.CompetitorRegistrationOnRaceLogDisabledException; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.MetaLeaderboard; @@ -299,25 +300,41 @@ public interface RaceColumn extends Named { * Disables competitor registration on the race column's race log associated to the passed fleet. * Performs nothing in case this column belongs to a {@link MetaLeaderboard}. */ - void disableCompetitorRegistrationOnRaceLog(Fleet fleet); + void disableCompetitorRegistrationOnRaceLog(Fleet fleet) throws NotRevokableException; /** * Registers a competitor on the the race column's race log associated to the passed fleet. - * @param competitor - * @param fleet + * * @throws CompetitorRegistrationOnRaceLogDisabledException - * thrown if competitor registration is disabled on racelog as well as if RaceColumn belongs to a {@link MetaLeaderboard} + * thrown if competitor registration is disabled on racelog as well as if RaceColumn belongs to a + * {@link MetaLeaderboard} */ void registerCompetitor(Competitor competitor, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException; + + /** + * Registers competitors on the the race column's race log associated to the passed fleet. + * + * @throws CompetitorRegistrationOnRaceLogDisabledException + * thrown if competitor registration is disabled on racelog as well as if RaceColumn belongs to a + * {@link MetaLeaderboard} + */ void registerCompetitors(Iterable competitor, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException; /** * Deregisters a competitor on the the race column's race log associated to the passed fleet. - * @param competitor - * @param fleet + * * @throws CompetitorRegistrationOnRaceLogDisabledException - * thrown if competitor registration is disabled on racelog as well as if RaceColumn belongs to a {@link MetaLeaderboard} + * thrown if competitor registration is disabled on racelog as well as if RaceColumn belongs to a + * {@link MetaLeaderboard} */ void deRegisterCompetitor(Competitor competitors, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException; + + /** + * Deregisters competitors on the the race column's race log associated to the passed fleet. + * + * @throws CompetitorRegistrationOnRaceLogDisabledException + * thrown if competitor registration is disabled on racelog as well as if RaceColumn belongs to a + * {@link MetaLeaderboard} + */ void deRegisterCompetitors(Iterable currentlyRegisteredCompetitors, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException; } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java index bc5a2c2d3c0..b22a3ae8c9d 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java @@ -362,6 +362,7 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem LastPublishedCourseDesignFinder courseDesginFinder = new LastPublishedCourseDesignFinder(getRaceLog(fleet)); final CourseBase courseBase = courseDesginFinder.analyze(); if (courseBase != null) { + // TODO why do we collect the marks from the course definition here but not in getAllMarks()? courseBase.getWaypoints().forEach((waypoint) -> Util.addAll(waypoint.getMarks(), result)); } else { Util.addAll(new RegattaLogDefinedMarkAnalyzer(getRegattaLog()).analyze(), result); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java index 672cda040e8..31460587ad4 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java @@ -10,6 +10,7 @@ import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver; import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedure; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; +import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDefineMarkEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMappingEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Course; @@ -867,7 +868,9 @@ public interface TrackedRace extends Serializable, IsManagedByCache getMarksFromRaceAndLogs() { return getMarks(); 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 c2ffc4d1c91..b5a6bd5ad1f 100644 --- 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 @@ -3892,11 +3892,9 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl public Iterable getMarksFromRaceAndLogs() { final Map>> markMappings = new HashMap<>(); final Set result = new HashSet<>(); - race.getCourse().getWaypoints().forEach(waypoint -> Util.addAll(waypoint.getMarks(), result)); - - Set marksDefinedInRegattaLog = new HashSet(); - for (RegattaLog log: attachedRegattaLogs.values()){ + final Set marksDefinedInRegattaLog = new HashSet(); + for (RegattaLog log : attachedRegattaLogs.values()) { marksDefinedInRegattaLog.addAll(new RegattaLogDefinedMarkAnalyzer(log).analyze()); markMappings.putAll(new RegattaLogDeviceMarkMappingFinder(log).analyze()); } From 73cf0c94725448934c2d836fcbc4dce74fb3909d Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 13 Jan 2016 15:42:41 +0100 Subject: [PATCH 077/165] added NotRevokableException to RaceColumn.disableCompetitorRegistrationOnRaceLog Change-Id: Ifad088dcda292316bb9993092c44b5221c8cfd1d --- .../sap/sailing/domain/base/impl/AbstractRaceColumn.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java index b22a3ae8c9d..cb45749cc79 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java @@ -380,7 +380,7 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem } @Override - public void disableCompetitorRegistrationOnRaceLog(Fleet fleet) { + public void disableCompetitorRegistrationOnRaceLog(Fleet fleet) throws NotRevokableException { RaceLog raceLog = getRaceLog(fleet); List events = new AllEventsOfTypeFinder<>(raceLog, true, RaceLogUseCompetitorsFromRaceLogEvent.class).analyze(); for (RaceLogEvent event : events) { @@ -391,11 +391,7 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem raceLog.unlockAfterRead(); } if (event != null) { - try { - raceLog.revokeEvent(raceLogEventAuthorForRaceColumn, event, "revoke triggered by GWT user action"); - } catch (NotRevokableException e) { - logger.warning("Event could not be revoked"); - } + raceLog.revokeEvent(raceLogEventAuthorForRaceColumn, event, "revoke triggered by GWT user action"); } } } From 824e9e9872630db757afc05749fed7beff75af0c Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 13 Jan 2016 16:46:54 +0100 Subject: [PATCH 078/165] Javadoc and formatting changes only Change-Id: I0c481239d4e5ae092ff6421152609364ef8014ca --- .../com/sap/sailing/domain/base/RaceColumn.java | 14 +++++++++++--- .../domain/base/impl/AbstractRaceColumn.java | 9 +++------ 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java index 5312521f8ba..3a998218674 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java @@ -291,13 +291,21 @@ public interface RaceColumn extends Named { /** * Activates competitor registration on the race column's race log associated to the passed fleet. As a result, + * competitor registrations that were added to the race log before this was disabled by + * {@link #disableCompetitorRegistrationOnRaceLog(Fleet)} will again be honored.

* * Performs nothing in case this column belongs to a {@link MetaLeaderboard}. */ void enableCompetitorRegistrationOnRaceLog(Fleet fleet); /** - * Disables competitor registration on the race column's race log associated to the passed fleet. + * Disables competitor registration on the race column's race log associated to the passed fleet. Performs nothing + * in case this column belongs to a {@link MetaLeaderboard}. If there are already competitor registrations on the + * race log, those will not be removed from the log but they will be ignored, and the regatta log's competitor + * registrations will be used instead. Re-{@link #enableCompetitorRegistrationOnRaceLog(Fleet) enabling} competitor + * registrations in the race log will cause such existing registrations to be honored again. + *

+ * * Performs nothing in case this column belongs to a {@link MetaLeaderboard}. */ void disableCompetitorRegistrationOnRaceLog(Fleet fleet) throws NotRevokableException; @@ -306,8 +314,8 @@ public interface RaceColumn extends Named { * Registers a competitor on the the race column's race log associated to the passed fleet. * * @throws CompetitorRegistrationOnRaceLogDisabledException - * thrown if competitor registration is disabled on racelog as well as if RaceColumn belongs to a - * {@link MetaLeaderboard} + * thrown if competitor registration is {@link #disableCompetitorRegistrationOnRaceLog(Fleet) disabled} + * on racelog as well as if RaceColumn belongs to a {@link MetaLeaderboard} */ void registerCompetitor(Competitor competitor, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java index cb45749cc79..ebad6341448 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java @@ -280,14 +280,13 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem @Override public void registerCompetitors(Iterable competitors, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException { - if (!isCompetitorRegistrationInRacelogEnabled(fleet)){ + if (!isCompetitorRegistrationInRacelogEnabled(fleet)) { throw new CompetitorRegistrationOnRaceLogDisabledException(); } - TimePoint now = MillisecondsTimePoint.now(); RaceLog raceLog = getRaceLog(fleet); int passId = raceLog.getCurrentPassId(); - for (Competitor competitor: competitors){ + for (Competitor competitor : competitors) { raceLog.add(new RaceLogRegisterCompetitorEventImpl(now, now, raceLogEventAuthorForRaceColumn, UUID.randomUUID(), passId, competitor)); } @@ -302,13 +301,11 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem @Override public void deRegisterCompetitors(Iterable competitors, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException { - if (!isCompetitorRegistrationInRacelogEnabled(fleet)){ + if (!isCompetitorRegistrationInRacelogEnabled(fleet)) { throw new CompetitorRegistrationOnRaceLogDisabledException(); } - HashSet competitorSet = new HashSet(); Util.addAll(competitors, competitorSet); - RaceLog raceLog = getRaceLog(fleet); for (RaceLogEvent event : raceLog.getUnrevokedEventsDescending()) { if (event instanceof RegisterCompetitorEvent) { From 5af68c8dcb4738aa067ed79243bacf967f914471 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 13 Jan 2016 17:51:05 +0100 Subject: [PATCH 079/165] fixed FIXME comment formatting Change-Id: I1fb8df525b9099fd99e959ec8c8c9bd5ebb396ab --- .../sap/sailing/domain/base/impl/AbstractRaceColumn.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java index ebad6341448..1fde705cf37 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java @@ -194,10 +194,8 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem RaceLog raceLogAvailable = raceLogs.get(fleet); if (raceLogAvailable == null) { RaceColumnRaceLogReplicator listener = new RaceColumnRaceLogReplicator(this, identifier); - // FIXME Wouldn't this skip any listener notifications that a merge below would trigger if the race log - // already existed? - // FIXME For example, how about the race log-provided score corrections that need application to the - // leaderboard and replication? + // FIXME Wouldn't this skip any listener notifications that a merge below would trigger if the race log already existed? + // FIXME For example, how about the race log-provided score corrections that need application to the leaderboard and replication? newOrLoadedRaceLog.addListener(listener); raceLogs.put(fleet, newOrLoadedRaceLog); final TrackedRace trackedRace = getTrackedRace(fleet); From ade6f013235c5104c03f16493a441968c9fa3486 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 13 Jan 2016 18:04:27 +0100 Subject: [PATCH 080/165] simple reformat Change-Id: I3761ea48a07f5460397c495da4b6db3f441dfa00 --- .../com/sap/sailing/domain/base/impl/RegattaImpl.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java index 041bf146995..cd5685d4e2b 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java @@ -692,12 +692,9 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene } catch (ConcurrentModificationException e) { // getSeries() returns a live collection, and Series.getRaceColumns() does so, too. // In the unlikely event of a modification is applied to either of these structures while - // iterating, an exception - // will be thrown. We catch and log it here and try again. - logger.log( - Level.INFO, - "Got a ConcurrentModificationException while trying to update the RaceExecutionOrderCache", - e); + // iterating, an exception will be thrown. We catch and log it here and try again. + logger.log(Level.INFO, + "Got a ConcurrentModificationException while trying to update the RaceExecutionOrderCache", e); concurrentlyModified = true; } } while (concurrentlyModified); From cab993170f082be7791ee9cd3b42bf4fbb54f5b9 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 13 Jan 2016 18:05:29 +0100 Subject: [PATCH 081/165] harmonized deregisterCompetitor and deRegisterCompetitor naming Change-Id: I9f300d9ffdb37f95a09ef67279ab5bc4cac2b2bb --- .../src/com/sap/sailing/domain/base/RaceColumn.java | 4 ++-- .../sap/sailing/domain/base/impl/AbstractRaceColumn.java | 6 +++--- .../domain/leaderboard/meta/MetaLeaderboardColumn.java | 4 ++-- .../com/sap/sailing/gwt/ui/server/SailingServiceImpl.java | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java index 3a998218674..821ce4d4c7f 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java @@ -335,7 +335,7 @@ public interface RaceColumn extends Named { * thrown if competitor registration is disabled on racelog as well as if RaceColumn belongs to a * {@link MetaLeaderboard} */ - void deRegisterCompetitor(Competitor competitors, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException; + void deregisterCompetitor(Competitor competitors, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException; /** * Deregisters competitors on the the race column's race log associated to the passed fleet. @@ -344,5 +344,5 @@ public interface RaceColumn extends Named { * thrown if competitor registration is disabled on racelog as well as if RaceColumn belongs to a * {@link MetaLeaderboard} */ - void deRegisterCompetitors(Iterable currentlyRegisteredCompetitors, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException; + void deregisterCompetitors(Iterable currentlyRegisteredCompetitors, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException; } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java index 1fde705cf37..14de0c4488e 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java @@ -291,13 +291,13 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem } @Override - public void deRegisterCompetitor(Competitor competitor, Fleet fleet) + public void deregisterCompetitor(Competitor competitor, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException { - deRegisterCompetitors(Collections.singleton(competitor), fleet); + deregisterCompetitors(Collections.singleton(competitor), fleet); } @Override - public void deRegisterCompetitors(Iterable competitors, Fleet fleet) + public void deregisterCompetitors(Iterable competitors, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException { if (!isCompetitorRegistrationInRacelogEnabled(fleet)) { throw new CompetitorRegistrationOnRaceLogDisabledException(); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java index 47574d23f18..12e43813f04 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java @@ -260,13 +260,13 @@ public class MetaLeaderboardColumn extends SimpleAbstractRaceColumn implements R } @Override - public void deRegisterCompetitor(Competitor competitors, Fleet fleet) + public void deregisterCompetitor(Competitor competitors, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException { throw new CompetitorRegistrationOnRaceLogDisabledException(); } @Override - public void deRegisterCompetitors(Iterable competitors, Fleet fleet) + public void deregisterCompetitors(Iterable competitors, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException { throw new CompetitorRegistrationOnRaceLogDisabledException(); } 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 2809b240812..0a8e3f91f8a 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 @@ -5093,7 +5093,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S Util.addAll(competitorsToRemove, competitorSetToRemove); filterDuplicates(competitorsToRegister, competitorSetToRemove); - raceColumn.deRegisterCompetitors(competitorSetToRemove, fleet); + raceColumn.deregisterCompetitors(competitorSetToRemove, fleet); raceColumn.registerCompetitors(competitorsToRegister, fleet); } From 42c701df2ff9e7b5e08a1b768d7d468a8b988e2b Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 13 Jan 2016 18:10:40 +0100 Subject: [PATCH 082/165] formatting only Change-Id: I0b6e78fcb9363ec2b5764993d1a4c68a9ea715b8 --- .../sailing/domain/base/impl/SimpleAbstractRaceColumn.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SimpleAbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SimpleAbstractRaceColumn.java index 65a0b9f6992..904259d680f 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SimpleAbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SimpleAbstractRaceColumn.java @@ -123,8 +123,7 @@ public abstract class SimpleAbstractRaceColumn implements RaceColumn { @Override public Iterable getCompetitorsRegisteredInRacelog(final Fleet fleet) { RaceLog raceLog = getRaceLog(fleet); - - if (raceLog == null){ + if (raceLog == null) { return Collections.emptySet(); } else { RaceLogRegisteredCompetitorsAnalyzer analyzer = new RaceLogRegisteredCompetitorsAnalyzer(raceLog); @@ -135,8 +134,7 @@ public abstract class SimpleAbstractRaceColumn implements RaceColumn { @Override public boolean isCompetitorRegistrationInRacelogEnabled(final Fleet fleet) { RaceLog raceLog = getRaceLog(fleet); - - if (raceLog == null){ + if (raceLog == null) { return false; } else { RaceLogUsesOwnCompetitorsAnalyzer analyzer = new RaceLogUsesOwnCompetitorsAnalyzer(raceLog); From ec7c4978a573b6badc05b11a9773bc502c26fd6d Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 13 Jan 2016 18:16:19 +0100 Subject: [PATCH 083/165] minor refactoring: use Collections.emptySet() instead of a new HashSet Change-Id: Ide53267137c910eef4df0e759c566cafd8d46b94 --- .../impl/RaceLogRegisteredCompetitorsAnalyzer.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceLogRegisteredCompetitorsAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceLogRegisteredCompetitorsAnalyzer.java index a934b1517c5..73420f406c4 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceLogRegisteredCompetitorsAnalyzer.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceLogRegisteredCompetitorsAnalyzer.java @@ -1,6 +1,6 @@ package com.sap.sailing.domain.abstractlog.race.analyzing.impl; -import java.util.HashSet; +import java.util.Collections; import java.util.Set; import com.sap.sailing.domain.abstractlog.race.RaceLog; @@ -16,12 +16,15 @@ public class RaceLogRegisteredCompetitorsAnalyzer extends RaceLogAnalyzer performAnalysis() { + final Set result; if (new RaceLogUsesOwnCompetitorsAnalyzer(getLog()).analyze()){ - //get Events from RaceLog - return new CompetitorsInLogAnalyzer<>(getLog()).analyze(); + // get Events from RaceLog + result = new CompetitorsInLogAnalyzer<>(getLog()).analyze(); } else { - //get Events from RegattaLog - return new HashSet(); + // as we're explicitly only trying to find those registrations in the RaceLog, we won't + // return anything from the regatta log. + result = Collections.emptySet(); } + return result; } } From 06fd44ffcda12a5d4ce1e0334228db364acde005 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 14 Jan 2016 11:15:43 +0100 Subject: [PATCH 084/165] in CompetitorProviderFromRaceColumnsAndRegattaLike also invalidate caches when a race log no longer provides dedicated competitors for a race Change-Id: I1da92144012c9e7c5e6f437f5d80151281895693 --- .../sailing/domain/base/impl/RegattaImpl.java | 9 +++++++++ ...rProviderFromRaceColumnsAndRegattaLike.java | 10 ++++++++-- .../impl/FlexibleLeaderboardImpl.java | 18 +++++++++++++----- 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java index cd5685d4e2b..2d7f1200be6 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java @@ -74,6 +74,15 @@ import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; import com.sap.sse.common.impl.NamedImpl; +/** + * A regatta with series with race columns and fleets, a scoring scheme and various other data, many of which are relevant + * for scoring. A regatta has a single boat class. It implements the {@link IsRegattaLike} interface and for this uses a + * delegate pattern with the {@link BaseRegattaLikeImpl} which it shares with {@link FlexibleLeaderboardImpl}. That + * delegate provides the {@link RegattaLog} for this regatta. + * + * @author Axel Uhl (D043530) + * + */ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListener { /** diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/CompetitorProviderFromRaceColumnsAndRegattaLike.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/CompetitorProviderFromRaceColumnsAndRegattaLike.java index a0368b356a1..8189ad3d1b0 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/CompetitorProviderFromRaceColumnsAndRegattaLike.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/CompetitorProviderFromRaceColumnsAndRegattaLike.java @@ -36,8 +36,12 @@ import com.sap.sse.common.Util.Pair; *

  • a race column is added or removed
  • *
  • a tracked race is linked to or unlinked from any of the race columns
  • *
  • the racelog is marked as providing it's own competitors via the {@link RaceLogUseCompetitorsFromRaceLogEvent}
  • + *
  • the racelog is marked as no longer providing it's own competitors by revoking an event of type {@link RaceLogUseCompetitorsFromRaceLogEvent}
  • * * + * Note that objects of this type are not serializable. Classes using such objects shall not assign them to non-transient + * fields if they want to be serializable themselves. + * * @author Axel Uhl (d043530) * */ @@ -101,8 +105,10 @@ public class CompetitorProviderFromRaceColumnsAndRegattaLike { @Override public void visit(RaceLogRevokeEvent event) { try { - if (RaceLogRegisterCompetitorEvent.class - .isAssignableFrom(Class.forName(event.getRevokedEventType()))) { + final Class revokedEventClass = Class.forName(event.getRevokedEventType()); + // + if (RaceLogRegisterCompetitorEvent.class.isAssignableFrom(revokedEventClass) || + RaceLogUseCompetitorsFromRaceLogEvent.class.isAssignableFrom(revokedEventClass)) { invalidateAllCompetitorsCaches(); } } catch (ClassNotFoundException e) { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java index c19f56c9ca3..5f4ad1673c5 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java @@ -38,11 +38,19 @@ import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sse.common.Duration; /** - * A leaderboard implementation that allows users to flexibly configure which columns exist. No constraints need to be observed regarding - * the columns belonging to the same regatta or even boat class.

    + * A leaderboard implementation that allows users to flexibly configure which columns exist. No constraints need to be + * observed regarding the columns belonging to the same regatta or even boat class. + *

    * - * The flexible leaderboard listens as {@link RaceColumnListener} on all its {@link RaceColumn}s and forwards all events to - * all {@link RaceColumnListener}s subscribed with this leaderboard. + * The flexible leaderboard listens as {@link RaceColumnListener} on all its {@link RaceColumn}s and forwards all events + * to all {@link RaceColumnListener}s subscribed with this leaderboard. + *

    + * + * This class also implements the {@link IsRegattaLike} interface, emulating several aspects that otherwise would be + * found on a {@link Regatta} that is modeled properly with its series and fleets. In particular, the + * {@link IsRegattaLike} interface requires this leaderboard to provide a {@link RegattaLog} and to grant access to its + * {@link RaceColumn}s by name. A {@link BaseRegattaLikeImpl} is used as a delegate to implement the {@link IsRegattaLike} + * interface. * * @author Axel Uhl (D043530) * @@ -97,7 +105,7 @@ public class FlexibleLeaderboardImpl extends AbstractLeaderboardImpl implements * Deserialization has to be maintained in lock-step with {@link #writeObject(ObjectOutputStream) serialization}. * When de-serializing, a possibly remote {@link #raceLogStore} is ignored because it is transient. Instead, an * {@link EmptyRaceLogStore} is used for the de-serialized instance. A new {@link RaceLogInformation} is - * assembled for this empty race log and applied to all columns. + * assembled for this empty race log store and applied to all columns. */ private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { ois.defaultReadObject(); From 76f1b88bcd8feee773d49ab8f628a7bb8e64a4e3 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 14 Jan 2016 11:29:25 +0100 Subject: [PATCH 085/165] added a test case for the fix provided by 06fd44ffcda12a5d4ce1e0334228db364acde005; this was about invalidation of the competitor cache when a race log changes its mind regarding whether it is responsible for providing the race's competitors or not Change-Id: Ibb2b057005d2b1b8f056ac8263faa541c0701e41 --- ...mpetitorProviderCacheInvalidationTest.java | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CompetitorProviderCacheInvalidationTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CompetitorProviderCacheInvalidationTest.java index 3ed1729fe17..3bccce5f657 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CompetitorProviderCacheInvalidationTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CompetitorProviderCacheInvalidationTest.java @@ -166,7 +166,7 @@ public class CompetitorProviderCacheInvalidationTest extends AbstractLeaderboard } @Test - public void testSimpleCompetitorListOnOneRaceLogAndRegattaLogInFlexibleLeaderboard() { + public void testSimpleCompetitorListOnOneRaceLogAndRegattaLogInFlexibleLeaderboard() throws NotRevokableException { flexibleLeaderboard.addRaceColumn("R1", /* medalRace */ false); RegattaLog regattaLog = flexibleLeaderboard.getRegattaLog(); for (Competitor c : compLists[0]) { @@ -175,20 +175,32 @@ public class CompetitorProviderCacheInvalidationTest extends AbstractLeaderboard RaceLog raceLog = flexibleLeaderboard.getRacelog("R1", LeaderboardNameConstants.DEFAULT_FLEET_NAME); final LogEventAuthorImpl author = new LogEventAuthorImpl("Me", 0); int passId = 1; - raceLog.add(new RaceLogUseCompetitorsFromRaceLogEventImpl(MillisecondsTimePoint.now(), author, MillisecondsTimePoint.now(), UUID.randomUUID(), passId)); + final RaceLogUseCompetitorsFromRaceLogEventImpl usesCompetitorsFromRaceLogEvent = new RaceLogUseCompetitorsFromRaceLogEventImpl(MillisecondsTimePoint.now(), author, MillisecondsTimePoint.now(), UUID.randomUUID(), passId); + raceLog.add(usesCompetitorsFromRaceLogEvent); for (Competitor c : compLists[1]) { raceLog.add(new RaceLogRegisterCompetitorEventImpl(MillisecondsTimePoint.now(), new LogEventAuthorImpl("Me", 0), 1, c)); } //expected are only the competitors in the RaceLog, because only one RaceColumn is - //registered, which has the competitors registered in the RaceLog. - Set expected = new HashSet<>(compLists[1]); + //registered, which has the competitors registered in the RaceLog. + assertRegattaAndRaceCompetitors(new HashSet<>(compLists[1])); + // Now we revoke that the race log provides the competitors for R1; the competitors should then + // snap back to those competitors taken from the regatta log for both, the rentire leaderboard + // as well as for the race column + raceLog.revokeEvent(author, usesCompetitorsFromRaceLogEvent); + assertRegattaAndRaceCompetitors(new HashSet<>(compLists[0])); + // And now re-introduce per-race competitors and validate again that the cache adjusts properly: + raceLog.add(new RaceLogUseCompetitorsFromRaceLogEventImpl(MillisecondsTimePoint.now(), author, MillisecondsTimePoint.now(), UUID.randomUUID(), passId)); + assertRegattaAndRaceCompetitors(new HashSet<>(compLists[1])); + } + + private void assertRegattaAndRaceCompetitors(Set expected) { Set actual = new HashSet<>(); Util.addAll(competitorProviderFlexibleLeaderboard.getAllCompetitors(), actual); assertEquals(expected, actual); Set actualForRace = new HashSet<>(); //For the race only the competitors registered on RaceLog as RaceLogUseCompetitorsFromRaceLogEvent is present - Set expectedForRace = new HashSet<>(compLists[1]); + Set expectedForRace = new HashSet<>(expected); Util.addAll(competitorProviderFlexibleLeaderboard.getAllCompetitors( flexibleLeaderboard.getRaceColumnByName("R1"), flexibleLeaderboard.getFleet(LeaderboardNameConstants.DEFAULT_FLEET_NAME)), actualForRace); From 088f1441cc55fc635d8d9f14e3ce8891de751c76 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 14 Jan 2016 11:39:51 +0100 Subject: [PATCH 086/165] fixing getAllMarks() and getMarks(Fleet) implementatoins on MetaLeaderboardColumn Change-Id: I320c8a329f76735c066241872a3e73e2e95881ab --- .../leaderboard/meta/MetaLeaderboardColumn.java | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java index 12e43813f04..0583a1db0df 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java @@ -1,8 +1,6 @@ package com.sap.sailing.domain.leaderboard.meta; import java.util.Collections; -import java.util.HashSet; -import java.util.Set; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; @@ -22,7 +20,6 @@ import com.sap.sailing.domain.racelog.RaceLogStore; import com.sap.sailing.domain.regattalike.RegattaLikeIdentifier; import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; import com.sap.sailing.domain.tracking.TrackedRace; -import com.sap.sse.common.Util; /** * All {@link RaceColumnListener} events received from the underlying leaderboard's race columns @@ -233,18 +230,12 @@ public class MetaLeaderboardColumn extends SimpleAbstractRaceColumn implements R @Override public Iterable getAllMarks() { - Set marks = new HashSet(); - for (Fleet fleet: getFleets()) { - TrackedRace trackedRace = getTrackedRace(fleet); - Util.addAll(trackedRace.getMarks(), marks); - } - return marks; + return Collections.emptySet(); } @Override public Iterable getMarks(Fleet fleet) { - TrackedRace trackedRace = getTrackedRace(fleet); - return trackedRace.getMarks(); + return Collections.emptySet(); } @Override From 25baa60a1538754de7a9981c81b610578e508bb1 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 14 Jan 2016 11:45:15 +0100 Subject: [PATCH 087/165] cleaned up TopLevelMasterData.isMarkMappingEvent Change-Id: I987270de1ca18a68ccef648240aa8c0995f07e71 --- .../domain/masterdataimport/TopLevelMasterData.java | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/masterdataimport/TopLevelMasterData.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/masterdataimport/TopLevelMasterData.java index 6bdf06fb83b..4a75185a9ef 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/masterdataimport/TopLevelMasterData.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/masterdataimport/TopLevelMasterData.java @@ -157,20 +157,12 @@ public class TopLevelMasterData implements Serializable { } private boolean isMarkMappingEvent(RegattaLogDeviceMappingEvent mappingEvent) { - boolean isMarkMappingEvent = false; - if (mappingEvent instanceof RegattaLogDeviceMarkMappingEvent) { - isMarkMappingEvent = true; - } - return isMarkMappingEvent; + return mappingEvent instanceof RegattaLogDeviceMarkMappingEvent; } /** * Workaround to look for the events connected to RegattaLeadeboards. There should be a proper connection between * regatta and event soon. TODO - * - * @param groupsToExport - * @param allEvents - * @return */ private Map> createEventMap(Set groupsToExport, Iterable allEvents) { @@ -193,7 +185,6 @@ public class TopLevelMasterData implements Serializable { } } } - } return eventsForLeaderboardGroup; } From 011bb4ddfc3b9731163018aff65fcf0c850e24a2 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 14 Jan 2016 12:07:34 +0100 Subject: [PATCH 088/165] introduced getAllCompetitors() on HasRegattaLike; all implementations already provide it; using it in LeaderboardsResource instead of only looking at RegattaLog Change-Id: Ibdea059c56a5a528583fd5494afa96d6b1e85a86 --- .../domain/regattalike/HasRegattaLike.java | 15 +++++++++++++++ .../gateway/jaxrs/api/LeaderboardsResource.java | 6 +++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/HasRegattaLike.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/HasRegattaLike.java index 4f0cdcd6adb..deb887970fb 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/HasRegattaLike.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/HasRegattaLike.java @@ -2,6 +2,7 @@ package com.sap.sailing.domain.regattalike; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; @@ -17,8 +18,22 @@ public interface HasRegattaLike { RaceLog getRacelog(String raceColumnName, String fleetName); + /** + * Determines the competitors registered in the regatta log. Note that this is not necessarily the complete set of + * competitors participating in this "regatta." For that, use {@link #getAllCompetitors()}. + */ Iterable getCompetitorsRegisteredInRegattaLog(); + /** + * Determines the combined set of all competitors from all race columns that this object's {@link IsRegattaLike} + * has. + * + * @see #getRegattaLike() + * @see IsRegattaLike#getRaceColumnByName(String) + * @see RaceColumn#getAllCompetitors() + */ + Iterable getAllCompetitors(); + void registerCompetitor(Competitor competitor); void registerCompetitors(Iterable competitor); diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java index 23bf5fd9f2b..cf3c0e1020b 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java @@ -400,15 +400,15 @@ public class LeaderboardsResource extends AbstractSailingServerResource { Competitor mappedTo = domainFactory.getCompetitorStore().getExistingCompetitorByIdAsString(competitorId); if (mappedTo == null) { logger.warning("No competitor found for id " + competitorId); - return Response.status(Status.BAD_REQUEST).entity("No competitor found for id " + competitorId) + return Response.status(Status.BAD_REQUEST).entity("No competitor found for id " + StringEscapeUtils.escapeHtml(competitorId)) .type(MediaType.TEXT_PLAIN).build(); } - Set registered = (Set) hasRegattaLike.getCompetitorsRegisteredInRegattaLog(); + Set registered = (Set) hasRegattaLike.getAllCompetitors(); if (!registered.contains(mappedTo)) { logger.warning("Competitor found but not registered on a race of " + leaderboardName); return Response.status(Status.BAD_REQUEST) - .entity("Competitor found but not registered on a race of " + leaderboardName) + .entity("Competitor found but not registered on a race of " + StringEscapeUtils.escapeHtml(leaderboardName)) .type(MediaType.TEXT_PLAIN).build(); } DeviceIdentifier device = new SmartphoneUUIDIdentifierImpl(UUID.fromString(deviceUuid)); From f451e36b87322e81c92b34bd4ad8274d69ff62aa Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 14 Jan 2016 12:19:45 +0100 Subject: [PATCH 089/165] re-introduced TrackedRaceImpl.attachRaceLog because TrackedRaceImpl should be responsible for managing its attachedRaceLogs field Change-Id: Idd26a7b71f937ad4e7f22acc8ab427c1db63b405 --- .../domain/tracking/impl/DynamicTrackedRaceImpl.java | 5 +---- .../sap/sailing/domain/tracking/impl/TrackedRaceImpl.java | 8 ++++++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java index c06766e9bf3..6b64a6d096f 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java @@ -759,10 +759,7 @@ DynamicTrackedRace, GPSTrackListener { @Override public void attachRaceLog(RaceLog raceLog) { logListener.addTo(raceLog); - synchronized (DynamicTrackedRaceImpl.this) { - attachedRaceLogs.put(raceLog.getId(), raceLog); - notifyAll(); - } + super.attachRaceLog(raceLog); } @Override 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 b5a6bd5ad1f..5a97bf8b68e 100644 --- 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 @@ -3297,6 +3297,14 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl return loadingFromGPSFixStore; } + @Override + public void attachRaceLog(RaceLog raceLog) { + synchronized (TrackedRaceImpl.this) { + attachedRaceLogs.put(raceLog.getId(), raceLog); + notifyAll(); + } + } + @Override public void attachRaceExecutionProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { if (raceExecutionOrderProvider != null && !attachedRaceExecutionOrderProviders.containsKey(raceExecutionOrderProvider)) { From a1b9492971dc7cdadec3b247bbabf51312828bf9 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 14 Jan 2016 14:14:20 +0100 Subject: [PATCH 090/165] deprecated RACE_LOG_MARK, as it was replaced by REGATTA_LOG_MARK Change-Id: Ia10f4c2b417f67dc375ef3435404270c34ea6187 --- .../src/com/sap/sailing/domain/common/NotFoundException.java | 2 +- .../com/sap/sailing/domain/persistence/impl/FieldNames.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/NotFoundException.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/NotFoundException.java index 86873bb52f3..1182a9de6c1 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/NotFoundException.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/NotFoundException.java @@ -2,7 +2,7 @@ package com.sap.sailing.domain.common; import java.io.Serializable; -public class NotFoundException extends Exception implements Serializable{ +public class NotFoundException extends Exception implements Serializable { private static final long serialVersionUID = 1690510580423647161L; diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java index cf34f4c719e..e4c3013cc29 100755 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java @@ -92,10 +92,11 @@ public enum FieldNames { CONTROLPOINT_VALUE, CONTROLPOINTWITHTWOMARKS_ID, CONTROLPOINTWITHTWOMARKS_NAME, CONTROLPOINTWITHTWOMARKS_LEFT, CONTROLPOINTWITHTWOMARKS_RIGHT, RACE_LOG_POSITIONED_COMPETITORS, RACE_LOG_PATHFINDER_ID, RACE_LOG_GATE_LINE_OPENING_TIME, RACE_LOG_GOLF_DOWN_TIME, RACE_LOG_START_PROCEDURE_TYPE, RACE_LOG_PROTEST_START_TIME, RACE_LOG_COURSE_DESIGN_NAME, RACE_LOG_REVOKED_EVENT_ID, RACE_LOG_REVOKED_EVENT_TYPE, RACE_LOG_REVOKED_EVENT_SHORT_INFO, - RACE_LOG_REVOKED_REASON, RACE_LOG_FROM, RACE_LOG_TO, RACE_LOG_MARK, RACE_LOG_DEVICE_MAPPING_EVENT_ID, + RACE_LOG_REVOKED_REASON, RACE_LOG_FROM, RACE_LOG_TO, RACE_LOG_DEVICE_MAPPING_EVENT_ID, RACE_LOG_CLOSING_TIMEPOINT, TIMEPOINT_OF_FIXED_MARKPASSING, INDEX_OF_PASSED_WAYPOINT,INDEX_OF_FIRST_SUPPRESSED_WAYPOINT, MARK, RACE_LOG_COMPETITOR_ID, RACE_LOG_DEPDENDENT_ON_FLEET, RACE_LOG_DEPDENDENT_ON_RACECOLUMN, RACE_LOG_DEPDENDENT_ON_REGATTALIKE, RACE_LOG_START_TIME_DIFFERENCE_IN_MS, + /** @deprecated Replaced by a regatta log entry with type {@link #REGATTA_LOG_MARK} */ @Deprecated RACE_LOG_MARK, /** @deprecated Replaced by WAYPOINT_PASSINGINSTRUCTIONS, still used to migrate old races*/ @Deprecated WAYPOINT_PASSINGSIDE, /** @deprecated Replaced by CONTROLPOINTWITHTWOMARKS_ID, still used to migrate old races*/ @Deprecated GATE_ID, /** @deprecated Replaced by CONTROLPOINTWITHTWOMARKS_NAME, still used to migrate old races*/ @Deprecated GATE_NAME, From e24b3050d45a94544bc4528faa2f0266481e10cc Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 14 Jan 2016 14:20:30 +0100 Subject: [PATCH 091/165] deprecated RACE_LOG_FROM and RACE_LOG_TO Change-Id: I8a9673d44f0b912930b83aed4c193fb7b6771712 --- .../persistence/impl/DomainObjectFactoryImpl.java | 12 ++++++++++-- .../sailing/domain/persistence/impl/FieldNames.java | 4 +++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java index a13f3e7567f..e91c3be99e5 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java @@ -1724,7 +1724,11 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { } //have to load complete mark, as no order is guaranteed for loading of racelog events Mark mappedTo = loadMark((DBObject) dbObject.get(FieldNames.MARK.name())); - Triple times = loadFromToTimePoint(dbObject, FieldNames.REGATTA_LOG_FROM, FieldNames.RACE_LOG_FROM, FieldNames.REGATTA_LOG_TO, FieldNames.RACE_LOG_TO); + @SuppressWarnings("deprecation") // used only for auto-migration; may be removed in future releases + final FieldNames deprecatedFromFieldName = FieldNames.RACE_LOG_FROM; + @SuppressWarnings("deprecation") // used only for auto-migration; may be removed in future releases + final FieldNames deprecatedToFieldName = FieldNames.RACE_LOG_TO; + Triple times = loadFromToTimePoint(dbObject, FieldNames.REGATTA_LOG_FROM, deprecatedFromFieldName, FieldNames.REGATTA_LOG_TO, deprecatedToFieldName); final TimePoint from = times.getA(); final TimePoint to = times.getB(); final RegattaLogDeviceMarkMappingEventImpl result = new RegattaLogDeviceMarkMappingEventImpl(createdAt, logicalTimePoint, author, id, mappedTo, device, from, to); @@ -1785,7 +1789,11 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { } Competitor mappedTo = baseDomainFactory.getExistingCompetitorById( (Serializable) dbObject.get(FieldNames.COMPETITOR_ID.name())); - Triple times = loadFromToTimePoint(dbObject, FieldNames.REGATTA_LOG_FROM, FieldNames.RACE_LOG_FROM, FieldNames.REGATTA_LOG_TO, FieldNames.RACE_LOG_TO); + @SuppressWarnings("deprecation") // used only for auto-migration; may be removed in future releases + final FieldNames deprecatedFromFieldName = FieldNames.RACE_LOG_FROM; + @SuppressWarnings("deprecation") // used only for auto-migration; may be removed in future releases + final FieldNames deprecatedToFieldName = FieldNames.RACE_LOG_TO; + Triple times = loadFromToTimePoint(dbObject, FieldNames.REGATTA_LOG_FROM, deprecatedFromFieldName, FieldNames.REGATTA_LOG_TO, deprecatedToFieldName); final TimePoint from = times.getA(); final TimePoint to = times.getB(); final boolean needsMigration = times.getC(); diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java index e4c3013cc29..a01176aab28 100755 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java @@ -92,10 +92,12 @@ public enum FieldNames { CONTROLPOINT_VALUE, CONTROLPOINTWITHTWOMARKS_ID, CONTROLPOINTWITHTWOMARKS_NAME, CONTROLPOINTWITHTWOMARKS_LEFT, CONTROLPOINTWITHTWOMARKS_RIGHT, RACE_LOG_POSITIONED_COMPETITORS, RACE_LOG_PATHFINDER_ID, RACE_LOG_GATE_LINE_OPENING_TIME, RACE_LOG_GOLF_DOWN_TIME, RACE_LOG_START_PROCEDURE_TYPE, RACE_LOG_PROTEST_START_TIME, RACE_LOG_COURSE_DESIGN_NAME, RACE_LOG_REVOKED_EVENT_ID, RACE_LOG_REVOKED_EVENT_TYPE, RACE_LOG_REVOKED_EVENT_SHORT_INFO, - RACE_LOG_REVOKED_REASON, RACE_LOG_FROM, RACE_LOG_TO, RACE_LOG_DEVICE_MAPPING_EVENT_ID, + RACE_LOG_REVOKED_REASON, RACE_LOG_DEVICE_MAPPING_EVENT_ID, RACE_LOG_CLOSING_TIMEPOINT, TIMEPOINT_OF_FIXED_MARKPASSING, INDEX_OF_PASSED_WAYPOINT,INDEX_OF_FIRST_SUPPRESSED_WAYPOINT, MARK, RACE_LOG_COMPETITOR_ID, RACE_LOG_DEPDENDENT_ON_FLEET, RACE_LOG_DEPDENDENT_ON_RACECOLUMN, RACE_LOG_DEPDENDENT_ON_REGATTALIKE, RACE_LOG_START_TIME_DIFFERENCE_IN_MS, + /** @deprecated Replaced by {@link #REGATTA_LOG_FROM}; auto-migration from race log device mappings to regatta log is implemented */ @Deprecated RACE_LOG_FROM, + /** @deprecated Replaced by {@link #REGATTA_LOG_TO}; auto-migration from race log device mappings to regatta log is implemented */ @Deprecated RACE_LOG_TO, /** @deprecated Replaced by a regatta log entry with type {@link #REGATTA_LOG_MARK} */ @Deprecated RACE_LOG_MARK, /** @deprecated Replaced by WAYPOINT_PASSINGINSTRUCTIONS, still used to migrate old races*/ @Deprecated WAYPOINT_PASSINGSIDE, /** @deprecated Replaced by CONTROLPOINTWITHTWOMARKS_ID, still used to migrate old races*/ @Deprecated GATE_ID, From d2aaf40174c4f9d3cc27a0620e7ad7c2c6e9d4cf Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 14 Jan 2016 14:40:29 +0100 Subject: [PATCH 092/165] replaced decision by exception by a check; CompetitorRegistrationOnRaceLogDisabledException can be avoided usually by a check for isCompetitorRegistrationInRaclogEnabled Change-Id: I3c2cbe761ba0a36a1a8f21689c774c2943b5556b --- .../base/impl/RaceColumnInSeriesImpl.java | 2 +- .../gwt/ui/client/SailingServiceAsync.java | 8 ++++++++ .../gwt/ui/server/SailingServiceImpl.java | 17 +++++++++-------- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnInSeriesImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnInSeriesImpl.java index 435111bb2fb..975d98fc0a0 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnInSeriesImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnInSeriesImpl.java @@ -15,7 +15,7 @@ import com.sap.sailing.domain.tracking.TrackedRegatta; import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; /** - * Obtains flees and medal information from the {@link Series} to which it is connected at construction time. + * Obtains fleets and medal information from the {@link Series} to which it is connected at construction time. * * @author Axel Uhl (D043530) * 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 dd3cc3fefba..b09ff4c76e2 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 @@ -727,6 +727,14 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan void getTrackingTimes(String leaderboardName, String raceColumnName, String fleetName, AsyncCallback> callback); + /** + * Copies one race's competitor set to other races. + * @param fromTriple + * leaderboard name, race column name, and fleet name identifying the race from which to copy the + * competitors + * @param toTriples leaderboard name, race column name, and fleet name identifying the races to which to copy the + * competitors + */ void copyCompetitorsToOtherRaceLogs(Triple fromTriple, Set> toTriples, AsyncCallback callback); 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 0a8e3f91f8a..bd790f168f0 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 @@ -5298,18 +5298,19 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S Set> toTriples) throws NotFoundException { RaceColumn raceColumn = getRaceColumn(fromTriple.getA(), fromTriple.getB()); Iterable competitorsToCopy = raceColumn.getAllCompetitors(getFleetByName(raceColumn, fromTriple.getC())); - for (com.sap.sse.common.Util.Triple toTriple : toTriples) { - RaceColumn toRaceColumn = getRaceColumn(toTriple.getA(), toTriple.getB()); + final RaceColumn toRaceColumn = getRaceColumn(toTriple.getA(), toTriple.getB()); + final Fleet toFleet = getFleetByName(toRaceColumn, toTriple.getC()); try { - toRaceColumn.registerCompetitors(competitorsToCopy, getFleetByName(toRaceColumn, toTriple.getC())); - } catch (CompetitorRegistrationOnRaceLogDisabledException e){ - toRaceColumn.enableCompetitorRegistrationOnRaceLog(getFleetByName(toRaceColumn, toTriple.getC())); - try { + if (toRaceColumn.isCompetitorRegistrationInRacelogEnabled(toFleet)) { + toRaceColumn.registerCompetitors(competitorsToCopy, toFleet); + } else { + toRaceColumn.enableCompetitorRegistrationOnRaceLog(getFleetByName(toRaceColumn, toTriple.getC())); toRaceColumn.registerCompetitors(competitorsToCopy, getFleetByName(toRaceColumn, toTriple.getC())); - } catch (CompetitorRegistrationOnRaceLogDisabledException e1) { - //cannot happen } + } catch (CompetitorRegistrationOnRaceLogDisabledException e1) { + // cannot happen as we explicitly checked successfully before, or enabled it when the check failed; still produce a log documenting this strangeness: + logger.log(Level.WARNING, "Internal error: race column "+toRaceColumn.getName()+" does not accept competitor registration although it should", e1); } } } From bd8ba0ea2ccd6237a7274d6b267465bf19cc44b4 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 14 Jan 2016 14:58:24 +0100 Subject: [PATCH 093/165] (re-)created RaceLogTrackingAdapter.copyCompetitors and call it from SailingServiceImpl Change-Id: I8e860b8ca9cc82760068efa7d31d5a05594d778c --- .../RaceLogTrackingAdapter.java | 3 +++ .../impl/RaceLogTrackingAdapterImpl.java | 22 +++++++++++++++++++ .../gwt/ui/server/SailingServiceImpl.java | 17 ++++---------- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java index 6ea9b2e40a7..34ac3ed3411 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java @@ -25,6 +25,7 @@ import com.sap.sailing.domain.racelogtracking.impl.RaceLogRaceTracker; import com.sap.sailing.domain.tracking.RaceHandle; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.server.RacingEventService; +import com.sap.sse.common.Util.Pair; import com.sap.sse.common.mail.MailException; public interface RaceLogTrackingAdapter { @@ -101,4 +102,6 @@ public interface RaceLogTrackingAdapter { */ void copyCourse(RaceLog fromRaceLog, Set toRaceLogs, SharedDomainFactory baseDomainFactory, RacingEventService service); + + void copyCompetitors(RaceColumn fromRaceColumn, Fleet fromFleet, Iterable> toRaces); } diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java index fb6db3bc447..50bb1d417af 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java @@ -54,6 +54,7 @@ import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.base.impl.CourseDataImpl; import com.sap.sailing.domain.common.RegattaIdentifier; import com.sap.sailing.domain.common.abstractlog.NotRevokableException; +import com.sap.sailing.domain.common.racelog.tracking.CompetitorRegistrationOnRaceLogDisabledException; import com.sap.sailing.domain.common.racelog.tracking.DeviceMappingConstants; import com.sap.sailing.domain.common.racelog.tracking.NotDenotableForRaceLogTrackingException; import com.sap.sailing.domain.common.racelog.tracking.NotDenotedForRaceLogTrackingException; @@ -72,6 +73,7 @@ import com.sap.sailing.server.RacingEventService; import com.sap.sse.common.NoCorrespondingServiceRegisteredException; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; +import com.sap.sse.common.Util.Pair; import com.sap.sse.common.impl.MillisecondsTimePoint; import com.sap.sse.common.mail.MailException; import com.sap.sse.mail.MailService; @@ -262,6 +264,26 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter { } } + @Override + public void copyCompetitors(final RaceColumn fromRaceColumn, final Fleet fromFleet, final Iterable> toRaces) { + Iterable competitorsToCopy = fromRaceColumn.getAllCompetitors(fromFleet); + for (Pair toRace : toRaces) { + final RaceColumn toRaceColumn = toRace.getA(); + final Fleet toFleet = toRace.getB(); + try { + if (toRaceColumn.isCompetitorRegistrationInRacelogEnabled(toFleet)) { + toRaceColumn.registerCompetitors(competitorsToCopy, toFleet); + } else { + toRaceColumn.enableCompetitorRegistrationOnRaceLog(toFleet); + toRaceColumn.registerCompetitors(competitorsToCopy, toFleet); + } + } catch (CompetitorRegistrationOnRaceLogDisabledException e1) { + // cannot happen as we explicitly checked successfully before, or enabled it when the check failed; still produce a log documenting this strangeness: + logger.log(Level.WARNING, "Internal error: race column "+toRaceColumn.getName()+" does not accept competitor registration although it should", e1); + } + } + } + @FunctionalInterface private static interface DeviceMarkMappingEventFactory> { EventT createDeviceMarkMapping(DeviceIdentifier device, TimePoint timePoint); 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 bd790f168f0..1566f8d908d 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 @@ -5296,23 +5296,14 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S @Override public void copyCompetitorsToOtherRaceLogs(com.sap.sse.common.Util.Triple fromTriple, Set> toTriples) throws NotFoundException { - RaceColumn raceColumn = getRaceColumn(fromTriple.getA(), fromTriple.getB()); - Iterable competitorsToCopy = raceColumn.getAllCompetitors(getFleetByName(raceColumn, fromTriple.getC())); + final RaceColumn raceColumn = getRaceColumn(fromTriple.getA(), fromTriple.getB()); + final Set> toRaces = new HashSet<>(); for (com.sap.sse.common.Util.Triple toTriple : toTriples) { final RaceColumn toRaceColumn = getRaceColumn(toTriple.getA(), toTriple.getB()); final Fleet toFleet = getFleetByName(toRaceColumn, toTriple.getC()); - try { - if (toRaceColumn.isCompetitorRegistrationInRacelogEnabled(toFleet)) { - toRaceColumn.registerCompetitors(competitorsToCopy, toFleet); - } else { - toRaceColumn.enableCompetitorRegistrationOnRaceLog(getFleetByName(toRaceColumn, toTriple.getC())); - toRaceColumn.registerCompetitors(competitorsToCopy, getFleetByName(toRaceColumn, toTriple.getC())); - } - } catch (CompetitorRegistrationOnRaceLogDisabledException e1) { - // cannot happen as we explicitly checked successfully before, or enabled it when the check failed; still produce a log documenting this strangeness: - logger.log(Level.WARNING, "Internal error: race column "+toRaceColumn.getName()+" does not accept competitor registration although it should", e1); - } + toRaces.add(new Pair<>(toRaceColumn, toFleet)); } + getRaceLogTrackingAdapter().copyCompetitors(raceColumn, getFleetByName(raceColumn, fromTriple.getC()), toRaces); } private TypeBasedServiceFinder getDeviceIdentifierStringSerializerHandlerFinder( From 93a4f649be213b66d0f99041dc30749128330245 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 14 Jan 2016 16:21:03 +0100 Subject: [PATCH 094/165] added Javadoc, made implementation of updateStartEndEndOfTracking robust against open intervals / time ranges Change-Id: Ibfd34c42697409dd6ef78cf35ec6ca061b0803f7 --- .../impl/RaceLogRaceTracker.java | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java index 0c94ca999c6..794540094c2 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java @@ -248,29 +248,30 @@ public class RaceLogRaceTracker implements RaceTracker, GPSFixReceivedListener { if (trackingTimesFromRaceLog == null) { TimePoint earliestMappingStart = new MillisecondsTimePoint(Long.MAX_VALUE); TimePoint latestMappingEnd = new MillisecondsTimePoint(Long.MIN_VALUE); - for (List> list : competitorMappings.values()) { for (DeviceMapping mapping : list) { - if (mapping.getTimeRange().from().before(earliestMappingStart)) { + final TimePoint from = mapping.getTimeRange().from(); + if (from != null && mapping.getTimeRange().from().before(earliestMappingStart)) { earliestMappingStart = mapping.getTimeRange().from(); } - if (mapping.getTimeRange().to().after(latestMappingEnd)) { + final TimePoint to = mapping.getTimeRange().to(); + if (to != null && mapping.getTimeRange().to().after(latestMappingEnd)) { latestMappingEnd = mapping.getTimeRange().to(); } } } - for (List> list : markMappings.values()) { for (DeviceMapping mapping : list) { - if (mapping.getTimeRange().from().before(earliestMappingStart)) { + final TimePoint from = mapping.getTimeRange().from(); + if (from != null && from.before(earliestMappingStart)) { earliestMappingStart = mapping.getTimeRange().from(); } - if (mapping.getTimeRange().to().after(latestMappingEnd)) { + final TimePoint to = mapping.getTimeRange().to(); + if (to != null && to.after(latestMappingEnd)) { latestMappingEnd = mapping.getTimeRange().to(); } } } - trackedRace.setStartOfTrackingReceived(earliestMappingStart); trackedRace.setEndOfTrackingReceived(latestMappingEnd); } @@ -376,6 +377,16 @@ public class RaceLogRaceTracker implements RaceTracker, GPSFixReceivedListener { } } + /** + * Adjusts the {@link #competitorMappings} map according to the competitor registrations for the race managed by + * this tracked, either from the regatta log or the race log. + * + * @param loadIfNotCovered + * if true, the GPS fixes for the mappings will be loaded based on a comparison of the + * previous mappings from {@link #competitorMappings} and the new mappings. + * + * @throws DoesNotHaveRegattaLogException + */ private void updateCompetitorMappings(boolean loadIfNotCovered) throws DoesNotHaveRegattaLogException { // TODO remove fixes, if mappings have been removed From 06c6a783e785423ef21a20a85cc28578f437e21f Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 14 Jan 2016 16:29:46 +0100 Subject: [PATCH 095/165] adjusted updateStartAndEndOfTracking such that open intervals lead to the start/end of tracking to be the beginning/end of time Change-Id: I6138d7c138962194df83b44f22db3c9d19ea5772 --- .../impl/RaceLogRaceTracker.java | 45 +++++++++++-------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java index 794540094c2..b99398e2be3 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java @@ -250,33 +250,39 @@ public class RaceLogRaceTracker implements RaceTracker, GPSFixReceivedListener { TimePoint latestMappingEnd = new MillisecondsTimePoint(Long.MIN_VALUE); for (List> list : competitorMappings.values()) { for (DeviceMapping mapping : list) { - final TimePoint from = mapping.getTimeRange().from(); - if (from != null && mapping.getTimeRange().from().before(earliestMappingStart)) { - earliestMappingStart = mapping.getTimeRange().from(); - } - final TimePoint to = mapping.getTimeRange().to(); - if (to != null && mapping.getTimeRange().to().after(latestMappingEnd)) { - latestMappingEnd = mapping.getTimeRange().to(); - } + earliestMappingStart = getUpdatedEarliestMappingStart(earliestMappingStart, mapping.getTimeRange().from()); + latestMappingEnd = getUpdatedLatestMappingEnd(latestMappingEnd, mapping.getTimeRange().to()); } } for (List> list : markMappings.values()) { for (DeviceMapping mapping : list) { - final TimePoint from = mapping.getTimeRange().from(); - if (from != null && from.before(earliestMappingStart)) { - earliestMappingStart = mapping.getTimeRange().from(); - } - final TimePoint to = mapping.getTimeRange().to(); - if (to != null && to.after(latestMappingEnd)) { - latestMappingEnd = mapping.getTimeRange().to(); - } + earliestMappingStart = getUpdatedEarliestMappingStart(earliestMappingStart, mapping.getTimeRange().from()); + latestMappingEnd = getUpdatedLatestMappingEnd(latestMappingEnd, mapping.getTimeRange().to()); } } - trackedRace.setStartOfTrackingReceived(earliestMappingStart); - trackedRace.setEndOfTrackingReceived(latestMappingEnd); + trackedRace.setStartOfTrackingReceived(earliestMappingStart == null ? TimePoint.BeginningOfTime : earliestMappingStart); + trackedRace.setEndOfTrackingReceived(latestMappingEnd == null ? TimePoint.EndOfTime : latestMappingEnd); } } + private TimePoint getUpdatedEarliestMappingStart(TimePoint earliestMappingStart, final TimePoint from) { + if (from == null) { + earliestMappingStart = null; // no further updates; one open interval means startOfTracking shall be the beginning of time + } else if (earliestMappingStart != null && from.before(earliestMappingStart)) { + earliestMappingStart = from; + } + return earliestMappingStart; + } + + private TimePoint getUpdatedLatestMappingEnd(TimePoint latestMappingEnd, final TimePoint to) { + if (to == null) { + latestMappingEnd = null; // no further updates; one open interval means startOfTracking shall be the beginning of time + } else if (latestMappingEnd != null && to.after(latestMappingEnd)) { + latestMappingEnd = to; + } + return latestMappingEnd; + } + private boolean hasMappingAlreadyBeenLoaded( DeviceMapping newMapping, List> oldMappings) { if (oldMappings == null) { @@ -379,7 +385,8 @@ public class RaceLogRaceTracker implements RaceTracker, GPSFixReceivedListener { /** * Adjusts the {@link #competitorMappings} map according to the competitor registrations for the race managed by - * this tracked, either from the regatta log or the race log. + * this tracked, either from the regatta log or the race log. Then, the {@link TrackedRace}'s start and end of + * tracking time frame is updated from the mapping intervals. * * @param loadIfNotCovered * if true, the GPS fixes for the mappings will be loaded based on a comparison of the From 6795767e2abb8c92c651c1f2bbc16c5d0d5217a1 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 14 Jan 2016 16:34:29 +0100 Subject: [PATCH 096/165] renamed getMapping to createMapping Change-Id: Ic25ab6131381ad762df2457d3d64a20e6503157b --- .../impl/RegattaLogDeviceMappingFinder.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceMappingFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceMappingFinder.java index 25f2a087686..fe97001f674 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceMappingFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceMappingFinder.java @@ -45,7 +45,7 @@ public class RegattaLogDeviceMappingFinder extends Regatta return mapping instanceof RegattaLogDeviceMappingEvent; } - protected DeviceMapping getMapping(DeviceIdentifier device, ItemT item, + protected DeviceMapping createMapping(DeviceIdentifier device, ItemT item, TimePoint from, TimePoint to, Serializable originalEventId) { return new DeviceMappingImpl(item, device, new TimeRangeImpl(from, to), Collections.singletonList(originalEventId)); @@ -87,18 +87,19 @@ public class RegattaLogDeviceMappingFinder extends Regatta private List> closeOpenRanges(List> events, ItemT item, Map closingEvents) { List> result = new ArrayList>(); - - for (RegattaLogDeviceMappingEvent event : events) { + for (RegattaLogDeviceMappingEvent event : events) { TimePoint from = event.getFrom(); TimePoint to = event.getTo(); - TimePoint closingTimePoint = closingEvents.containsKey(event.getId()) ? - closingEvents.get(event.getId()).getClosingTimePoint() : null; - if (from == null) logger.severe("No start time set for DeviceMappingEvent with ID: "+event.getId()); - if (to == null) to = closingTimePoint; - - result.add(getMapping(event.getDevice(), item, from, to, event.getId())); + TimePoint closingTimePoint = closingEvents.containsKey(event.getId()) ? closingEvents.get(event.getId()) + .getClosingTimePoint() : null; + if (from == null) { + logger.severe("No start time set for DeviceMappingEvent with ID: " + event.getId()); + } + if (to == null) { + to = closingTimePoint; + } + result.add(createMapping(event.getDevice(), item, from, to, event.getId())); } - return result; } } From b45b2ffab09c86d5cb197643d11d348ab8785fd3 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 14 Jan 2016 16:54:12 +0100 Subject: [PATCH 097/165] whtitespace and formatting changes only Change-Id: I8075e648af46f86d826ab5e35d6ff21d914dc74e --- .../impl/RegattaLogDeviceMappingFinder.java | 2 -- .../jaxrs/api/LeaderboardsResource.java | 21 ++++--------------- 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceMappingFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceMappingFinder.java index fe97001f674..635e7212c7d 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceMappingFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceMappingFinder.java @@ -76,11 +76,9 @@ public class RegattaLogDeviceMappingFinder extends Regatta closingEvents.put(closingEvent.getDeviceMappingEventId(), closingEvent); } } - for (ItemT item : events.keySet()) { mappings.put(item, closeOpenRanges(events.get(item), item, closingEvents)); } - return mappings; } diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java index cf3c0e1020b..507f17249ef 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java @@ -381,7 +381,7 @@ public class LeaderboardsResource extends AbstractSailingServerResource { return Response.status(Status.BAD_REQUEST).entity("Invalid JSON body in request") .type(MediaType.TEXT_PLAIN).build(); } - TimePoint now = MillisecondsTimePoint.now(); + final TimePoint now = MillisecondsTimePoint.now(); String competitorId = (String) requestObject.get(DeviceMappingConstants.JSON_COMPETITOR_ID_AS_STRING); String deviceUuid = (String) requestObject.get(DeviceMappingConstants.JSON_DEVICE_UUID); Long fromMillis = (Long) requestObject.get(DeviceMappingConstants.JSON_FROM_MILLIS); @@ -414,7 +414,7 @@ public class LeaderboardsResource extends AbstractSailingServerResource { DeviceIdentifier device = new SmartphoneUUIDIdentifierImpl(UUID.fromString(deviceUuid)); TimePoint from = new MillisecondsTimePoint(fromMillis); event = new RegattaLogDeviceCompetitorMappingEventImpl(now, now, author, UUID.randomUUID(), mappedTo, device, - from, null); + from, /* to */ null); hasRegattaLike.getRegattaLike().getRegattaLog().add(event); logger.fine("Successfully checked in competitor " + mappedTo.getName()); return Response.status(Status.OK).build(); @@ -439,21 +439,16 @@ public class LeaderboardsResource extends AbstractSailingServerResource { @Path("{name}/device_mappings/end") public Response postCheckout(String json, @PathParam("name") String leaderboardName) { Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName); - if (!leaderboardIsValid(leaderboard)) { logger.warning("Leaderboard does not exist or does not hold a RegattaLog"); return Response.status(Status.INTERNAL_SERVER_ERROR) .entity("Leaderboard does not exist or does not hold a RegattaLog").type(MediaType.TEXT_PLAIN) .build(); } - IsRegattaLike isRegattaLike = ((HasRegattaLike) leaderboard).getRegattaLike(); - AbstractLogEventAuthor author = new LogEventAuthorImpl(AbstractLogEventAuthor.NAME_COMPATIBILITY, AbstractLogEventAuthor.PRIORITY_COMPATIBILITY); - - TimePoint now = MillisecondsTimePoint.now(); - + final TimePoint now = MillisecondsTimePoint.now(); logger.fine("Post issued to " + this.getClass().getName()); Object requestBody; JSONObject requestObject; @@ -465,40 +460,32 @@ public class LeaderboardsResource extends AbstractSailingServerResource { return Response.status(Status.BAD_REQUEST).entity("Invalid JSON body in request") .type(MediaType.TEXT_PLAIN).build(); } - logger.fine("JSON requestObject is: " + requestObject.toString()); Long toMillis = (Long) requestObject.get("toMillis"); String competitorId = (String) requestObject.get("competitorId"); String deviceUuid = (String) requestObject.get("deviceUuid"); TimePoint closingTimePoint = new MillisecondsTimePoint(toMillis); - if (toMillis == null || deviceUuid == null || closingTimePoint == null) { logger.warning("Invalid JSON body in request"); return Response.status(Status.BAD_REQUEST).entity("Invalid JSON body in request") .type(MediaType.TEXT_PLAIN).build(); } - Competitor mappedTo = getService().getCompetitorStore().getExistingCompetitorByIdAsString(competitorId); if (mappedTo == null) { logger.warning("No competitor found for id " + competitorId); return Response.status(Status.BAD_REQUEST).entity("No competitor found for id " + competitorId) .type(MediaType.TEXT_PLAIN).build(); } - - OpenEndedDeviceMappingFinder finder = new OpenEndedDeviceMappingFinder(isRegattaLike.getRegattaLog(), mappedTo, - deviceUuid); + OpenEndedDeviceMappingFinder finder = new OpenEndedDeviceMappingFinder(isRegattaLike.getRegattaLog(), mappedTo, deviceUuid); Serializable deviceMappingEventId = finder.analyze(); - if (deviceMappingEventId == null) { logger.warning("No corresponding open competitor to device mapping has been found"); return Response.status(Status.BAD_REQUEST) .entity("No corresponding open competitor to device mapping has been found") .type(MediaType.TEXT_PLAIN).build(); } - RegattaLogCloseOpenEndedDeviceMappingEventImpl event = new RegattaLogCloseOpenEndedDeviceMappingEventImpl(now, author, deviceMappingEventId, closingTimePoint); - isRegattaLike.getRegattaLog().add(event); logger.fine("Successfully checked out competitor " + mappedTo.getName()); return Response.status(Status.OK).build(); From 19adb0a7eb22e92f4e728ceab4407eb2b21e6776 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 14 Jan 2016 16:57:44 +0100 Subject: [PATCH 098/165] improved Javadocs Change-Id: I080a03728f304b61059234442377f4765e53e550 --- .../racelogtracking/impl/RaceLogRaceTracker.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java index b99398e2be3..ef560d210fc 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java @@ -315,6 +315,15 @@ public class RaceLogRaceTracker implements RaceTracker, GPSFixReceivedListener { return result; } + /** + * Adjusts the contents of {@link #markMappings} according to the device mappings for marks found in the regatta + * log. Afterwards, the start end end of tracking is {@link #updateStartAndEndOfTracking() updated}. + * + * @param loadIfNotCovered + * If true, for additional time ranges added compared to the previous contents of + * {@link #markMappings}, their fixes are loaded from the {@link #gpsFixStore}. + * @throws DoesNotHaveRegattaLogException + */ private void updateMarkMappings(boolean loadIfNotCovered) throws DoesNotHaveRegattaLogException { assert trackedRace != null; // TODO remove fixes, if mappings have been removed @@ -386,7 +395,7 @@ public class RaceLogRaceTracker implements RaceTracker, GPSFixReceivedListener { /** * Adjusts the {@link #competitorMappings} map according to the competitor registrations for the race managed by * this tracked, either from the regatta log or the race log. Then, the {@link TrackedRace}'s start and end of - * tracking time frame is updated from the mapping intervals. + * tracking time frame is {@link #updateStartAndEndOfTracking() updated} from the mapping intervals. * * @param loadIfNotCovered * if true, the GPS fixes for the mappings will be loaded based on a comparison of the From 8c06b43e18775af6b9234acc06fc0ac5c4a60422 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 14 Jan 2016 17:03:51 +0100 Subject: [PATCH 099/165] replaced sizeOf(...)>0 by calls to !Util.isEmpty Change-Id: I3b97f34559f3aa471c8fdb8c16512c1ecec2aecc --- .../impl/RaceLogTrackingAdapterImpl.java | 24 ++++--------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java index 50bb1d417af..1222d92f235 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java @@ -2,10 +2,8 @@ package com.sap.sailing.domain.racelogtracking.impl; import java.io.IOException; import java.io.InputStream; -import java.util.Collection; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.Locale; import java.util.Map.Entry; import java.util.Set; @@ -148,11 +146,11 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter { RegattaLeaderboard rLeaderboard = (RegattaLeaderboard) leaderboard; boatClass = rLeaderboard.getRegatta().getBoatClass(); } else { - if (sizeOf(raceColumn.getAllCompetitors(fleet)) > 0){ + if (!Util.isEmpty(raceColumn.getAllCompetitors(fleet))) { boatClass = findDominatingBoatClass(raceColumn.getAllCompetitors(fleet)); - } else if (sizeOf(raceColumn.getAllCompetitors()) > 0){ + } else if (!Util.isEmpty(raceColumn.getAllCompetitors())) { boatClass = findDominatingBoatClass(raceColumn.getAllCompetitors()); - } else if (sizeOf(leaderboard.getAllCompetitors()) > 0){ + } else if (!Util.isEmpty(leaderboard.getAllCompetitors())) { boatClass = findDominatingBoatClass(leaderboard.getAllCompetitors()); } else { throw new NotDenotableForRaceLogTrackingException("Couldn't infer boat class, no competitors on race and leaderboard"); @@ -176,21 +174,7 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter { raceLog.add(event); } - private int sizeOf(Iterable values) { - if (values instanceof Collection) { - return ((Collection)values).size(); - } else { - Iterator it = values.iterator(); - int sum = 0; - while (it.hasNext()) { - it.next(); - sum++; - } - return sum; - } - } - - //implemented somewhere in domainFactory? + // implemented somewhere in domainFactory? private BoatClass findDominatingBoatClass(Iterable allCompetitors) { HashMap occurenceCount = new HashMap<>(); for (Competitor competitor : allCompetitors) { From 1fd73439ef2dd67e2b2e0a47cff753db79d10d77 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 14 Jan 2016 17:07:45 +0100 Subject: [PATCH 100/165] let NotDenotableForRaceLogTrackingException trickle up as it was declared on RaceLogTrackingAdapterImpl.denoteAllRacesForRaceLogTracking anyhow Change-Id: I083a9631c82e44c300955ff017bc9834c41ee542 --- .../impl/RaceLogTrackingAdapterImpl.java | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java index 1222d92f235..5fa55d8bc43 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java @@ -140,7 +140,6 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter { @Override public void denoteRaceForRaceLogTracking(RacingEventService service, Leaderboard leaderboard, RaceColumn raceColumn, Fleet fleet, String raceName) throws NotDenotableForRaceLogTrackingException { - BoatClass boatClass = null; if (leaderboard instanceof RegattaLeaderboard) { RegattaLeaderboard rLeaderboard = (RegattaLeaderboard) leaderboard; @@ -155,20 +154,15 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter { } else { throw new NotDenotableForRaceLogTrackingException("Couldn't infer boat class, no competitors on race and leaderboard"); } - } - if (raceName == null) { raceName = leaderboard.getName() + " " + raceColumn.getName() + " " + fleet.getName(); } - RaceLog raceLog = raceColumn.getRaceLog(fleet); assert raceLog != null : new NotDenotableForRaceLogTrackingException("No RaceLog found in place"); - if (new RaceLogTrackingStateAnalyzer(raceLog).analyze().isForTracking()) { throw new NotDenotableForRaceLogTrackingException("Already denoted for tracking"); } - RaceLogEvent event = new RaceLogDenoteForTrackingEventImpl(MillisecondsTimePoint.now(), service.getServerAuthor(), raceLog.getCurrentPassId(), raceName, boatClass, UUID.randomUUID()); raceLog.add(event); @@ -201,10 +195,7 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter { throws NotDenotableForRaceLogTrackingException { for (RaceColumn column : leaderboard.getRaceColumns()) { for (Fleet fleet : column.getFleets()) { - try { - denoteRaceForRaceLogTracking(service, leaderboard, column, fleet, null); - } catch (NotDenotableForRaceLogTrackingException e) { - } + denoteRaceForRaceLogTracking(service, leaderboard, column, fleet, null); } } } From 4014d8af2aa6e2d7661bbe4b5478447bb44ab51c Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 15 Jan 2016 09:35:40 +0100 Subject: [PATCH 101/165] removing unused RaceLog parameter from RacingEventService.getMarkPosition and updating Javadoc accordingly Change-Id: Idd8355039a22b0e52078db8935fa92d2fb911ed0 --- .../sailing/gwt/ui/server/SailingServiceImpl.java | 4 ++-- .../gateway/jaxrs/api/LeaderboardsResource.java | 7 ++----- .../com/sap/sailing/server/RacingEventService.java | 13 +++++-------- .../sailing/server/impl/RacingEventServiceImpl.java | 7 +++---- 4 files changed, 12 insertions(+), 19 deletions(-) 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 1566f8d908d..12464598135 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 @@ -5149,7 +5149,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S */ private MarkDTO convertToMarkDTO(LeaderboardThatHasRegattaLike leaderboard, Mark mark) { final TimePoint now = MillisecondsTimePoint.now(); - final Position lastPos = getService().getMarkPosition(mark, leaderboard, now, null); + final Position lastPos = getService().getMarkPosition(mark, leaderboard, now); return convertToMarkDTO(mark, lastPos); } @@ -5265,7 +5265,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S return convertToRaceCourseDTO(lastPublishedCourse, new MarkPositionFinder() { @Override public Position find(Mark mark, TimePoint at) { - return getService().getMarkPosition(mark, (LeaderboardThatHasRegattaLike) getService().getLeaderboardByName(leaderboardName), at, raceLog); + return getService().getMarkPosition(mark, (LeaderboardThatHasRegattaLike) getService().getLeaderboardByName(leaderboardName), at); } }, /* timePoint */ MillisecondsTimePoint.now()); } diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java index 507f17249ef..472aa62e147 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java @@ -578,8 +578,7 @@ public class LeaderboardsResource extends AbstractSailingServerResource { for (Mark mark : marks) { final TimePoint now = MillisecondsTimePoint.now(); Position lastKnownPosition = getService().getMarkPosition(mark, - (LeaderboardThatHasRegattaLike) leaderboard, now, - /* raceLog==null means use all race logs */null); + (LeaderboardThatHasRegattaLike) leaderboard, now); array.add(markWithPositionSerializer.serialize(new Pair<>(mark, lastKnownPosition))); } JSONObject result = new JSONObject(); @@ -637,9 +636,7 @@ public class LeaderboardsResource extends AbstractSailingServerResource { .type(MediaType.TEXT_PLAIN).build(); } TimePoint now = MillisecondsTimePoint.now(); - Position lastKnownPosition = getService().getMarkPosition(mark, (LeaderboardThatHasRegattaLike) leaderboard, - now, - /* raceLog==null means use all race logs */null); + Position lastKnownPosition = getService().getMarkPosition(mark, (LeaderboardThatHasRegattaLike) leaderboard, now); GPSFix fix = null; try { Object requestBody = JSONValue.parseWithException(json); diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java index 17a03a3bf9b..1371b31121e 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java @@ -135,20 +135,17 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch Leaderboard getLeaderboardByName(String name); /** - * Looks at the mark tracks in the tracked races attached to the leaderboard. If it doesn't find a + * Looks at the mark tracks in the tracked races attached to the leaderboard and tries to find a * track for the mark requested there which has fixes before and after timePoint (to - * ensure that no track cropping has taken place, removing the fixes for the interesting time period), looks in the - * leaderboard's regatta log and the specific raceLog (if provided) or all race logs attached to the - * leaderboard (if not provided) for device mappings for the mark and tries to load fixes from the - * {@link GPSFixStore}. The latter is only necessary if the mark isn't found in any tracked race with fixes - * surrounding timePoint because should there be a tracked race in the leaderboard that has the mark - * then it will also have received the fixes from the {@link GPSFixStore} through the regatta log mapping. + * ensure that no track cropping has taken place, removing the fixes for the interesting time period). Note, that + * no lookup is performed in the {@link RegattaLog} of the {@code leaderboard}, so mark pings that have not yet + * been applied to a {@link TrackedRace} will not be considered by this method. *

    * * @return the position obtained by interpolation but never extrapolation from the track identified as described * above */ - Position getMarkPosition(Mark mark, LeaderboardThatHasRegattaLike leaderboard, TimePoint timePoint, RaceLog raceLog); + Position getMarkPosition(Mark mark, LeaderboardThatHasRegattaLike leaderboard, TimePoint timePoint); /** * Stops tracking all races of the regatta specified. This will also stop tracking wind for all races of this regatta. diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java index 54db77441ce..50f420b02eb 100644 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java @@ -1057,7 +1057,7 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes } @Override - public Position getMarkPosition(Mark mark, LeaderboardThatHasRegattaLike leaderboard, TimePoint timePoint, RaceLog raceLog) { + public Position getMarkPosition(Mark mark, LeaderboardThatHasRegattaLike leaderboard, TimePoint timePoint) { GPSFixTrack track = null; // If no spanning track is found, the fix closest to the time point requested is used instead GPSFix nonSpanningFallback = null; @@ -1072,9 +1072,8 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes } } } - - Position result; - if (track != null){ + final Position result; + if (track != null) { result = track.getEstimatedPosition(timePoint, /* extrapolate */ false); } else { result = nonSpanningFallback == null ? null : nonSpanningFallback.getPosition(); From d7e8d4d5f8b977ecaace021b4d5715947c4144a4 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 15 Jan 2016 09:38:56 +0100 Subject: [PATCH 102/165] removed the unused class LastPingMappingEventFinder Change-Id: Ie9bcd796c58da105ad5ab8b1df7e10b5beb65246 --- .../impl/LastPingMappingEventFinder.java | 32 ------------------- 1 file changed, 32 deletions(-) delete mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/LastPingMappingEventFinder.java diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/LastPingMappingEventFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/LastPingMappingEventFinder.java deleted file mode 100644 index e347dc02eca..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/LastPingMappingEventFinder.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl; - -import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; -import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; -import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMappingEvent; -import com.sap.sse.common.WithID; - -public class LastPingMappingEventFinder extends RegattaLogAnalyzer> { - private final WithID item; - - public LastPingMappingEventFinder(RegattaLog log, WithID forItem) { - super(log); - this.item = forItem; - } - - @Override - protected RegattaLogDeviceMappingEvent performAnalysis() { - for (RegattaLogEvent e : getLog().getUnrevokedEventsDescending()) { - if (e instanceof RegattaLogDeviceMappingEvent) { - RegattaLogDeviceMappingEvent mappingEvent = (RegattaLogDeviceMappingEvent) e; - if (item.equals(mappingEvent.getMappedTo()) && mappingEvent.getFrom() != null && - mappingEvent.getTo() != null && mappingEvent.getFrom().equals(mappingEvent.getTo())) { - @SuppressWarnings("unchecked") - RegattaLogDeviceMappingEvent cast = (RegattaLogDeviceMappingEvent) mappingEvent; - return cast; - } - } - } - return null; - } - -} From 575fe2c71a4626c0eb1ad6a1ff7fb478d3b245aa Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 15 Jan 2016 09:57:33 +0100 Subject: [PATCH 103/165] restored Javadoc comment for pingMark which was lost in commit 966b17b178b2a065471a3648a88a84e28cac83f1 Change-Id: Ib1e6085b7b2a4147cae6b36537380cc1cd8e47fa --- .../sailing/domain/racelogtracking/RaceLogTrackingAdapter.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java index 34ac3ed3411..525379b7b7d 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java @@ -76,7 +76,8 @@ public interface RaceLogTrackingAdapter { throws NotDenotableForRaceLogTrackingException; /** - * @see #pingMark(RaceLog, Mark, GPSFix, RacingEventService) + * Add a fix to the {@link GPSFixStore}, and create a mapping with a virtual device for exactly that time point + * in the {@code regattaLogToAddTo}, mapping the virtual device to the {@code mark}. */ void pingMark(RegattaLog regattaLogToAddTo, Mark mark, GPSFix gpsFix, RacingEventService service); From f042f5e4f0ada74f06eb8b2aa3383b9463caeef6 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 15 Jan 2016 10:03:13 +0100 Subject: [PATCH 104/165] simplified pingMark implementation in RaceLogTrackingAdapterImpl, as marks can only be pinged in RegattaLogs now Change-Id: I5418a24f1c803631e8f0062a2f6440d026d513f8 --- .../impl/RaceLogTrackingAdapterImpl.java | 30 ++++--------------- 1 file changed, 6 insertions(+), 24 deletions(-) diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java index 5fa55d8bc43..4264c079be5 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java @@ -22,8 +22,6 @@ import javax.mail.util.ByteArrayDataSource; import org.osgi.framework.ServiceReference; import com.google.zxing.WriterException; -import com.sap.sailing.domain.abstractlog.AbstractLog; -import com.sap.sailing.domain.abstractlog.AbstractLogEvent; import com.sap.sailing.domain.abstractlog.impl.LastEventOfTypeFinder; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; @@ -36,7 +34,6 @@ import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDenoteForTra import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogStartTrackingEventImpl; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; -import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceMarkMappingEventImpl; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; @@ -62,7 +59,6 @@ import com.sap.sailing.domain.common.racelog.tracking.TransformationException; import com.sap.sailing.domain.common.tracking.GPSFix; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.RegattaLeaderboard; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.racelogtracking.PingDeviceIdentifierImpl; import com.sap.sailing.domain.racelogtracking.RaceLogTrackingAdapter; import com.sap.sailing.domain.tracking.RaceHandle; @@ -259,16 +255,12 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter { } } - @FunctionalInterface - private static interface DeviceMarkMappingEventFactory> { - EventT createDeviceMarkMapping(DeviceIdentifier device, TimePoint timePoint); - } - - private , LogT extends AbstractLog> void pingMark( - LogT log, Mark mark, GPSFix gpsFix, RacingEventService service, - DeviceMarkMappingEventFactory factory, DeviceIdentifier device) { - TimePoint time = gpsFix.getTimePoint(); - EventT mapping = factory.createDeviceMarkMapping(device, time); + @Override + public void pingMark(RegattaLog log, Mark mark, GPSFix gpsFix, RacingEventService service) { + final PingDeviceIdentifierImpl device = new PingDeviceIdentifierImpl(); + final TimePoint timePoint = gpsFix.getTimePoint(); + final RegattaLogEvent mapping = new RegattaLogDeviceMarkMappingEventImpl(timePoint, + timePoint, service.getServerAuthor(), UUID.randomUUID(), mark, device, timePoint, timePoint); log.add(mapping); try { service.getGPSFixStore().storeFix(device, gpsFix); @@ -277,16 +269,6 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter { } } - @Override - public void pingMark(RegattaLog regattaLog, Mark mark, GPSFix gpsFix, RacingEventService service) { - DeviceMarkMappingEventFactory regattaLogEventFactory = - (DeviceIdentifier dev, TimePoint timePoint) -> new RegattaLogDeviceMarkMappingEventImpl(timePoint, - timePoint, service.getServerAuthor(), UUID.randomUUID(), mark, dev, timePoint, timePoint); - pingMark(regattaLog, mark, gpsFix, service, - regattaLogEventFactory, - new PingDeviceIdentifierImpl()); - } - @Override public void removeDenotationForRaceLogTracking(RacingEventService service, RaceLog raceLog) { RaceLogEvent denoteForTrackingEvent = new LastEventOfTypeFinder<>(raceLog, true, From 4d0fb5f8653fa66e36dbfaf21fcc974531816081 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 15 Jan 2016 12:18:48 +0100 Subject: [PATCH 105/165] don't create artificial "anti-creep" mark fixes anymore; see bug 3421 and bug 3422 about abandoning interpolation on mark tracks Change-Id: I38cba61bbc004ca028c6d87adc7507ac9c1db4fc --- .../jaxrs/api/LeaderboardsResource.java | 66 +++++-------------- .../server/impl/RacingEventServiceImpl.java | 2 +- 2 files changed, 19 insertions(+), 49 deletions(-) diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java index 472aa62e147..04bdce27db9 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java @@ -47,7 +47,6 @@ import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.base.Nationality; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.Waypoint; -import com.sap.sailing.domain.common.Distance; import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.NoWindException; import com.sap.sailing.domain.common.Position; @@ -59,7 +58,6 @@ import com.sap.sailing.domain.common.dto.LeaderboardRowDTO; import com.sap.sailing.domain.common.dto.RaceColumnDTO; import com.sap.sailing.domain.common.racelog.RaceLogServletConstants; import com.sap.sailing.domain.common.racelog.tracking.DeviceMappingConstants; -import com.sap.sailing.domain.common.racelog.tracking.TransformationException; import com.sap.sailing.domain.common.tracking.GPSFix; import com.sap.sailing.domain.common.tracking.impl.GPSFixImpl; import com.sap.sailing.domain.leaderboard.Leaderboard; @@ -73,8 +71,6 @@ import com.sap.sailing.domain.regattalike.IsRegattaLike; import com.sap.sailing.domain.regattalike.LeaderboardThatHasRegattaLike; import com.sap.sailing.domain.tracking.MarkPassing; import com.sap.sailing.domain.tracking.TrackedRace; -import com.sap.sailing.domain.tracking.impl.DynamicGPSFixTrackImpl; -import com.sap.sailing.domain.tracking.impl.GPSFixTrackImpl; import com.sap.sailing.server.RacingEventService; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; import com.sap.sailing.server.gateway.deserialization.impl.FlatGPSFixJsonDeserializer; @@ -83,8 +79,6 @@ import com.sap.sailing.server.gateway.jaxrs.AbstractSailingServerResource; import com.sap.sailing.server.gateway.serialization.coursedata.impl.MarkJsonSerializer; import com.sap.sailing.server.gateway.serialization.impl.FlatGPSFixJsonSerializer; import com.sap.sailing.server.gateway.serialization.impl.MarkJsonSerializerWithPosition; -import com.sap.sse.common.Duration; -import com.sap.sse.common.NoCorrespondingServiceRegisteredException; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.Util.Pair; @@ -599,28 +593,27 @@ public class LeaderboardsResource extends AbstractSailingServerResource { return getService(RaceLogTrackingAdapterFactory.class).getAdapter(getService().getBaseDomainFactory()); } + /** + * Expects one GPS Fix in the format understood by {@link #fixDeserializer} in the POST message body, parses that fix, + * adds the fix to the {@link RacingEventService#getGPSFixStore() GPSFixStore} and creates mappings for each fix in the RegattaLog. + * If the mark's position for the current server time can be determined from the {@link TrackedRace}s attached to the leaderboard, + * that position is returned, serialized by {@link #fixSerializer}. Note that with this is may be possible that there is currently + * no {@link TrackedRace} accepting the ping fix, hence causing no result to be returned, or a position from another + * {@link TrackedRace}, e.g., from the past, that has not accepted the ping fix. + */ @POST @Path("{leaderboardName}/marks/{markId}/gps_fixes") @Consumes(MediaType.APPLICATION_JSON) - /** - * Add the fixes to the GPSFixStore and create mappings for each fix in the RegattaLog. - * @param json - * @param leaderboardName - * @param markId - * @return - * @throws HTTPException - */ public Response pingMark(String json, @PathParam("leaderboardName") String leaderboardName, @PathParam("markId") String markId) throws HTTPException { logger.fine("Post issued to " + this.getClass().getName()); - + final RacingEventService service = getService(); Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName); if (leaderboard == null) { return Response.status(Status.NOT_FOUND) .entity("Could not find a leaderboard with name '" + StringEscapeUtils.escapeHtml(leaderboardName) + "'.") .type(MediaType.TEXT_PLAIN).build(); } - RegattaLog regattaLog = null; if (leaderboard instanceof HasRegattaLike) { regattaLog = ((HasRegattaLike) leaderboard).getRegattaLike().getRegattaLog(); @@ -629,15 +622,14 @@ public class LeaderboardsResource extends AbstractSailingServerResource { .entity("Leaderboard '" + StringEscapeUtils.escapeHtml(leaderboardName) + "' does not have an attached RegattaLog.") .type(MediaType.TEXT_PLAIN).build(); } - - Mark mark = getService().getBaseDomainFactory().getExistingMarkByIdAsString(markId); + final Mark mark = service.getBaseDomainFactory().getExistingMarkByIdAsString(markId); if (mark == null) { return Response.status(Status.NOT_FOUND).entity("Could not find a mark with ID '" + StringEscapeUtils.escapeHtml(markId) + "'.") .type(MediaType.TEXT_PLAIN).build(); } - TimePoint now = MillisecondsTimePoint.now(); - Position lastKnownPosition = getService().getMarkPosition(mark, (LeaderboardThatHasRegattaLike) leaderboard, now); - GPSFix fix = null; + final TimePoint now = MillisecondsTimePoint.now(); + // grab the position as found in TrackedRaces attached to the leaderboard + final GPSFix fix; try { Object requestBody = JSONValue.parseWithException(json); JSONObject requestObject = Helpers.toJSONObjectSafe(requestBody); @@ -648,35 +640,13 @@ public class LeaderboardsResource extends AbstractSailingServerResource { return Response.status(Status.BAD_REQUEST).entity("Invalid JSON body in request") .type(MediaType.TEXT_PLAIN).build(); } - RaceLogTrackingAdapter adapter = getRaceLogTrackingAdapter(); - RacingEventService service = getService(); - try { - if (lastKnownPosition == null) { - // Look into GPSFixStore - DynamicGPSFixTrackImpl loadedTrack = new DynamicGPSFixTrackImpl(mark, 0); - getService().getGPSFixStore().loadMarkTrack(loadedTrack, regattaLog, mark); - lastKnownPosition = loadedTrack.getEstimatedPosition(now, /* extrapolate */ false); - } - - if (lastKnownPosition != null) { - // ping again to avoid interpolation, avoid filtering by paying attention to maxSpeedForSmoothing - final Distance distance = lastKnownPosition.getDistance(fix.getPosition()); - final Duration minDuration = GPSFixTrackImpl.getDefaultMaxSpeedForSmoothing().getDuration(distance); - final GPSFix repeatedFixAvoidingCreepingMark = new GPSFixImpl(lastKnownPosition, fix.getTimePoint() - .minus(minDuration)); - adapter.pingMark(regattaLog, mark, repeatedFixAvoidingCreepingMark, service); - } - adapter.pingMark(regattaLog, mark, fix, service); - logger.log(Level.INFO, "Pinged mark " + mark.getName()); - } catch (NoCorrespondingServiceRegisteredException e) { - logger.log(Level.WARNING, "Could not ping mark " + mark.getName()); - } catch (TransformationException e) { - logger.log(Level.WARNING, "Could not ping mark " + mark.getName()); - } + final RaceLogTrackingAdapter adapter = getRaceLogTrackingAdapter(); + adapter.pingMark(regattaLog, mark, fix, service); + final Position lastKnownPosition = service.getMarkPosition(mark, (LeaderboardThatHasRegattaLike) leaderboard, now); if (lastKnownPosition != null) { - JSONObject lastKnownFixJson = fixSerializer.serialize(new GPSFixImpl(lastKnownPosition, now)); - String fixJson = lastKnownFixJson.toJSONString(); + final JSONObject lastKnownFixJson = fixSerializer.serialize(new GPSFixImpl(lastKnownPosition, now)); + final String fixJson = lastKnownFixJson.toJSONString(); return Response.ok(fixJson, MediaType.APPLICATION_JSON).build(); } else { return Response.ok().build(); diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java index 50f420b02eb..b6e76088021 100644 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java @@ -1062,7 +1062,7 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes // If no spanning track is found, the fix closest to the time point requested is used instead GPSFix nonSpanningFallback = null; for (TrackedRace trackedRace : leaderboard.getTrackedRaces()) { - GPSFixTrack trackCandidate = trackedRace.getTrack(mark); + final GPSFixTrack trackCandidate = trackedRace.getTrack(mark); if (trackCandidate != null) { if (spansTimePoint(trackCandidate, timePoint)) { track = trackCandidate; From c616e0181d741127ea78a4a0b4fbe9a4fb03e8c9 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 15 Jan 2016 13:51:32 +0100 Subject: [PATCH 106/165] made showOnlyCompetitorsOfLog protected because it is not used outside of subclasses Change-Id: I64e68ebd99311718c31ed4cb23d9636bb3fb076c --- .../AbstractCompetitorRegistrationsDialog.java | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java index 437056b3696..83dd758bef7 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java @@ -80,19 +80,16 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia openEditCompetitorDialog(); } }); - final Button inviteCompetitorsButton = new Button(stringMessages.inviteSelectedCompetitors()); inviteCompetitorsButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { Set competitors = registeredCompetitorsTable.getSelectionModel().getSelectedSet(); - CompetitorInvitationHelper helper = new CompetitorInvitationHelper(sailingService, stringMessages, errorReporter); helper.inviteCompetitors(competitors, leaderboardName); } }); - HorizontalPanel competitorRegistrationPanel = new HorizontalPanel(); CaptionPanel allCompetitorsPanel = new CaptionPanel(stringMessages.competitorPool()); CaptionPanel registeredCompetitorsPanel = new CaptionPanel(stringMessages.registeredCompetitors()); @@ -125,31 +122,22 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia competitorRegistrationPanel.add(movePanel); competitorRegistrationPanel.setCellVerticalAlignment(movePanel, HasVerticalAlignment.ALIGN_MIDDLE); competitorRegistrationPanel.add(allCompetitorsPanel); - - buttonPanel.add(addCompetitorButton); buttonPanel.add(editCompetitorButton); buttonPanel.add(inviteCompetitorsButton); mainPanel.add(buttonPanel); - showOnlyCompetitorsOfLogCheckBox = new CheckBox(stringMessages.showOnlyCompetitorsOfLog()); showOnlyCompetitorsOfLogCheckBox.setValue(false); - showOnlyCompetitorsOfLogCheckBox.addClickHandler(new ClickHandler() { - @Override public void onClick(ClickEvent event) { refreshCompetitors(); } }); - mainPanel.add(showOnlyCompetitorsOfLogCheckBox); - addAdditionalWidgets(mainPanel); mainPanel.add(competitorRegistrationPanel); - refreshCompetitors(); - return mainPanel; } @@ -197,7 +185,7 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia }, boatClass).show(); } - public boolean showOnlyCompetitorsOfLog(){ + protected boolean showOnlyCompetitorsOfLog(){ return showOnlyCompetitorsOfLogCheckBox.getValue(); } From b7e7b8377829e6651758f55a3bfc18eb6aeedf89 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 15 Jan 2016 14:12:16 +0100 Subject: [PATCH 107/165] some minor method renames and making variables final where possible Change-Id: I21880695f4a7a34488eed38e1cdd650ded8c704d --- .../AbstractCompetitorRegistrationsDialog.java | 4 ++-- .../RaceLogCompetitorRegistrationDialog.java | 13 +++---------- .../RegattaLogCompetitorRegistrationDialog.java | 3 +-- 3 files changed, 6 insertions(+), 14 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java index 83dd758bef7..4abf502df4a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java @@ -228,11 +228,11 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia protected void refreshCompetitors() { registeredCompetitorsTable.getDataProvider().getList().clear(); allCompetitorsTable.getDataProvider().getList().clear(); - setRegisterableCompetitors(); + setRegisterableCompetitorsAndRegisteredCompetitors(); } protected abstract void setRegisteredCompetitors(); - protected abstract void setRegisterableCompetitors(); + protected abstract void setRegisterableCompetitorsAndRegisteredCompetitors(); public void deactivateRegistrationButtons(String tooltip){ registerBtn.setEnabled(false); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java index 0aab4871752..a8396f08882 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java @@ -90,12 +90,10 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis } }); competitorRegistrationInRaceLogCheckBox.addClickHandler(new ClickHandler() { - @Override public void onClick(ClickEvent event) { - String title; - String message; - + final String title; + final String message; if (competitorRegistrationInRaceLogCheckBox.getValue()) { title = stringMessages.doYouWantToRegisterCompetitorsDirectlyOnTheRace(); message = stringMessages.warningDirectCompetitorRegistration(); @@ -103,7 +101,6 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis title = stringMessages.doYouWantToDisableCompetitorsRegistrationsOnTheRace(); message = stringMessages.warningRegattaCompetitorRegistration(); } - new DataEntryDialog(title, message, stringMessages.ok(), stringMessages.cancel(), null, false, new DialogCallback() { @Override @@ -161,11 +158,10 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis } @Override - protected void setRegisterableCompetitors() { + protected void setRegisterableCompetitorsAndRegisteredCompetitors() { if (showOnlyCompetitorsOfLog()) { sailingService.getCompetitorRegistrationsInRegattaLog(leaderboardName, new AsyncCallback>() { - @Override public void onSuccess(Collection competitors) { allCompetitorsTable.refreshCompetitorList(competitors); @@ -177,13 +173,11 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis errorReporter.reportError("Could not fetch competitor registrations in regattalog : " + reason.getMessage()); } - }); } else { sailingService.getCompetitorRegistrationsForLeaderboard(leaderboardName, new AsyncCallback>() { - @Override public void onSuccess(Collection competitors) { allCompetitorsTable.refreshCompetitorList(competitors); @@ -195,7 +189,6 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis errorReporter.reportError("Could not fetch competitor registrations in regattalog : " + reason.getMessage()); } - }); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogCompetitorRegistrationDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogCompetitorRegistrationDialog.java index b801e51903c..da52729ecb8 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogCompetitorRegistrationDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogCompetitorRegistrationDialog.java @@ -50,7 +50,6 @@ public class RegattaLogCompetitorRegistrationDialog extends AbstractCompetitorRe + reason.getMessage()); } }); - } } @@ -59,7 +58,7 @@ public class RegattaLogCompetitorRegistrationDialog extends AbstractCompetitorRe } @Override - protected void setRegisterableCompetitors() { + protected void setRegisterableCompetitorsAndRegisteredCompetitors() { allCompetitorsTable.refreshCompetitorList(null, new Callback, Throwable>() { @Override public void onSuccess(Iterable result) { From 32f914c0eab79cd5606ea8a729bb6b47e6628935 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 15 Jan 2016 14:30:55 +0100 Subject: [PATCH 108/165] coding conventions, and added a FIXME for showing a confirmation dialog at least before toggling "Show only competitors from log" otherwise losing user input Change-Id: I3b79a60d55a3cc39dbb004bc7160925483eef007 --- .../AbstractCompetitorRegistrationsDialog.java | 2 +- .../adminconsole/CompetitorTableWrapper.java | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java index 4abf502df4a..e35035f4390 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java @@ -131,7 +131,7 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia showOnlyCompetitorsOfLogCheckBox.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { - refreshCompetitors(); + refreshCompetitors(); // FIXME this will cancel all uncommitted changes; at least a warning must be displayed to the user } }); mainPanel.add(showOnlyCompetitorsOfLogCheckBox); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java index 8461846d12d..17ef1e46281 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java @@ -244,18 +244,22 @@ public class CompetitorTableWrapper, Throwable> callback) { - if(leaderboardName != null) { + if (leaderboardName != null) { sailingService.getCompetitorsOfLeaderboard(leaderboardName, new AsyncCallback>() { @Override public void onFailure(Throwable caught) { errorReporter.reportError("Remote Procedure Call getCompetitors() - Failure: " + caught.getMessage()); - if (callback != null) callback.onFailure(caught); + if (callback != null) { + callback.onFailure(caught); + } } @Override public void onSuccess(Iterable result) { refreshCompetitorList(result); - if (callback != null) callback.onSuccess(result); + if (callback != null) { + callback.onSuccess(result); + } } }); } else { @@ -263,14 +267,18 @@ public class CompetitorTableWrapper result) { getFilteredCompetitors(result); refreshCompetitorList(result); - if (callback != null) callback.onSuccess(result); + if (callback != null) { + callback.onSuccess(result); + } } }); } From f1e1623c2c01e54e7caf63796f0a6766ad1b5cf2 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 15 Jan 2016 14:37:56 +0100 Subject: [PATCH 109/165] improved the implementation of AbstractCompetitorRegistrationsDialog.move, avoiding intermediate collections to be constructed Change-Id: I27baa65771a8417e79289d8de2ebca41b2ff8c3e --- .../AbstractCompetitorRegistrationsDialog.java | 14 +++----------- .../gwt/client/panels/AbstractFilterablePanel.java | 13 +++++++++++++ 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java index e35035f4390..c24efe4f678 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java @@ -143,17 +143,9 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia public abstract void addAdditionalWidgets(FlowPanel mainPanel); - void move(CompetitorTableWrapper from, CompetitorTableWrapper to, Collection toMove) { - if (!toMove.isEmpty()) { - List newFromList = new ArrayList<>(); - Util.addAll(from.getFilterField().getAll(), newFromList); - newFromList.removeAll(toMove); - from.getFilterField().updateAll(newFromList); - List newToList = new ArrayList<>(); - Util.addAll(to.getDataProvider().getList(), newToList); - newToList.addAll(toMove); - to.getFilterField().updateAll(newToList); - } + void move(CompetitorTableWrapper from, CompetitorTableWrapper to, Iterable toMove) { + from.getFilterField().removeAll(toMove); + to.getFilterField().addAll(toMove); } private void moveSelected(CompetitorTableWrapper> from, diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/AbstractFilterablePanel.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/AbstractFilterablePanel.java index 4e1aa1aa200..730dc1093b0 100755 --- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/AbstractFilterablePanel.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/AbstractFilterablePanel.java @@ -106,11 +106,24 @@ public abstract class AbstractFilterablePanel extends HorizontalPanel { filter(); } + /** + * Removes an object and applies the search filter. + */ + public void remove(T object) { + all.remove(object); + filter(); + } + public void addAll(Iterable objects) { Util.addAll(objects, all); filter(); } + public void removeAll(Iterable objects) { + Util.removeAll(objects, all); + filter(); + } + public void filter() { filtered.getList().clear(); Util.addAll(filterer.applyFilter(Arrays.asList(getTextBox().getText().split(" ")), all), filtered.getList()); From 01dfe544c29f51b836397153ff82c5b6395982d4 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 15 Jan 2016 14:39:28 +0100 Subject: [PATCH 110/165] consolidated imports Change-Id: I1b6e5a77e73d1860cde00eadbdd1b71a5e518616 --- .../ui/adminconsole/AbstractCompetitorRegistrationsDialog.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java index c24efe4f678..e79834e4572 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java @@ -1,9 +1,6 @@ package com.sap.sailing.gwt.ui.adminconsole; -import java.util.ArrayList; -import java.util.Collection; import java.util.HashSet; -import java.util.List; import java.util.Set; import com.google.gwt.event.dom.client.ClickEvent; From 1c3834de91db94ba42e82275c698380ad19589d7 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 15 Jan 2016 14:46:14 +0100 Subject: [PATCH 111/165] removed a bunch of empty lines Change-Id: Ifa3c076996b489c8f52c328f1106b3108b67c3a2 --- .../sailing/gwt/ui/server/SailingServiceImpl.java | 13 ------------- 1 file changed, 13 deletions(-) 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 12464598135..5ad5fdd5d0d 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 @@ -5939,22 +5939,18 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S @Override public Collection getCompetitorRegistrationsInRegattaLog(String leaderboardName) throws DoesNotHaveRegattaLogException, NotFoundException { Leaderboard leaderboard = getLeaderboardByName(leaderboardName); - if (! (leaderboard instanceof HasRegattaLike)) { throw new DoesNotHaveRegattaLogException(); } HasRegattaLike regattaLikeLeaderboard = ((HasRegattaLike) leaderboard); - return convertToCompetitorDTOs(regattaLikeLeaderboard.getCompetitorsRegisteredInRegattaLog()); } @Override public Collection getCompetitorRegistrationsInRaceLog(String leaderboardName, String raceColumnName, String fleetName) throws NotFoundException { - RaceColumn raceColumn = getRaceColumn(leaderboardName, raceColumnName); Fleet fleet = getFleetByName(raceColumn, fleetName); - return convertToCompetitorDTOs(raceColumn.getCompetitorsRegisteredInRacelog(fleet)); } @@ -5971,7 +5967,6 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S if (fleet == null){ throw new NotFoundException("fleet with name "+fleetName+" not found"); } - return fleet; } @@ -5980,7 +5975,6 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S if (leaderboard == null){ throw new NotFoundException("Leaderboard with name "+leaderboardName+" not found"); } - return leaderboard; } @@ -5989,12 +5983,10 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S if (leaderboard == null){ throw new NotFoundException("leaderboard with name "+leaderboardName+" not found"); } - RaceColumn raceColumn = leaderboard.getRaceColumnByName(raceColumnName); if (raceColumn == null){ throw new NotFoundException("raceColumn with name "+raceColumnName+" not found"); } - return raceColumn; } @@ -6021,12 +6013,9 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S for (MarkDTO markDTO : marksToRemove) { markIds.add(markDTO.getIdAsString()); } - RaceLog raceLogToIgnore = getRaceLog(leaderboardName, raceColumnName, fleetName); HashSet racesContainingMarksToDeleteInCourse = new HashSet(); - boolean marksAreUsedInOtherRaceLogs = false; - Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName); for (RaceColumn raceColumn : leaderboard.getRaceColumns()) { for (Fleet fleet : raceColumn.getFleets()) { @@ -6046,12 +6035,10 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S } } } - StringBuilder racesInCollision = new StringBuilder(); for (String raceName : racesContainingMarksToDeleteInCourse) { racesInCollision.append(raceName+", "); } - return new Pair(marksAreUsedInOtherRaceLogs, racesInCollision.substring(0, Math.max(0, racesInCollision.length()-2))); } From 27a82505aaf84973312398f1cebffbc16b3d4524 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 15 Jan 2016 15:10:02 +0100 Subject: [PATCH 112/165] fixed clear() vs. removeAll() issue in filtered competitor panel Change-Id: Ie1bfad9c2ff921ad806b72de043c91a4c740aacb --- .../AbstractCompetitorRegistrationsDialog.java | 4 ++-- .../sse/gwt/client/panels/AbstractFilterablePanel.java | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java index e79834e4572..ab61ef150ca 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java @@ -215,8 +215,8 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia } protected void refreshCompetitors() { - registeredCompetitorsTable.getDataProvider().getList().clear(); - allCompetitorsTable.getDataProvider().getList().clear(); + registeredCompetitorsTable.getFilterField().removeAll(); + allCompetitorsTable.getFilterField().removeAll(); setRegisterableCompetitorsAndRegisteredCompetitors(); } diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/AbstractFilterablePanel.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/AbstractFilterablePanel.java index 730dc1093b0..ed33b868678 100755 --- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/AbstractFilterablePanel.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/panels/AbstractFilterablePanel.java @@ -119,6 +119,16 @@ public abstract class AbstractFilterablePanel extends HorizontalPanel { filter(); } + /** + * Would better be called {@code clear()}, but {@link #clear} is already the method inherited from {@link Panel}... + * This method removes all entries from this filterable panel. The effect is the same as invoking + * removeAll(all) with all being a copy of what you get when calling {@link #getAll()}. + */ + public void removeAll() { + all.clear(); + filter(); + } + public void removeAll(Iterable objects) { Util.removeAll(objects, all); filter(); From d57265f72c30aac5d5fe95af55e81f553e89ca0a Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 15 Jan 2016 15:27:52 +0100 Subject: [PATCH 113/165] added a confirmation popup when toggling the "Show only competitors from log" checkbox which may lose user input Change-Id: I8d08a8a99d630e4b0474b5926505c38781d576ec --- .../AbstractCompetitorRegistrationsDialog.java | 7 ++++++- .../java/com/sap/sailing/gwt/ui/client/StringMessages.java | 1 + .../sap/sailing/gwt/ui/client/StringMessages.properties | 3 ++- .../sap/sailing/gwt/ui/client/StringMessages_de.properties | 1 + .../sap/sailing/gwt/ui/client/StringMessages_ru.properties | 1 + .../sap/sailing/gwt/ui/client/StringMessages_zh.properties | 3 ++- 6 files changed, 13 insertions(+), 3 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java index ab61ef150ca..fcf2eb04fa0 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java @@ -5,6 +5,7 @@ import java.util.Set; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.CaptionPanel; @@ -128,7 +129,11 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia showOnlyCompetitorsOfLogCheckBox.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { - refreshCompetitors(); // FIXME this will cancel all uncommitted changes; at least a warning must be displayed to the user + if (Window.confirm(stringMessages.confirmLosingCompetitorEditsWhenTogglingLogBasedView())) { + refreshCompetitors(); + } else { + showOnlyCompetitorsOfLogCheckBox.setValue(!showOnlyCompetitorsOfLogCheckBox.getValue()); + } } }); mainPanel.add(showOnlyCompetitorsOfLogCheckBox); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java index 5d9eb7082d7..df2a5e0071d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java @@ -1459,4 +1459,5 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, c String transparentBufferLineOnHover(); String bufferLineStrokeWeight(); String showOnlyCompetitorsOfLog(); + String confirmLosingCompetitorEditsWhenTogglingLogBasedView(); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties index f06ec1fd184..94fead7873c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties @@ -1425,4 +1425,5 @@ couldNotObtainRace=Could not obtain a race with name {1} for fleet {2} for a reg errorTryingToCreateEmbeddedMap=Error trying to create the embedded map: {0} transparentBufferLineOnHover=Transparent buffer lines on hover of helplines bufferLineStrokeWeight=Buffer line stroke weight -showOnlyCompetitorsOfLog=Show only competitors registered in Log \ No newline at end of file +showOnlyCompetitorsOfLog=Show only competitors registered in Log +confirmLosingCompetitorEditsWhenTogglingLogBasedView=This will reset your current, unsaved changes to the competitors.\nDo you really want to continue? \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties index 386a0843272..da97e2f6c7b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties @@ -1417,3 +1417,4 @@ errorTryingToCreateEmbeddedMap=Fehler beim Erstellen der eingebetteten Karte: {0 transparentBufferLineOnHover=Transparente Pufferlinien bei Maus über Hilfslinien bufferLineStrokeWeight=Linienbreite der Pufferlinien showOnlyCompetitorsOfLog=Nur Teilnehmer aus Log anzeigen +confirmLosingCompetitorEditsWhenTogglingLogBasedView=Damit werden alle aktuellen, noch nicht gespeicherten\nÄnderungen an der Teilnehmerliste zurückgesetzt. Wirklich fortfahren? \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties index a29a04b8fe7..026522ae5fa 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties @@ -1348,3 +1348,4 @@ couldNotObtainRace=Could not obtain a race with name {1} for fleet {2} for a reg errorTryingToCreateEmbeddedMap=Error trying to create the embedded map: {0} transparentBufferLineOnHover=Transparent buffer lines on hover of helplines bufferLineStrokeWeight=Buffer line stroke weight +confirmLosingCompetitorEditsWhenTogglingLogBasedView=This will reset your current, unsaved changes to the competitors.\nDo you really want to continue? \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties index dbd13fad0d2..b54771771e2 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties @@ -1362,4 +1362,5 @@ requiresValidRegatta=This page requires a valid regatta, race column and fleet n couldNotObtainRace=Could not obtain a race with name {1} for fleet {2} for a regatta with name {0}: {3} errorTryingToCreateEmbeddedMap=Error trying to create the embedded map: {0} transparentBufferLineOnHover=Transparent buffer lines on hover of helplines -bufferLineStrokeWeight=Buffer line stroke weight \ No newline at end of file +bufferLineStrokeWeight=Buffer line stroke weight +confirmLosingCompetitorEditsWhenTogglingLogBasedView=This will reset your current, unsaved changes to the competitors.\nDo you really want to continue? \ No newline at end of file From 57c6e5ac8985581be00dbb61fb84c2540dd5ab24 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 15 Jan 2016 16:33:02 +0100 Subject: [PATCH 114/165] LeaderboardsResource.pingMark no longer returns a lastKnownPosition in its response, only an OK Change-Id: Id57cbcbb876bf04707a8cb14046b962d44221485 --- .../gateway/jaxrs/api/LeaderboardsResource.java | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java index 04bdce27db9..cce8b338249 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java @@ -59,7 +59,6 @@ import com.sap.sailing.domain.common.dto.RaceColumnDTO; import com.sap.sailing.domain.common.racelog.RaceLogServletConstants; import com.sap.sailing.domain.common.racelog.tracking.DeviceMappingConstants; import com.sap.sailing.domain.common.tracking.GPSFix; -import com.sap.sailing.domain.common.tracking.impl.GPSFixImpl; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.SettableScoreCorrection; import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; @@ -584,7 +583,6 @@ public class LeaderboardsResource extends AbstractSailingServerResource { private final MarkJsonSerializerWithPosition markWithPositionSerializer = new MarkJsonSerializerWithPosition( markSerializer, new FlatGPSFixJsonSerializer()); private final FlatGPSFixJsonDeserializer fixDeserializer = new FlatGPSFixJsonDeserializer(); - private final FlatGPSFixJsonSerializer fixSerializer = new FlatGPSFixJsonSerializer(); /** * Mockito requires this to be public in order to be able to mock it :-( @@ -596,10 +594,6 @@ public class LeaderboardsResource extends AbstractSailingServerResource { /** * Expects one GPS Fix in the format understood by {@link #fixDeserializer} in the POST message body, parses that fix, * adds the fix to the {@link RacingEventService#getGPSFixStore() GPSFixStore} and creates mappings for each fix in the RegattaLog. - * If the mark's position for the current server time can be determined from the {@link TrackedRace}s attached to the leaderboard, - * that position is returned, serialized by {@link #fixSerializer}. Note that with this is may be possible that there is currently - * no {@link TrackedRace} accepting the ping fix, hence causing no result to be returned, or a position from another - * {@link TrackedRace}, e.g., from the past, that has not accepted the ping fix. */ @POST @Path("{leaderboardName}/marks/{markId}/gps_fixes") @@ -627,7 +621,6 @@ public class LeaderboardsResource extends AbstractSailingServerResource { return Response.status(Status.NOT_FOUND).entity("Could not find a mark with ID '" + StringEscapeUtils.escapeHtml(markId) + "'.") .type(MediaType.TEXT_PLAIN).build(); } - final TimePoint now = MillisecondsTimePoint.now(); // grab the position as found in TrackedRaces attached to the leaderboard final GPSFix fix; try { @@ -642,14 +635,6 @@ public class LeaderboardsResource extends AbstractSailingServerResource { } final RaceLogTrackingAdapter adapter = getRaceLogTrackingAdapter(); adapter.pingMark(regattaLog, mark, fix, service); - - final Position lastKnownPosition = service.getMarkPosition(mark, (LeaderboardThatHasRegattaLike) leaderboard, now); - if (lastKnownPosition != null) { - final JSONObject lastKnownFixJson = fixSerializer.serialize(new GPSFixImpl(lastKnownPosition, now)); - final String fixJson = lastKnownFixJson.toJSONString(); - return Response.ok(fixJson, MediaType.APPLICATION_JSON).build(); - } else { - return Response.ok().build(); - } + return Response.ok().build(); } } From 132bde468659e78a871346a9ae82ef33efdeb53d Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 15 Jan 2016 16:59:40 +0100 Subject: [PATCH 115/165] use DeviceMappingConstants for postCheckout endpoint Change-Id: Ia8f1a77877304d32d6336fe9fbf6eb9ee66e62b6 --- .../server/gateway/jaxrs/api/LeaderboardsResource.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java index cce8b338249..ff04315885c 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java @@ -454,9 +454,9 @@ public class LeaderboardsResource extends AbstractSailingServerResource { .type(MediaType.TEXT_PLAIN).build(); } logger.fine("JSON requestObject is: " + requestObject.toString()); - Long toMillis = (Long) requestObject.get("toMillis"); - String competitorId = (String) requestObject.get("competitorId"); - String deviceUuid = (String) requestObject.get("deviceUuid"); + Long toMillis = (Long) requestObject.get(DeviceMappingConstants.JSON_TO_MILLIS); + String competitorId = (String) requestObject.get(DeviceMappingConstants.JSON_COMPETITOR_ID_AS_STRING); + String deviceUuid = (String) requestObject.get(DeviceMappingConstants.JSON_DEVICE_UUID); TimePoint closingTimePoint = new MillisecondsTimePoint(toMillis); if (toMillis == null || deviceUuid == null || closingTimePoint == null) { logger.warning("Invalid JSON body in request"); From 46e5f927ae1ade123a779e5120259e45b106327e Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 15 Jan 2016 17:32:22 +0100 Subject: [PATCH 116/165] allow user to add any competitor to a RaceLog, not only those registered for the regatta Change-Id: I01d844cb06a6dfaba11b6338a0824e36551f4e08 --- ...ProviderFromRaceColumnsAndRegattaLike.java | 4 +-- ...AbstractCompetitorRegistrationsDialog.java | 16 ++++++++- .../RaceLogCompetitorRegistrationDialog.java | 36 ------------------- ...egattaLogCompetitorRegistrationDialog.java | 15 -------- 4 files changed, 17 insertions(+), 54 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/CompetitorProviderFromRaceColumnsAndRegattaLike.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/CompetitorProviderFromRaceColumnsAndRegattaLike.java index 8189ad3d1b0..cf94f788fe8 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/CompetitorProviderFromRaceColumnsAndRegattaLike.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/CompetitorProviderFromRaceColumnsAndRegattaLike.java @@ -166,7 +166,7 @@ public class CompetitorProviderFromRaceColumnsAndRegattaLike { // note: adding listeners is idempotent; at most one occurrence of this listener exists in the race/regatta log's // listeners set provider.addRaceColumnListener(raceColumnListener); - // consider {@link RegattaLog} competitor changes + // consider {@link RegattaLog} competitor changes because the RaceColumns may have added the competitors from there provider.getRegattaLike().getRegattaLog().addListener(regattaLogCompetitorsCacheInvalidationListener); allCompetitorsCache = result; } @@ -189,7 +189,7 @@ public class CompetitorProviderFromRaceColumnsAndRegattaLike { // listeners set raceColumn.getRaceLog(fleet).addListener(raceLogCompetitorsCacheInvalidationListener); provider.addRaceColumnListener(raceColumnListener); - // consider {@link RegattaLog} competitor changes + // consider {@link RegattaLog} competitor changes because the RaceColumns may have added the competitors from there provider.getRegattaLike().getRegattaLog().addListener(regattaLogCompetitorsCacheInvalidationListener); result = resultSet; allCompetitorsCacheByRace.put(key, result); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java index fcf2eb04fa0..7dc54000880 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java @@ -3,6 +3,7 @@ package com.sap.sailing.gwt.ui.adminconsole; import java.util.HashSet; import java.util.Set; +import com.google.gwt.core.client.Callback; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.Window; @@ -226,8 +227,20 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia } protected abstract void setRegisteredCompetitors(); - protected abstract void setRegisterableCompetitorsAndRegisteredCompetitors(); + private void setRegisterableCompetitorsAndRegisteredCompetitors() { + allCompetitorsTable.refreshCompetitorList(null, new Callback, Throwable>() { + @Override + public void onSuccess(Iterable result) { + setRegisteredCompetitors(); + } + + @Override + public void onFailure(Throwable reason) { + } + }); + } + public void deactivateRegistrationButtons(String tooltip){ registerBtn.setEnabled(false); unregisterBtn.setEnabled(false); @@ -248,4 +261,5 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia Util.addAll(registeredCompetitorsTable.getAllCompetitors(), registeredCompetitors); return registeredCompetitors; } + } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java index a8396f08882..997b9c104ef 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java @@ -157,42 +157,6 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis }); } - @Override - protected void setRegisterableCompetitorsAndRegisteredCompetitors() { - if (showOnlyCompetitorsOfLog()) { - sailingService.getCompetitorRegistrationsInRegattaLog(leaderboardName, - new AsyncCallback>() { - @Override - public void onSuccess(Collection competitors) { - allCompetitorsTable.refreshCompetitorList(competitors); - setRegisteredCompetitors(); - } - - @Override - public void onFailure(Throwable reason) { - errorReporter.reportError("Could not fetch competitor registrations in regattalog : " - + reason.getMessage()); - } - }); - - } else { - sailingService.getCompetitorRegistrationsForLeaderboard(leaderboardName, - new AsyncCallback>() { - @Override - public void onSuccess(Collection competitors) { - allCompetitorsTable.refreshCompetitorList(competitors); - setRegisteredCompetitors(); - } - - @Override - public void onFailure(Throwable reason) { - errorReporter.reportError("Could not fetch competitor registrations in regattalog : " - + reason.getMessage()); - } - }); - } - } - @Override protected Set getResult() { if (competitorRegistrationInRaceLogCheckBox.getValue()) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogCompetitorRegistrationDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogCompetitorRegistrationDialog.java index da52729ecb8..8dae321c8df 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogCompetitorRegistrationDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogCompetitorRegistrationDialog.java @@ -3,7 +3,6 @@ package com.sap.sailing.gwt.ui.adminconsole; import java.util.Collection; import java.util.Set; -import com.google.gwt.core.client.Callback; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.FlowPanel; import com.sap.sailing.domain.common.dto.CompetitorDTO; @@ -56,18 +55,4 @@ public class RegattaLogCompetitorRegistrationDialog extends AbstractCompetitorRe @Override public void addAdditionalWidgets(FlowPanel mainPanel) { } - - @Override - protected void setRegisterableCompetitorsAndRegisteredCompetitors() { - allCompetitorsTable.refreshCompetitorList(null, new Callback, Throwable>() { - @Override - public void onSuccess(Iterable result) { - setRegisteredCompetitors(); - } - - @Override - public void onFailure(Throwable reason) { - } - }); - } } From c5f9d0b2a0e494ce53774235224da316241c895a Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 15 Jan 2016 18:04:15 +0100 Subject: [PATCH 117/165] validate race competitor registration dialog: it's invalid (not saveable) if the race does not support per-race competitor registrations Change-Id: I683234365c642c40a1ae70cd98b7d491c11af753 --- ...egistrationOnRaceLogDisabledException.java | 8 ++++ .../domain/base/impl/AbstractRaceColumn.java | 4 +- ...AbstractCompetitorRegistrationsDialog.java | 6 +-- .../RaceLogCompetitorRegistrationDialog.java | 43 +++++++++++++++++-- ...egattaLogCompetitorRegistrationDialog.java | 2 +- 5 files changed, 54 insertions(+), 9 deletions(-) diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/tracking/CompetitorRegistrationOnRaceLogDisabledException.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/tracking/CompetitorRegistrationOnRaceLogDisabledException.java index e43b247bc3d..22bf5a15b90 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/tracking/CompetitorRegistrationOnRaceLogDisabledException.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/tracking/CompetitorRegistrationOnRaceLogDisabledException.java @@ -4,4 +4,12 @@ import java.io.Serializable; public class CompetitorRegistrationOnRaceLogDisabledException extends Exception implements Serializable { private static final long serialVersionUID = 963948633131929332L; + + public CompetitorRegistrationOnRaceLogDisabledException() { + super("Competitor registration not allowed on race"); + } + + public CompetitorRegistrationOnRaceLogDisabledException(String message) { + super(message); + } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java index 14de0c4488e..35becdbd8bb 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java @@ -279,7 +279,7 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem public void registerCompetitors(Iterable competitors, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException { if (!isCompetitorRegistrationInRacelogEnabled(fleet)) { - throw new CompetitorRegistrationOnRaceLogDisabledException(); + throw new CompetitorRegistrationOnRaceLogDisabledException("Competitor registration not allows on fleet "+fleet+" in column "+this); } TimePoint now = MillisecondsTimePoint.now(); RaceLog raceLog = getRaceLog(fleet); @@ -300,7 +300,7 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem public void deregisterCompetitors(Iterable competitors, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException { if (!isCompetitorRegistrationInRacelogEnabled(fleet)) { - throw new CompetitorRegistrationOnRaceLogDisabledException(); + throw new CompetitorRegistrationOnRaceLogDisabledException("Competitor registration not allowed for fleet "+fleet+" in column "+this); } HashSet competitorSet = new HashSet(); Util.addAll(competitors, competitorSet); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java index 7dc54000880..8330c4219d9 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java @@ -49,9 +49,9 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia */ public AbstractCompetitorRegistrationsDialog(final SailingServiceAsync sailingService, final StringMessages stringMessages, final ErrorReporter errorReporter, boolean editable, - DialogCallback> callback, String leaderboardName, String boatClass) { - super(stringMessages.registerCompetitors(), /* messsage */null, stringMessages.save(), stringMessages.cancel(), /* validator */ - null, callback); + DialogCallback> callback, String leaderboardName, String boatClass, + com.sap.sse.gwt.client.dialog.DataEntryDialog.Validator> validator) { + super(stringMessages.registerCompetitors(), /* messsage */null, stringMessages.save(), stringMessages.cancel(), validator, callback); this.stringMessages = stringMessages; this.sailingService = sailingService; this.errorReporter = errorReporter; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java index 997b9c104ef..39333bb4fe7 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java @@ -1,7 +1,7 @@ package com.sap.sailing.gwt.ui.adminconsole; import java.util.Collection; -import java.util.HashSet; +import java.util.Collections; import java.util.Set; import com.google.gwt.event.dom.client.ClickEvent; @@ -20,15 +20,52 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis private String fleetName; private String raceColumnName; private CheckBox competitorRegistrationInRaceLogCheckBox; + + private static class Validator implements com.sap.sse.gwt.client.dialog.DataEntryDialog.Validator> { + private CheckBox competitorRegistrationInRaceLogCheckBox; + private final StringMessages stringMessages; + + public Validator(StringMessages stringMessages) { + this.stringMessages = stringMessages; + } + + @Override + public String getErrorMessage(Set valueToValidate) { + final String result; + if (getCompetitorRegistrationInRaceLogCheckBox() != null && !getCompetitorRegistrationInRaceLogCheckBox().getValue()) { + result = stringMessages.competitorRegistrationsOnRaceDisabled(); + } else { + result = null; + } + return result; + } + + public CheckBox getCompetitorRegistrationInRaceLogCheckBox() { + return competitorRegistrationInRaceLogCheckBox; + } + + public void setCompetitorRegistrationInRaceLogCheckBox(CheckBox competitorRegistrationInRaceLogCheckBox) { + this.competitorRegistrationInRaceLogCheckBox = competitorRegistrationInRaceLogCheckBox; + } + } public RaceLogCompetitorRegistrationDialog(String boatClass, SailingServiceAsync sailingService, StringMessages stringMessages, ErrorReporter errorReporter, boolean editable, String leaderboardName, String raceColumnName, String fleetName, com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback> callback) { - super(sailingService, stringMessages, errorReporter, editable, callback, leaderboardName, boatClass); + this(sailingService, stringMessages, errorReporter, editable, callback, leaderboardName, boatClass, + raceColumnName, fleetName, new Validator(stringMessages)); + } + + public RaceLogCompetitorRegistrationDialog(SailingServiceAsync sailingService, StringMessages stringMessages, + ErrorReporter errorReporter, boolean editable, + com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback> callback, + String leaderboardName, String boatClass, String raceColumnName, String fleetName, Validator validator) { + super(sailingService, stringMessages, errorReporter, editable, callback, leaderboardName, boatClass, validator); this.raceColumnName = raceColumnName; this.fleetName = fleetName; competitorRegistrationInRaceLogCheckBox = new CheckBox(stringMessages.registerCompetitorsOnRace()); + validator.setCompetitorRegistrationInRaceLogCheckBox(competitorRegistrationInRaceLogCheckBox); setupCompetitorRegistationsOnRaceCheckbox(); } @@ -162,7 +199,7 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis if (competitorRegistrationInRaceLogCheckBox.getValue()) { return super.getResult(); } else { - return new HashSet(); + return Collections.emptySet(); } } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogCompetitorRegistrationDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogCompetitorRegistrationDialog.java index 8dae321c8df..f7518529006 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogCompetitorRegistrationDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogCompetitorRegistrationDialog.java @@ -15,7 +15,7 @@ public class RegattaLogCompetitorRegistrationDialog extends AbstractCompetitorRe public RegattaLogCompetitorRegistrationDialog(String boatClass, SailingServiceAsync sailingService, StringMessages stringMessages, ErrorReporter errorReporter, boolean editable, String leaderboardName, com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback> callback) { - super(sailingService, stringMessages, errorReporter, editable, callback, leaderboardName, boatClass); + super(sailingService, stringMessages, errorReporter, editable, callback, leaderboardName, boatClass, /* validator */ null); } @Override From 981c8433812d0cf1c60d19153ce09d8ac8de9ddd Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 15 Jan 2016 18:09:38 +0100 Subject: [PATCH 118/165] fixed cancel behavior for toggling "Register Competitors on Race" Change-Id: Ic4c299797365fc481e7f65b013a3eac929f39fce --- .../ui/adminconsole/AbstractCompetitorRegistrationsDialog.java | 2 ++ .../ui/adminconsole/RaceLogCompetitorRegistrationDialog.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java index 8330c4219d9..d4a4c5eeed7 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java @@ -246,6 +246,7 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia unregisterBtn.setEnabled(false); registerBtn.setTitle(tooltip); unregisterBtn.setTitle(tooltip); + validate(); } public void activateRegistrationButtons(){ @@ -253,6 +254,7 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia unregisterBtn.setEnabled(true); registerBtn.setTitle(""); unregisterBtn.setTitle(""); + validate(); } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java index 39333bb4fe7..c673f792b18 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java @@ -179,10 +179,12 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis } }); } + validate(); } @Override public void cancel() { + competitorRegistrationInRaceLogCheckBox.setValue(!competitorRegistrationInRaceLogCheckBox.getValue()); } }) { @Override From 80a34a7a0ea0ed315267a0d0269c04866ff130e2 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 15 Jan 2016 20:15:03 +0100 Subject: [PATCH 119/165] fixed test verdict: no artificial mark ping fix is generated anymore Change-Id: Iace233127fcf03972e0c5ddc7a00061be69d6768 --- .../adminconsole/RaceLogCompetitorRegistrationDialog.java | 1 - .../test/jaxrs/LeaderboardsResourcePingMarkTest.java | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java index c673f792b18..2f2055151d9 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java @@ -179,7 +179,6 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis } }); } - validate(); } @Override diff --git a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourcePingMarkTest.java b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourcePingMarkTest.java index e378af1f371..6268ea97ab3 100644 --- a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourcePingMarkTest.java +++ b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourcePingMarkTest.java @@ -83,13 +83,13 @@ public class LeaderboardsResourcePingMarkTest extends AbstractJaxRsApiTest { assertOneFixPerMapping(mappingsForMark); } { - // now produce a second ping; this should produce two fixes for the mark: one repeating the last known - // position, and another one with the new position. + // now produce a second ping; this should produce also only one fix; no additional artificial fixes are + // created (anymore; they used to be before bug2851) Response response = resource.pingMark(PING2_MARK_JSON, leaderboard.getName(), mark.getId().toString()); assertThat("response is ok", response.getStatus(), equalTo(Response.Status.OK.getStatusCode())); Map>> mappings = new RegattaLogDeviceMarkMappingFinder(log).analyze(); List> mappingsForMark = mappings.get(mark); - assertThat("Assert an additional mapping was created for the second ping", mappingsForMark.size(), equalTo(3)); + assertThat("Assert no additional mapping was created for the second ping", mappingsForMark.size(), equalTo(2)); assertOneFixPerMapping(mappingsForMark); } } From babd76d4a3d2668ffbf4d2c3f1fce6f904b9a7fc Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 18 Jan 2016 09:27:16 +0100 Subject: [PATCH 120/165] formatting changes only Change-Id: Ie9442d4229d8f773d40f6f632aa8a94a527b0188 --- .../domain/common/tracking/impl/CompactGPSFixMovingImpl.java | 1 + .../adminconsole/SmartphoneTrackingEventManagementPanel.java | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/tracking/impl/CompactGPSFixMovingImpl.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/tracking/impl/CompactGPSFixMovingImpl.java index 095bb7ac1ec..b48f26dcd05 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/tracking/impl/CompactGPSFixMovingImpl.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/tracking/impl/CompactGPSFixMovingImpl.java @@ -63,6 +63,7 @@ public class CompactGPSFixMovingImpl extends CompactGPSFixImpl implements GPSFix public String toString() { return super.toString()+" to "+getBearing().getDegrees()+"°"; } + @Override public int hashCode() { return super.hashCode() ^ getBearing().hashCode(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SmartphoneTrackingEventManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SmartphoneTrackingEventManagementPanel.java index ce5cfa0c2d5..57c064fc39d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SmartphoneTrackingEventManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SmartphoneTrackingEventManagementPanel.java @@ -569,8 +569,8 @@ public class SmartphoneTrackingEventManagementPanel extends AbstractLeaderboardC final String result; RegattaDTO regatta = null; if (getSelectedLeaderboard().regattaName != null) { - if (allRegattas != null) { - for (RegattaDTO i : allRegattas) { + if (allRegattas != null) { + for (RegattaDTO i : allRegattas) { if (getSelectedLeaderboard().regattaName.equals(i.getName())) { regatta = i; break; From 4286652f3a2ba850d0e5b60bb011e5c04260e8c3 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 18 Jan 2016 09:31:31 +0100 Subject: [PATCH 121/165] changed scope of move method from package to protected Change-Id: I39b40fa6eb9b2f385d7da21322b7f434ee439441 --- .../ui/adminconsole/AbstractCompetitorRegistrationsDialog.java | 2 +- .../ui/adminconsole/SmartphoneTrackingEventManagementPanel.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java index d4a4c5eeed7..7728607f493 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java @@ -146,7 +146,7 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia public abstract void addAdditionalWidgets(FlowPanel mainPanel); - void move(CompetitorTableWrapper from, CompetitorTableWrapper to, Iterable toMove) { + protected void move(CompetitorTableWrapper from, CompetitorTableWrapper to, Iterable toMove) { from.getFilterField().removeAll(toMove); to.getFilterField().addAll(toMove); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SmartphoneTrackingEventManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SmartphoneTrackingEventManagementPanel.java index 57c064fc39d..192d29f6167 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SmartphoneTrackingEventManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SmartphoneTrackingEventManagementPanel.java @@ -586,7 +586,7 @@ public class SmartphoneTrackingEventManagementPanel extends AbstractLeaderboardC new AsyncCallback>() { @Override public void onFailure(Throwable caught) { - GWT.log("Error while searching BoatClass."); + GWT.log("Error while searching boat class"); showWithBoatClass.showWithBoatClass(null); } From 3ef139d0dc5e46d3b53cb79cd9ae8b6f50b36638 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 18 Jan 2016 10:48:29 +0100 Subject: [PATCH 122/165] use Util.getDominantObject in RaceLogTrackingAdapterImpl when denoting a race for smartphone tracking Change-Id: I454c0ce3bdf72e3c919e0eaa63df85a77a6f0601 --- .../impl/RaceLogTrackingAdapterImpl.java | 25 +++---------------- ...AbstractCompetitorRegistrationsDialog.java | 14 +++++------ 2 files changed, 10 insertions(+), 29 deletions(-) diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java index 4264c079be5..af340dd6ed1 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java @@ -2,14 +2,13 @@ package com.sap.sailing.domain.racelogtracking.impl; import java.io.IOException; import java.io.InputStream; -import java.util.HashMap; import java.util.HashSet; import java.util.Locale; -import java.util.Map.Entry; import java.util.Set; import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.stream.StreamSupport; import javax.activation.DataHandler; import javax.activation.DataSource; @@ -136,7 +135,7 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter { @Override public void denoteRaceForRaceLogTracking(RacingEventService service, Leaderboard leaderboard, RaceColumn raceColumn, Fleet fleet, String raceName) throws NotDenotableForRaceLogTrackingException { - BoatClass boatClass = null; + final BoatClass boatClass; if (leaderboard instanceof RegattaLeaderboard) { RegattaLeaderboard rLeaderboard = (RegattaLeaderboard) leaderboard; boatClass = rLeaderboard.getRegatta().getBoatClass(); @@ -164,26 +163,8 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter { raceLog.add(event); } - // implemented somewhere in domainFactory? private BoatClass findDominatingBoatClass(Iterable allCompetitors) { - HashMap occurenceCount = new HashMap<>(); - for (Competitor competitor : allCompetitors) { - BoatClass boatclass = competitor.getBoat().getBoatClass(); - if (occurenceCount.containsKey(boatclass) ) { - int value = occurenceCount.get(boatclass); - occurenceCount.put(boatclass, value + 1); - } else { - occurenceCount.put(boatclass, 1); - } - } - - Entry mostFrequentEntry = occurenceCount.entrySet().iterator().next(); - for (Entry entry : occurenceCount.entrySet()) { - if (mostFrequentEntry.getValue() < entry.getValue()){ - mostFrequentEntry = entry; - } - } - return mostFrequentEntry.getKey(); + return Util.getDominantObject(()->StreamSupport.stream(allCompetitors.spliterator(), /* parallel */ false).map(c->c.getBoat().getBoatClass()).iterator()); } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java index 7728607f493..51acc43f7a1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java @@ -62,9 +62,9 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia @Override protected Widget getAdditionalWidget() { - FlowPanel mainPanel = new FlowPanel(); - HorizontalPanel buttonPanel = new HorizontalPanel(); - Button addCompetitorButton = new Button(stringMessages.add(stringMessages.competitor())); + final FlowPanel mainPanel = new FlowPanel(); + final HorizontalPanel buttonPanel = new HorizontalPanel(); + final Button addCompetitorButton = new Button(stringMessages.add(stringMessages.competitor())); addCompetitorButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { @@ -72,7 +72,7 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia } }); - Button editCompetitorButton = new Button(stringMessages.edit(stringMessages.competitor())); + final Button editCompetitorButton = new Button(stringMessages.edit(stringMessages.competitor())); editCompetitorButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { @@ -89,9 +89,9 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia helper.inviteCompetitors(competitors, leaderboardName); } }); - HorizontalPanel competitorRegistrationPanel = new HorizontalPanel(); - CaptionPanel allCompetitorsPanel = new CaptionPanel(stringMessages.competitorPool()); - CaptionPanel registeredCompetitorsPanel = new CaptionPanel(stringMessages.registeredCompetitors()); + final HorizontalPanel competitorRegistrationPanel = new HorizontalPanel(); + final CaptionPanel allCompetitorsPanel = new CaptionPanel(stringMessages.competitorPool()); + final CaptionPanel registeredCompetitorsPanel = new CaptionPanel(stringMessages.registeredCompetitors()); allCompetitorsTable = new CompetitorTableWrapper<>(sailingService, stringMessages, errorReporter, /* multiSelection */ true, /* enablePager */true); registeredCompetitorsTable = new CompetitorTableWrapper<>(sailingService, stringMessages, errorReporter, /* multiSelection */ From 884f071972ce8fdbf3b107dc1443edccb5d91830 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 18 Jan 2016 11:18:45 +0100 Subject: [PATCH 123/165] added i18n for course management panel Change-Id: Ie12db85b6eb88c463752853148f33ab2a570f2a5 --- .../gwt/ui/adminconsole/RaceLogCourseManagementWidget.java | 2 +- .../java/com/sap/sailing/gwt/ui/client/StringMessages.java | 1 + .../com/sap/sailing/gwt/ui/client/StringMessages.properties | 3 ++- .../com/sap/sailing/gwt/ui/client/StringMessages_de.properties | 3 ++- .../com/sap/sailing/gwt/ui/client/StringMessages_ru.properties | 3 ++- .../com/sap/sailing/gwt/ui/client/StringMessages_zh.properties | 3 ++- 6 files changed, 10 insertions(+), 5 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCourseManagementWidget.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCourseManagementWidget.java index f5c5bf75e21..0bd6f795127 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCourseManagementWidget.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCourseManagementWidget.java @@ -133,7 +133,7 @@ public class RaceLogCourseManagementWidget extends CourseManagementWidget { public void onSuccess(Pairresult) { if (result.getA()){ removeMark.setEnabled(false); - removeMark.setTitle("Removal deavticated, marks are used in races: "+result.getB()); + removeMark.setTitle(stringMessages.removalOfMarkDisabledMayBeUsedInRaces(result.getB())); } else { removeMark.setEnabled(true); removeMark.setTitle(""); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java index df2a5e0071d..5da7eccba03 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java @@ -1460,4 +1460,5 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, c String bufferLineStrokeWeight(); String showOnlyCompetitorsOfLog(); String confirmLosingCompetitorEditsWhenTogglingLogBasedView(); + String removalOfMarkDisabledMayBeUsedInRaces(String raceNames); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties index 94fead7873c..a4e252a9156 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties @@ -1426,4 +1426,5 @@ errorTryingToCreateEmbeddedMap=Error trying to create the embedded map: {0} transparentBufferLineOnHover=Transparent buffer lines on hover of helplines bufferLineStrokeWeight=Buffer line stroke weight showOnlyCompetitorsOfLog=Show only competitors registered in Log -confirmLosingCompetitorEditsWhenTogglingLogBasedView=This will reset your current, unsaved changes to the competitors.\nDo you really want to continue? \ No newline at end of file +confirmLosingCompetitorEditsWhenTogglingLogBasedView=This will reset your current, unsaved changes to the competitors.\nDo you really want to continue? +removalOfMarkDisabledMayBeUsedInRaces=Removal deavticated, marks are used in races {0} \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties index da97e2f6c7b..20df9c6f91c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties @@ -1417,4 +1417,5 @@ errorTryingToCreateEmbeddedMap=Fehler beim Erstellen der eingebetteten Karte: {0 transparentBufferLineOnHover=Transparente Pufferlinien bei Maus über Hilfslinien bufferLineStrokeWeight=Linienbreite der Pufferlinien showOnlyCompetitorsOfLog=Nur Teilnehmer aus Log anzeigen -confirmLosingCompetitorEditsWhenTogglingLogBasedView=Damit werden alle aktuellen, noch nicht gespeicherten\nÄnderungen an der Teilnehmerliste zurückgesetzt. Wirklich fortfahren? \ No newline at end of file +confirmLosingCompetitorEditsWhenTogglingLogBasedView=Damit werden alle aktuellen, noch nicht gespeicherten\nÄnderungen an der Teilnehmerliste zurückgesetzt. Wirklich fortfahren? +removalOfMarkDisabledMayBeUsedInRaces=Löschung deaktiviert, Bahnmarke wird in folgenden anderen Wettfahrten benutzt: {0} \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties index 026522ae5fa..4d19bf8c2ed 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties @@ -1348,4 +1348,5 @@ couldNotObtainRace=Could not obtain a race with name {1} for fleet {2} for a reg errorTryingToCreateEmbeddedMap=Error trying to create the embedded map: {0} transparentBufferLineOnHover=Transparent buffer lines on hover of helplines bufferLineStrokeWeight=Buffer line stroke weight -confirmLosingCompetitorEditsWhenTogglingLogBasedView=This will reset your current, unsaved changes to the competitors.\nDo you really want to continue? \ No newline at end of file +confirmLosingCompetitorEditsWhenTogglingLogBasedView=This will reset your current, unsaved changes to the competitors.\nDo you really want to continue? +removalOfMarkDisabledMayBeUsedInRaces=Removal deavticated, marks are used in races {0} \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties index b54771771e2..2dbb521d062 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties @@ -1363,4 +1363,5 @@ couldNotObtainRace=Could not obtain a race with name {1} for fleet {2} for a reg errorTryingToCreateEmbeddedMap=Error trying to create the embedded map: {0} transparentBufferLineOnHover=Transparent buffer lines on hover of helplines bufferLineStrokeWeight=Buffer line stroke weight -confirmLosingCompetitorEditsWhenTogglingLogBasedView=This will reset your current, unsaved changes to the competitors.\nDo you really want to continue? \ No newline at end of file +confirmLosingCompetitorEditsWhenTogglingLogBasedView=This will reset your current, unsaved changes to the competitors.\nDo you really want to continue? +removalOfMarkDisabledMayBeUsedInRaces=Removal deavticated, marks are used in races {0} \ No newline at end of file From 9b1e11b0c9e1ad734a74157414ad76733712d394 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 18 Jan 2016 11:28:05 +0100 Subject: [PATCH 124/165] merged AbstractLogAddDeviceMappingDialog into RegattaLogAddDeviceMappingDialog Change-Id: I776f5d2017c669fdd083a1f9addf06781e2c28bb --- .../AbstractLogAddDeviceMappingDialog.java | 205 ------------------ .../RegattaLogAddDeviceMappingDialog.java | 190 +++++++++++++++- 2 files changed, 180 insertions(+), 215 deletions(-) delete mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractLogAddDeviceMappingDialog.java diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractLogAddDeviceMappingDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractLogAddDeviceMappingDialog.java deleted file mode 100644 index fc3353d32de..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractLogAddDeviceMappingDialog.java +++ /dev/null @@ -1,205 +0,0 @@ -package com.sap.sailing.gwt.ui.adminconsole; - -import java.util.Date; -import java.util.List; - -import com.github.gwtbootstrap.datetimepicker.client.ui.base.HasViewMode.ViewMode; -import com.google.gwt.event.logical.shared.AttachEvent; -import com.google.gwt.event.logical.shared.AttachEvent.Handler; -import com.google.gwt.event.logical.shared.ValueChangeEvent; -import com.google.gwt.event.logical.shared.ValueChangeHandler; -import com.google.gwt.user.client.rpc.AsyncCallback; -import com.google.gwt.user.client.ui.CaptionPanel; -import com.google.gwt.user.client.ui.Grid; -import com.google.gwt.user.client.ui.HorizontalPanel; -import com.google.gwt.user.client.ui.Label; -import com.google.gwt.user.client.ui.ListBox; -import com.google.gwt.user.client.ui.TextBox; -import com.google.gwt.user.client.ui.VerticalPanel; -import com.google.gwt.user.client.ui.Widget; -import com.sap.sailing.domain.common.dto.CompetitorDTO; -import com.sap.sailing.domain.common.racelog.tracking.DeviceMappingConstants; -import com.sap.sailing.domain.common.racelog.tracking.MappableToDevice; -import com.sap.sailing.gwt.ui.adminconsole.ItemToMapToDeviceSelectionPanel.SelectionChangedHandler; -import com.sap.sailing.gwt.ui.client.SailingServiceAsync; -import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sailing.gwt.ui.shared.BetterDateTimeBox; -import com.sap.sailing.gwt.ui.shared.DeviceMappingDTO; -import com.sap.sailing.gwt.ui.shared.MarkDTO; -import com.sap.sse.gwt.client.ErrorReporter; -import com.sap.sse.gwt.client.dialog.DataEntryDialog; - -public abstract class AbstractLogAddDeviceMappingDialog extends DataEntryDialog { - protected final BetterDateTimeBox from; - protected final BetterDateTimeBox to; - protected final ListBox deviceType; - protected final TextBox deviceId; - protected final DeviceMappingQRCodeWidget qrWidget; - protected final StringMessages stringMessages; - protected MappableToDevice selectedItem; - protected final ItemToMapToDeviceSelectionPanel itemSelectionPanel; - protected final SailingServiceAsync sailingService; - protected Grid entryGrid; - - public AbstractLogAddDeviceMappingDialog(SailingServiceAsync sailingService, final ErrorReporter errorReporter, - final StringMessages stringMessages, DialogCallback callback, final DeviceMappingDTO mapping) { - super(stringMessages.add(stringMessages.deviceMappings()), stringMessages.add(stringMessages.deviceMappings()), - stringMessages.add(), stringMessages.cancel(), new DataEntryDialog.Validator() { - @Override - public String getErrorMessage(DeviceMappingDTO valueToValidate) { - String deviceType = valueToValidate.deviceIdentifier.deviceType; - String deviceId = valueToValidate.deviceIdentifier.deviceId; - if (deviceType == null || deviceType.isEmpty()) { - return stringMessages.pleaseEnterA(stringMessages.deviceType()); - } - if (deviceId == null || deviceId.isEmpty()) { - return stringMessages.pleaseEnterA(stringMessages.deviceId()); - } - if ((valueToValidate.from == null || valueToValidate.from.compareTo(new Date(Long.MIN_VALUE)) == 0) - && (valueToValidate.to == null || valueToValidate.to - .compareTo(new Date(Long.MAX_VALUE)) == 0)) { - return stringMessages.atMostOneEndOfTheTimeRangeMayBeOpen(); - } - if (valueToValidate.from != null && valueToValidate.to != null - && valueToValidate.to.before(valueToValidate.from)) { - return stringMessages.startOfTimeRangeMustLieBeforeEnd(); - } - - if (valueToValidate.mappedTo == null) { - return stringMessages.pleaseSelectAnItemToMapTo(); - } - return null; - } - }, true, callback); - - this.stringMessages = stringMessages; - this.sailingService = sailingService; - - from = initTimeBox(); - from.setValue(null); - to = initTimeBox(); - to.setValue(null); - - deviceType = createListBox(false); - sailingService.getDeserializableDeviceIdentifierTypes(new AsyncCallback>() { - @Override - public void onSuccess(List result) { - String typeToPreselect = mapping != null ? mapping.deviceIdentifier.deviceType : null; - int i = 0; - for (String type : result) { - deviceType.addItem(type); - if (type.equals(typeToPreselect)) { - deviceType.setSelectedIndex(i); - } - i++; - } - } - - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError("Could not load deserializable device identifier types: " - + caught.getMessage()); - } - }); - - deviceId = createTextBox(""); - - itemSelectionPanel = new ItemToMapToDeviceSelectionPanel(sailingService, stringMessages, errorReporter, - new SelectionChangedHandler() { - @Override - public void onSelectionChange(MarkDTO mark) { - selectedItem = mark; - qrWidget.setMappedItem(DeviceMappingConstants.URL_MARK_ID_AS_STRING, mark.getIdAsString()); - validate(); - } - - @Override - public void onSelectionChange(CompetitorDTO competitor) { - selectedItem = competitor; - qrWidget.setMappedItem(DeviceMappingConstants.URL_COMPETITOR_ID_AS_STRING, - competitor.getIdAsString()); - validate(); - } - }, mapping != null ? mapping.mappedTo : null); - - if (mapping != null) { - deviceId.setValue(mapping.deviceIdentifier.deviceId); - from.setValue(mapping.from); - to.setValue(mapping.to); - } - - qrWidget = setupQRCodeWidget(); - qrWidget.generateQRCode(); - } - - protected abstract DeviceMappingQRCodeWidget setupQRCodeWidget(); - - protected abstract void loadCompetitorsAndMarks(); - - @Override - protected Widget getAdditionalWidget() { - HorizontalPanel panel = new HorizontalPanel(); - VerticalPanel leftSidePanel = new VerticalPanel(); - entryGrid = new Grid(4, 2); - CaptionPanel entryPanel = new CaptionPanel(stringMessages.mappingDetails()); - CaptionPanel qrPanel = new CaptionPanel(stringMessages.qrCode()); - - entryGrid.setWidget(0, 0, new Label(stringMessages.deviceType())); - entryGrid.setWidget(0, 1, deviceType); - entryGrid.setWidget(1, 0, new Label(stringMessages.deviceId())); - entryGrid.setWidget(1, 1, deviceId); - entryGrid.setWidget(2, 0, new Label(stringMessages.from())); - entryGrid.setWidget(2, 1, from); - entryGrid.setWidget(3, 0, new Label(stringMessages.to())); - entryGrid.setWidget(3, 1, to); - - VerticalPanel qrContentPanel = new VerticalPanel(); - Label explanation = new Label(stringMessages.deviceMappingQrCodeExplanation()); - explanation.setWidth("400px"); - qrContentPanel.add(explanation); - qrContentPanel.add(qrWidget); - - panel.add(leftSidePanel); - panel.add(itemSelectionPanel); - leftSidePanel.add(entryPanel); - leftSidePanel.add(qrPanel); - - entryPanel.setContentWidget(entryGrid); - qrPanel.setContentWidget(qrContentPanel); - - return panel; - } - - private BetterDateTimeBox initTimeBox() { - final BetterDateTimeBox timeBox = new BetterDateTimeBox(); - timeBox.addValueChangeHandler(new ValueChangeHandler() { - @Override - public void onValueChange(ValueChangeEvent event) { - validate(); - } - }); - timeBox.addAttachHandler(new Handler() { - @Override - public void onAttachOrDetach(AttachEvent event) { - if (event.isAttached()) { - addAutoHidePartner(timeBox.getPicker()); - } - } - }); - timeBox.setAutoClose(true); - timeBox.setStartView(ViewMode.HOUR); - timeBox.setFormat("dd/mm/yyyy hh:ii"); - return timeBox; - } - - @Override - protected boolean validate() { - if (super.validate()){ - qrWidget.generateQRCode(); - return true; - } else { - qrWidget.clear(); - return false; - } - } -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogAddDeviceMappingDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogAddDeviceMappingDialog.java index f72cf3bc3b1..9336bd5cef2 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogAddDeviceMappingDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogAddDeviceMappingDialog.java @@ -1,31 +1,149 @@ package com.sap.sailing.gwt.ui.adminconsole; import java.util.Collection; +import java.util.Date; +import java.util.List; +import com.github.gwtbootstrap.datetimepicker.client.ui.base.HasViewMode.ViewMode; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; +import com.google.gwt.event.logical.shared.AttachEvent; +import com.google.gwt.event.logical.shared.AttachEvent.Handler; +import com.google.gwt.event.logical.shared.ValueChangeEvent; +import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.CaptionPanel; +import com.google.gwt.user.client.ui.Grid; +import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.ListBox; +import com.google.gwt.user.client.ui.TextBox; +import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; +import com.sap.sailing.domain.common.dto.CompetitorDTO; import com.sap.sailing.domain.common.racelog.tracking.DeviceMappingConstants; +import com.sap.sailing.domain.common.racelog.tracking.MappableToDevice; import com.sap.sailing.domain.common.racelog.tracking.QRCodeURLCreationException; +import com.sap.sailing.gwt.ui.adminconsole.ItemToMapToDeviceSelectionPanel.SelectionChangedHandler; import com.sap.sailing.gwt.ui.client.GwtUrlHelper; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sailing.gwt.ui.shared.BetterDateTimeBox; import com.sap.sailing.gwt.ui.shared.DeviceIdentifierDTO; import com.sap.sailing.gwt.ui.shared.DeviceMappingDTO; import com.sap.sailing.gwt.ui.shared.EventDTO; +import com.sap.sailing.gwt.ui.shared.MarkDTO; import com.sap.sse.gwt.client.ErrorReporter; import com.sap.sse.gwt.client.controls.GenericListBox; import com.sap.sse.gwt.client.controls.GenericListBox.ValueBuilder; +import com.sap.sse.gwt.client.dialog.DataEntryDialog; -public class RegattaLogAddDeviceMappingDialog extends AbstractLogAddDeviceMappingDialog { +public class RegattaLogAddDeviceMappingDialog extends DataEntryDialog { private final String leaderboardName; private final GenericListBox events; + protected final BetterDateTimeBox from; + protected final BetterDateTimeBox to; + protected final ListBox deviceType; + protected final TextBox deviceId; + protected final DeviceMappingQRCodeWidget qrWidget; + protected final StringMessages stringMessages; + protected MappableToDevice selectedItem; + protected final ItemToMapToDeviceSelectionPanel itemSelectionPanel; + protected final SailingServiceAsync sailingService; + protected Grid entryGrid; + public RegattaLogAddDeviceMappingDialog(SailingServiceAsync sailingService, final ErrorReporter errorReporter, - final StringMessages stringMessages, final String leaderboardName, DialogCallback callback, final DeviceMappingDTO mapping) { - super(sailingService, errorReporter, stringMessages, callback, mapping); + final StringMessages stringMessages, String leaderboardName, DialogCallback callback, + final DeviceMappingDTO mapping) { + super(stringMessages.add(stringMessages.deviceMappings()), stringMessages.add(stringMessages.deviceMappings()), + stringMessages.add(), stringMessages.cancel(), new DataEntryDialog.Validator() { + @Override + public String getErrorMessage(DeviceMappingDTO valueToValidate) { + String deviceType = valueToValidate.deviceIdentifier.deviceType; + String deviceId = valueToValidate.deviceIdentifier.deviceId; + if (deviceType == null || deviceType.isEmpty()) { + return stringMessages.pleaseEnterA(stringMessages.deviceType()); + } + if (deviceId == null || deviceId.isEmpty()) { + return stringMessages.pleaseEnterA(stringMessages.deviceId()); + } + if ((valueToValidate.from == null || valueToValidate.from.compareTo(new Date(Long.MIN_VALUE)) == 0) + && (valueToValidate.to == null || valueToValidate.to + .compareTo(new Date(Long.MAX_VALUE)) == 0)) { + return stringMessages.atMostOneEndOfTheTimeRangeMayBeOpen(); + } + if (valueToValidate.from != null && valueToValidate.to != null + && valueToValidate.to.before(valueToValidate.from)) { + return stringMessages.startOfTimeRangeMustLieBeforeEnd(); + } + + if (valueToValidate.mappedTo == null) { + return stringMessages.pleaseSelectAnItemToMapTo(); + } + return null; + } + }, true, callback); + + this.stringMessages = stringMessages; + this.sailingService = sailingService; + + from = initTimeBox(); + from.setValue(null); + to = initTimeBox(); + to.setValue(null); + + deviceType = createListBox(false); + sailingService.getDeserializableDeviceIdentifierTypes(new AsyncCallback>() { + @Override + public void onSuccess(List result) { + String typeToPreselect = mapping != null ? mapping.deviceIdentifier.deviceType : null; + int i = 0; + for (String type : result) { + deviceType.addItem(type); + if (type.equals(typeToPreselect)) { + deviceType.setSelectedIndex(i); + } + i++; + } + } + + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError("Could not load deserializable device identifier types: " + + caught.getMessage()); + } + }); + + deviceId = createTextBox(""); + + itemSelectionPanel = new ItemToMapToDeviceSelectionPanel(sailingService, stringMessages, errorReporter, + new SelectionChangedHandler() { + @Override + public void onSelectionChange(MarkDTO mark) { + selectedItem = mark; + qrWidget.setMappedItem(DeviceMappingConstants.URL_MARK_ID_AS_STRING, mark.getIdAsString()); + validate(); + } + + @Override + public void onSelectionChange(CompetitorDTO competitor) { + selectedItem = competitor; + qrWidget.setMappedItem(DeviceMappingConstants.URL_COMPETITOR_ID_AS_STRING, + competitor.getIdAsString()); + validate(); + } + }, mapping != null ? mapping.mappedTo : null); + + if (mapping != null) { + deviceId.setValue(mapping.deviceIdentifier.deviceId); + from.setValue(mapping.from); + to.setValue(mapping.to); + } + + qrWidget = setupQRCodeWidget(); + qrWidget.generateQRCode(); + this.leaderboardName = leaderboardName; loadCompetitorsAndMarks(); @@ -56,20 +174,73 @@ public class RegattaLogAddDeviceMappingDialog extends AbstractLogAddDeviceMappin } }); } - + @Override protected Widget getAdditionalWidget() { - Widget panel = super.getAdditionalWidget(); - + HorizontalPanel panel = new HorizontalPanel(); + VerticalPanel leftSidePanel = new VerticalPanel(); + entryGrid = new Grid(4, 2); + CaptionPanel entryPanel = new CaptionPanel(stringMessages.mappingDetails()); + CaptionPanel qrPanel = new CaptionPanel(stringMessages.qrCode()); + entryGrid.setWidget(0, 0, new Label(stringMessages.deviceType())); + entryGrid.setWidget(0, 1, deviceType); + entryGrid.setWidget(1, 0, new Label(stringMessages.deviceId())); + entryGrid.setWidget(1, 1, deviceId); + entryGrid.setWidget(2, 0, new Label(stringMessages.from())); + entryGrid.setWidget(2, 1, from); + entryGrid.setWidget(3, 0, new Label(stringMessages.to())); + entryGrid.setWidget(3, 1, to); + VerticalPanel qrContentPanel = new VerticalPanel(); + Label explanation = new Label(stringMessages.deviceMappingQrCodeExplanation()); + explanation.setWidth("400px"); + qrContentPanel.add(explanation); + qrContentPanel.add(qrWidget); + panel.add(leftSidePanel); + panel.add(itemSelectionPanel); + leftSidePanel.add(entryPanel); + leftSidePanel.add(qrPanel); + entryPanel.setContentWidget(entryGrid); + qrPanel.setContentWidget(qrContentPanel); entryGrid.insertRow(0); entryGrid.setWidget(0, 0, new Label(stringMessages.event())); entryGrid.setWidget(0, 1, events); - return panel; } + private BetterDateTimeBox initTimeBox() { + final BetterDateTimeBox timeBox = new BetterDateTimeBox(); + timeBox.addValueChangeHandler(new ValueChangeHandler() { + @Override + public void onValueChange(ValueChangeEvent event) { + validate(); + } + }); + timeBox.addAttachHandler(new Handler() { + @Override + public void onAttachOrDetach(AttachEvent event) { + if (event.isAttached()) { + addAutoHidePartner(timeBox.getPicker()); + } + } + }); + timeBox.setAutoClose(true); + timeBox.setStartView(ViewMode.HOUR); + timeBox.setFormat("dd/mm/yyyy hh:ii"); + return timeBox; + } + @Override - protected DeviceMappingQRCodeWidget setupQRCodeWidget() { + protected boolean validate() { + if (super.validate()){ + qrWidget.generateQRCode(); + return true; + } else { + qrWidget.clear(); + return false; + } + } + + private DeviceMappingQRCodeWidget setupQRCodeWidget() { return new DeviceMappingQRCodeWidget(stringMessages, new DeviceMappingQRCodeWidget.URLFactory() { @Override public String createURL(String baseUrlWithoutTrailingSlash, String mappedItemType, String mappedItemId) @@ -92,8 +263,7 @@ public class RegattaLogAddDeviceMappingDialog extends AbstractLogAddDeviceMappin return new DeviceMappingDTO(deviceIdentifier, from.getValue(), to.getValue(), selectedItem, null); } - @Override - protected void loadCompetitorsAndMarks() { + private void loadCompetitorsAndMarks() { sailingService.getCompetitorRegistrationsInRegattaLog(leaderboardName, itemSelectionPanel.getSetCompetitorsCallback()); sailingService.getMarksInRegattaLog(leaderboardName, itemSelectionPanel.getSetMarksCallback()); } From e7584e6c90d0447786fa18f5a51e5b15da935601 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 18 Jan 2016 11:34:55 +0100 Subject: [PATCH 125/165] merged AbstractLogTrackingDeviceMappingsDialog into only subclass RegattaLogTrackingDeviceMappingsDialog Change-Id: Ifce7a064817bb90eae1471db933e7db74bb4bcfe --- ...stractLogTrackingDeviceMappingsDialog.java | 228 ------------------ ...egattaLogTrackingDeviceMappingsDialog.java | 220 +++++++++++++++-- 2 files changed, 206 insertions(+), 242 deletions(-) delete mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractLogTrackingDeviceMappingsDialog.java diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractLogTrackingDeviceMappingsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractLogTrackingDeviceMappingsDialog.java deleted file mode 100644 index 4a14ddb6a0e..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractLogTrackingDeviceMappingsDialog.java +++ /dev/null @@ -1,228 +0,0 @@ -package com.sap.sailing.gwt.ui.adminconsole; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import org.moxieapps.gwt.highcharts.client.Axis; -import org.moxieapps.gwt.highcharts.client.AxisTitle; -import org.moxieapps.gwt.highcharts.client.Chart; -import org.moxieapps.gwt.highcharts.client.Global; -import org.moxieapps.gwt.highcharts.client.Highcharts; -import org.moxieapps.gwt.highcharts.client.Legend; -import org.moxieapps.gwt.highcharts.client.Point; -import org.moxieapps.gwt.highcharts.client.Series; -import org.moxieapps.gwt.highcharts.client.ToolTip; -import org.moxieapps.gwt.highcharts.client.ToolTipData; -import org.moxieapps.gwt.highcharts.client.ToolTipFormatter; -import org.moxieapps.gwt.highcharts.client.events.PointMouseOverEvent; -import org.moxieapps.gwt.highcharts.client.events.PointMouseOverEventHandler; -import org.moxieapps.gwt.highcharts.client.plotOptions.SeriesPlotOptions; - -import com.google.gwt.cell.client.FieldUpdater; -import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.event.dom.client.ClickHandler; -import com.google.gwt.json.client.JSONObject; -import com.google.gwt.user.client.ui.Button; -import com.google.gwt.user.client.ui.FlowPanel; -import com.google.gwt.user.client.ui.HorizontalPanel; -import com.google.gwt.user.client.ui.Widget; -import com.google.gwt.view.client.CellPreviewEvent; -import com.sap.sailing.gwt.ui.adminconsole.DeviceMappingTableWrapper.FilterChangedHandler; -import com.sap.sailing.gwt.ui.client.SailingServiceAsync; -import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sailing.gwt.ui.common.client.DateAndTimeFormatterUtil; -import com.sap.sailing.gwt.ui.shared.DeviceMappingDTO; -import com.sap.sailing.gwt.ui.shared.MarkDTO; -import com.sap.sse.gwt.client.ErrorReporter; -import com.sap.sse.gwt.client.dialog.DataEntryDialog; - -public abstract class AbstractLogTrackingDeviceMappingsDialog extends DataEntryDialog { - public static final double PERCENTAGE_OF_TIMESPAN_TO_EXTEND_OPEN_ENDS = 0.1; - public static final String FIELD_INDEX = "index"; - public static final int CHART_WIDTH = 500; - public static final String SERIES_COLOR = "#fcb913"; - - protected ErrorReporter errorReporter; - protected SailingServiceAsync sailingService; - protected StringMessages stringMessages; - protected List mappings = new ArrayList(); - protected DeviceMappingTableWrapper deviceMappingTable; - - private Point[] data; - - private Date latest; - private Date earliest; - private Chart chart; - - - - public AbstractLogTrackingDeviceMappingsDialog(final SailingServiceAsync sailingService, final StringMessages stringMessages, - final ErrorReporter errorReporter, DialogCallback callback) { - super(stringMessages.mapDevices(), /*message*/ null, stringMessages.ok(), stringMessages.cancel(), /*validator*/ null, callback); - - this.stringMessages = stringMessages; - this.sailingService = sailingService; - this.errorReporter = errorReporter; - } - - @Override - protected Widget getAdditionalWidget() { - FlowPanel mainPanel = new FlowPanel(); - - HorizontalPanel buttonPanel = new HorizontalPanel(); - Button addMappingButton = new Button(stringMessages.add()); - addMappingButton.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - addMapping(); - } - }); - buttonPanel.add(addMappingButton); - - Button importBtn = new Button(stringMessages.importFixes()); - importBtn.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - importFixes(); - } - }); - buttonPanel.add(importBtn); - mainPanel.add(buttonPanel); - - deviceMappingTable = new DeviceMappingTableWrapper(sailingService, stringMessages, errorReporter); - - deviceMappingTable.addFilterChangedHandler(new FilterChangedHandler() { - @Override - public void onFilterChanged(List filteredList) { - mappings = filteredList; - updateChart(); - } - }); - deviceMappingTable.getTable().addCellPreviewHandler(new CellPreviewEvent.Handler() { - @Override - public void onCellPreview(CellPreviewEvent event) { - int i = mappings.indexOf(event.getValue()); - chart.getSeries()[0].getPoints()[i].select(true, false); - } - }); - ImagesBarColumn actionCol = - new ImagesBarColumn( - new RaceLogTrackingDeviceMappingsImagesBarCell(stringMessages)); - actionCol.setFieldUpdater(getActionColFieldUpdater()); - deviceMappingTable.getTable().addColumn(actionCol, stringMessages.actions()); - - HorizontalPanel deviceMappingPannel = new HorizontalPanel(); - mainPanel.add(deviceMappingPannel); - - chart = new Chart() - .setType(Series.Type.COLUMN_RANGE) - .setChartTitleText(stringMessages.deviceMappings()) - .setLegend(new Legend().setEnabled(false)) - .setInverted(true); - - chart.setSeriesPlotOptions(new SeriesPlotOptions().setPointMouseOverEventHandler(new PointMouseOverEventHandler() { - @Override - public boolean onMouseOver(PointMouseOverEvent pointMouseOverEvent) { - int i = (int) pointMouseOverEvent.getXAsLong(); - deviceMappingTable.getSelectionModel().setSelected(mappings.get(i), true); - chart.getSeries()[0].getPoints()[i].select(true, false); - return true; - } - }).setColor(SERIES_COLOR)); - - Highcharts.setOptions( - new Highcharts.Options().setGlobal( - new Global() - .setUseUTC(false) - )); - - chart.getXAxis().setOption("labels/enabled", false) - .setGridLineWidth(0) - .setMinorGridLineWidth(0); - - chart.getYAxis() - .setAxisTitle(new AxisTitle().setText(stringMessages.time())) - .setType(Axis.Type.DATE_TIME) - .setGridLineWidth(0) - .setMinorGridLineWidth(0); - - chart.setWidth(CHART_WIDTH + "px"); - chart.setHeight("400px"); - - chart.setToolTip(new ToolTip().setFormatter(new ToolTipFormatter() { - @Override - public String format(ToolTipData toolTipData) { - int index = (int) toolTipData.getXAsLong(); - DeviceMappingDTO mapping = mappings.get(index); - String itemType = mapping.mappedTo instanceof MarkDTO ? stringMessages.mark() : stringMessages.competitor(); - - return "" + stringMessages.device() + ": " + mapping.deviceIdentifier.deviceType + " - " + mapping.deviceIdentifier.deviceId + "
    " + - "" + stringMessages.mappedTo() + ": " + itemType + " - " + mapping.mappedTo + "
    " + - "" + stringMessages.from() + ": " + DateAndTimeFormatterUtil.formatDateAndTime(mapping.from) + "
    " + - "" + stringMessages.to() + ": " + DateAndTimeFormatterUtil.formatDateAndTime(mapping.to); - } - })); - - deviceMappingPannel.add(chart); - deviceMappingPannel.add(deviceMappingTable); - - return mainPanel; - } - - protected abstract FieldUpdater getActionColFieldUpdater(); - - void updateChart() { - earliest = new Date(Long.MAX_VALUE); - latest = new Date(Long.MIN_VALUE); - for (DeviceMappingDTO mapping : mappings) { - updateExtremes(mapping); - } - - data = new Point[mappings.size()]; - long earliestMillis = earliest.getTime(); - long latestMillis = latest.getTime(); - long range = latestMillis - earliestMillis; - long extension = (long) (range * PERCENTAGE_OF_TIMESPAN_TO_EXTEND_OPEN_ENDS); - long yMin = earliestMillis - extension; - long yMax = latestMillis + extension; - - int i = 0; - for (DeviceMappingDTO mapping : mappings) { - JSONObject userData = new JSONObject(); - userData.put(FIELD_INDEX, userData); - - long from = mapping.from == null ? yMin - range : mapping.from.getTime(); - long to = mapping.to == null ? yMax + range : mapping.to.getTime(); - - data[i] = new Point(i, from, to); - - i++; - } - - chart.removeAllSeries(false); - - chart.addSeries(chart.createSeries() - .setName(stringMessages.deviceMappings()) - .setPoints(data)); - - chart.getYAxis().setExtremes(yMin, yMax); - } - - private void updateExtremes(DeviceMappingDTO mapping) { - if (mapping.from != null && earliest.after(mapping.from)) earliest = mapping.from; - if (mapping.to != null && latest.before(mapping.to)) latest = mapping.to; - if (mapping.to != null && earliest.after(mapping.to)) earliest = mapping.to; - if (mapping.from != null && latest.before(mapping.from)) latest = mapping.from; - } - - protected abstract void refresh(); - - protected abstract void showAddMappingDialog(DeviceMappingDTO mapping); - - private void addMapping() { - showAddMappingDialog(null); - } - - protected abstract void importFixes(); -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogTrackingDeviceMappingsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogTrackingDeviceMappingsDialog.java index e14daadfb47..4fa7fffa8ab 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogTrackingDeviceMappingsDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogTrackingDeviceMappingsDialog.java @@ -1,30 +1,227 @@ package com.sap.sailing.gwt.ui.adminconsole; +import java.util.ArrayList; import java.util.Collection; +import java.util.Date; import java.util.List; +import org.moxieapps.gwt.highcharts.client.Axis; +import org.moxieapps.gwt.highcharts.client.AxisTitle; +import org.moxieapps.gwt.highcharts.client.Chart; +import org.moxieapps.gwt.highcharts.client.Global; +import org.moxieapps.gwt.highcharts.client.Highcharts; +import org.moxieapps.gwt.highcharts.client.Legend; +import org.moxieapps.gwt.highcharts.client.Point; +import org.moxieapps.gwt.highcharts.client.Series; +import org.moxieapps.gwt.highcharts.client.ToolTip; +import org.moxieapps.gwt.highcharts.client.ToolTipData; +import org.moxieapps.gwt.highcharts.client.ToolTipFormatter; +import org.moxieapps.gwt.highcharts.client.events.PointMouseOverEvent; +import org.moxieapps.gwt.highcharts.client.events.PointMouseOverEventHandler; +import org.moxieapps.gwt.highcharts.client.plotOptions.SeriesPlotOptions; + import com.google.gwt.cell.client.FieldUpdater; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.json.client.JSONObject; import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Widget; +import com.google.gwt.view.client.CellPreviewEvent; +import com.sap.sailing.gwt.ui.adminconsole.DeviceMappingTableWrapper.FilterChangedHandler; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sailing.gwt.ui.common.client.DateAndTimeFormatterUtil; import com.sap.sailing.gwt.ui.shared.DeviceMappingDTO; +import com.sap.sailing.gwt.ui.shared.MarkDTO; import com.sap.sse.gwt.client.ErrorReporter; import com.sap.sse.gwt.client.dialog.DataEntryDialog; -public class RegattaLogTrackingDeviceMappingsDialog extends AbstractLogTrackingDeviceMappingsDialog { +public class RegattaLogTrackingDeviceMappingsDialog extends DataEntryDialog { protected final String leaderboardName; + public static final double PERCENTAGE_OF_TIMESPAN_TO_EXTEND_OPEN_ENDS = 0.1; + public static final String FIELD_INDEX = "index"; + public static final int CHART_WIDTH = 500; + public static final String SERIES_COLOR = "#fcb913"; + + protected ErrorReporter errorReporter; + protected SailingServiceAsync sailingService; + protected StringMessages stringMessages; + protected List mappings = new ArrayList(); + protected DeviceMappingTableWrapper deviceMappingTable; + + private Point[] data; + + private Date latest; + private Date earliest; + private Chart chart; + public RegattaLogTrackingDeviceMappingsDialog(final SailingServiceAsync sailingService, final StringMessages stringMessages, final ErrorReporter errorReporter, final String leaderboardName, DialogCallback callback) { - - super(sailingService, stringMessages, errorReporter, callback); + super(stringMessages.mapDevices(), /*message*/ null, stringMessages.ok(), stringMessages.cancel(), /*validator*/ null, callback); + this.stringMessages = stringMessages; + this.sailingService = sailingService; + this.errorReporter = errorReporter; this.leaderboardName = leaderboardName; - refresh(); } - + @Override - protected void refresh() { + protected Widget getAdditionalWidget() { + FlowPanel mainPanel = new FlowPanel(); + + HorizontalPanel buttonPanel = new HorizontalPanel(); + Button addMappingButton = new Button(stringMessages.add()); + addMappingButton.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + addMapping(); + } + }); + buttonPanel.add(addMappingButton); + + Button importBtn = new Button(stringMessages.importFixes()); + importBtn.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + importFixes(); + } + }); + buttonPanel.add(importBtn); + mainPanel.add(buttonPanel); + + deviceMappingTable = new DeviceMappingTableWrapper(sailingService, stringMessages, errorReporter); + + deviceMappingTable.addFilterChangedHandler(new FilterChangedHandler() { + @Override + public void onFilterChanged(List filteredList) { + mappings = filteredList; + updateChart(); + } + }); + deviceMappingTable.getTable().addCellPreviewHandler(new CellPreviewEvent.Handler() { + @Override + public void onCellPreview(CellPreviewEvent event) { + int i = mappings.indexOf(event.getValue()); + chart.getSeries()[0].getPoints()[i].select(true, false); + } + }); + ImagesBarColumn actionCol = + new ImagesBarColumn( + new RaceLogTrackingDeviceMappingsImagesBarCell(stringMessages)); + actionCol.setFieldUpdater(getActionColFieldUpdater()); + deviceMappingTable.getTable().addColumn(actionCol, stringMessages.actions()); + + HorizontalPanel deviceMappingPannel = new HorizontalPanel(); + mainPanel.add(deviceMappingPannel); + + chart = new Chart() + .setType(Series.Type.COLUMN_RANGE) + .setChartTitleText(stringMessages.deviceMappings()) + .setLegend(new Legend().setEnabled(false)) + .setInverted(true); + + chart.setSeriesPlotOptions(new SeriesPlotOptions().setPointMouseOverEventHandler(new PointMouseOverEventHandler() { + @Override + public boolean onMouseOver(PointMouseOverEvent pointMouseOverEvent) { + int i = (int) pointMouseOverEvent.getXAsLong(); + deviceMappingTable.getSelectionModel().setSelected(mappings.get(i), true); + chart.getSeries()[0].getPoints()[i].select(true, false); + return true; + } + }).setColor(SERIES_COLOR)); + + Highcharts.setOptions( + new Highcharts.Options().setGlobal( + new Global() + .setUseUTC(false) + )); + + chart.getXAxis().setOption("labels/enabled", false) + .setGridLineWidth(0) + .setMinorGridLineWidth(0); + + chart.getYAxis() + .setAxisTitle(new AxisTitle().setText(stringMessages.time())) + .setType(Axis.Type.DATE_TIME) + .setGridLineWidth(0) + .setMinorGridLineWidth(0); + + chart.setWidth(CHART_WIDTH + "px"); + chart.setHeight("400px"); + + chart.setToolTip(new ToolTip().setFormatter(new ToolTipFormatter() { + @Override + public String format(ToolTipData toolTipData) { + int index = (int) toolTipData.getXAsLong(); + DeviceMappingDTO mapping = mappings.get(index); + String itemType = mapping.mappedTo instanceof MarkDTO ? stringMessages.mark() : stringMessages.competitor(); + + return "" + stringMessages.device() + ": " + mapping.deviceIdentifier.deviceType + " - " + mapping.deviceIdentifier.deviceId + "
    " + + "" + stringMessages.mappedTo() + ": " + itemType + " - " + mapping.mappedTo + "
    " + + "" + stringMessages.from() + ": " + DateAndTimeFormatterUtil.formatDateAndTime(mapping.from) + "
    " + + "" + stringMessages.to() + ": " + DateAndTimeFormatterUtil.formatDateAndTime(mapping.to); + } + })); + + deviceMappingPannel.add(chart); + deviceMappingPannel.add(deviceMappingTable); + + return mainPanel; + } + + void updateChart() { + earliest = new Date(Long.MAX_VALUE); + latest = new Date(Long.MIN_VALUE); + for (DeviceMappingDTO mapping : mappings) { + updateExtremes(mapping); + } + + data = new Point[mappings.size()]; + long earliestMillis = earliest.getTime(); + long latestMillis = latest.getTime(); + long range = latestMillis - earliestMillis; + long extension = (long) (range * PERCENTAGE_OF_TIMESPAN_TO_EXTEND_OPEN_ENDS); + long yMin = earliestMillis - extension; + long yMax = latestMillis + extension; + + int i = 0; + for (DeviceMappingDTO mapping : mappings) { + JSONObject userData = new JSONObject(); + userData.put(FIELD_INDEX, userData); + + long from = mapping.from == null ? yMin - range : mapping.from.getTime(); + long to = mapping.to == null ? yMax + range : mapping.to.getTime(); + + data[i] = new Point(i, from, to); + + i++; + } + + chart.removeAllSeries(false); + + chart.addSeries(chart.createSeries() + .setName(stringMessages.deviceMappings()) + .setPoints(data)); + + chart.getYAxis().setExtremes(yMin, yMax); + } + + private void updateExtremes(DeviceMappingDTO mapping) { + if (mapping.from != null && earliest.after(mapping.from)) earliest = mapping.from; + if (mapping.to != null && latest.before(mapping.to)) latest = mapping.to; + if (mapping.to != null && earliest.after(mapping.to)) earliest = mapping.to; + if (mapping.from != null && latest.before(mapping.from)) latest = mapping.from; + } + + private void addMapping() { + showAddMappingDialog(null); + } + + private void refresh() { sailingService.getDeviceMappings(leaderboardName, new AsyncCallback>() { @Override public void onSuccess(List result) { @@ -40,8 +237,7 @@ public class RegattaLogTrackingDeviceMappingsDialog extends AbstractLogTrackingD }); } - @Override - protected void showAddMappingDialog(DeviceMappingDTO mapping) { + private void showAddMappingDialog(DeviceMappingDTO mapping) { new RegattaLogAddDeviceMappingDialog(sailingService, errorReporter, stringMessages, leaderboardName, new DataEntryDialog.DialogCallback() { @Override @@ -68,8 +264,7 @@ public class RegattaLogTrackingDeviceMappingsDialog extends AbstractLogTrackingD }, mapping).show(); } - @Override - protected void importFixes() { + private void importFixes() { new RegattaLogImportFixesAndAddMappingsDialog(sailingService, errorReporter, stringMessages, leaderboardName, new DataEntryDialog.DialogCallback>() { @@ -97,11 +292,8 @@ public class RegattaLogTrackingDeviceMappingsDialog extends AbstractLogTrackingD }).show(); } - @Override - protected FieldUpdater getActionColFieldUpdater() { - + private FieldUpdater getActionColFieldUpdater() { return new FieldUpdater() { - @Override public void update(int index, final DeviceMappingDTO dto, String value) { if (RaceLogTrackingDeviceMappingsImagesBarCell.ACTION_CLOSE.equals(value)) { From 259f61d96dabfb205204bc85fab940faf20f2855 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 18 Jan 2016 11:38:30 +0100 Subject: [PATCH 126/165] coding conventions in RegattaLogTrackingDeviceMappingsDialog Change-Id: I5a5e2735da23d432d910666522fc27240a4f2532 --- ...egattaLogTrackingDeviceMappingsDialog.java | 42 ++++++++----------- 1 file changed, 17 insertions(+), 25 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogTrackingDeviceMappingsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogTrackingDeviceMappingsDialog.java index 4fa7fffa8ab..41fc25ffad4 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogTrackingDeviceMappingsDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogTrackingDeviceMappingsDialog.java @@ -47,11 +47,11 @@ public class RegattaLogTrackingDeviceMappingsDialog extends DataEntryDialog mappings = new ArrayList(); - protected DeviceMappingTableWrapper deviceMappingTable; + private final ErrorReporter errorReporter; + private final SailingServiceAsync sailingService; + private final StringMessages stringMessages; + private List mappings = new ArrayList<>(); + private DeviceMappingTableWrapper deviceMappingTable; private Point[] data; @@ -72,7 +72,6 @@ public class RegattaLogTrackingDeviceMappingsDialog extends DataEntryDialog filteredList) { @@ -133,26 +130,21 @@ public class RegattaLogTrackingDeviceMappingsDialog extends DataEntryDialog Date: Mon, 18 Jan 2016 12:36:53 +0100 Subject: [PATCH 127/165] introducing equals/hashCode on DeviceMappingDTO; reducing entity comparison for DeviceMappingDTO to its equals/hashCode definition Change-Id: I9ce39fa3f560fd1280100adfe0612cfbe41ef094 --- .../DeviceMappingTableWrapper.java | 15 ++---- ...egattaLogTrackingDeviceMappingsDialog.java | 7 ++- .../gwt/ui/shared/DeviceIdentifierDTO.java | 31 ++++++++++++ .../gwt/ui/shared/DeviceMappingDTO.java | 49 +++++++++++++++++++ 4 files changed, 86 insertions(+), 16 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceMappingTableWrapper.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceMappingTableWrapper.java index 0cd91bd17bb..27de2c2800d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceMappingTableWrapper.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceMappingTableWrapper.java @@ -17,7 +17,6 @@ import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.common.client.DateAndTimeFormatterUtil; import com.sap.sailing.gwt.ui.shared.DeviceMappingDTO; import com.sap.sse.gwt.client.ErrorReporter; -import com.sap.sse.gwt.client.celltable.EntityIdentityComparator; import com.sap.sse.gwt.client.celltable.RefreshableSingleSelectionModel; public class DeviceMappingTableWrapper extends TableWrapper> { @@ -32,17 +31,9 @@ public class DeviceMappingTableWrapper extends TableWrapper() { - @Override - public boolean representSameEntity(DeviceMappingDTO dto1, DeviceMappingDTO dto2) { - return dto1.deviceIdentifier.deviceId.equals(dto2.deviceIdentifier.deviceId) && - dto1.mappedTo.getIdAsString().equals(dto2.mappedTo.getIdAsString()); - } - @Override - public int hashCode(DeviceMappingDTO t) { - return t.deviceIdentifier.deviceId.concat(t.mappedTo.getIdAsString()).hashCode(); - } - }); + /* leaving EntityIdentityComparator null, reducing comparison to equals/hashCode which is well + * defined on DeviceMappingDTO + */ null); showPingMappingsCb = new CheckBox(stringMessages.showPingMarkMappings()); showPingMappingsCb.addValueChangeHandler(new ValueChangeHandler() { @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogTrackingDeviceMappingsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogTrackingDeviceMappingsDialog.java index 41fc25ffad4..7224931137e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogTrackingDeviceMappingsDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogTrackingDeviceMappingsDialog.java @@ -106,13 +106,13 @@ public class RegattaLogTrackingDeviceMappingsDialog extends DataEntryDialog actionCol = + final ImagesBarColumn actionCol = new ImagesBarColumn( new RaceLogTrackingDeviceMappingsImagesBarCell(stringMessages)); actionCol.setFieldUpdater(getActionColFieldUpdater()); deviceMappingTable.getTable().addColumn(actionCol, stringMessages.actions()); - HorizontalPanel deviceMappingPannel = new HorizontalPanel(); + final HorizontalPanel deviceMappingPannel = new HorizontalPanel(); mainPanel.add(deviceMappingPannel); chart = new Chart() @@ -120,7 +120,6 @@ public class RegattaLogTrackingDeviceMappingsDialog extends DataEntryDialog Date: Mon, 18 Jan 2016 15:08:06 +0100 Subject: [PATCH 128/165] replaced use of SailingServiceImpl.sizeOf by Util.isEmpty() and removed sizeOf Change-Id: I2b6a49b897790030618ce73abe5b83f5cf79d90d --- .../gwt/ui/server/SailingServiceImpl.java | 27 ++++--------------- 1 file changed, 5 insertions(+), 22 deletions(-) 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 5ad5fdd5d0d..ce5e236c402 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 @@ -2435,15 +2435,12 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S raceColumn instanceof RaceColumnInSeries ? ((RaceColumnInSeries) raceColumn).getRegatta().getName() : null, raceColumn instanceof RaceColumnInSeries ? ((RaceColumnInSeries) raceColumn).getSeries().getName() : null, fleetDTO, raceColumn.isMedalRace(), raceIdentifier, raceDTO, raceColumn instanceof MetaLeaderboardColumn); - RaceLog raceLog = raceColumn.getRaceLog(fleet); - RaceLogTrackingState raceLogTrackingState = raceLog == null ? RaceLogTrackingState.NOT_A_RACELOG_TRACKED_RACE : + final RaceLog raceLog = raceColumn.getRaceLog(fleet); + final RaceLogTrackingState raceLogTrackingState = raceLog == null ? RaceLogTrackingState.NOT_A_RACELOG_TRACKED_RACE : new RaceLogTrackingStateAnalyzer(raceLog).analyze(); - boolean raceLogTrackerExists = raceLog == null ? false : getService().getRaceTrackerById(raceLog.getId()) != null; - - boolean competitorRegistrationsExist; - competitorRegistrationsExist = raceLog == null ? false : sizeOf(raceColumn.getAllCompetitors(fleet)) > 0 ; - - RaceLogTrackingInfoDTO raceLogTrackingInfo = new RaceLogTrackingInfoDTO(raceLogTrackerExists, + final boolean raceLogTrackerExists = raceLog == null ? false : getService().getRaceTrackerById(raceLog.getId()) != null; + final boolean competitorRegistrationsExist = raceLog == null ? false : !Util.isEmpty(raceColumn.getAllCompetitors(fleet)); + final RaceLogTrackingInfoDTO raceLogTrackingInfo = new RaceLogTrackingInfoDTO(raceLogTrackerExists, competitorRegistrationsExist, raceLogTrackingState); raceColumnDTO.setRaceLogTrackingInfo(fleetDTO, raceLogTrackingInfo); } @@ -2451,20 +2448,6 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S return leaderboardDTO; } - private int sizeOf(Iterable values) { - if (values instanceof Collection) { - return ((Collection)values).size(); - } else { - Iterator it = values.iterator(); - int sum = 0; - while (it.hasNext()) { - it.next(); - sum++; - } - return sum; - } - } - @Override public StrippedLeaderboardDTO updateLeaderboard(String leaderboardName, String newLeaderboardName, String newLeaderboardDisplayName, int[] newDiscardingThresholds, UUID newCourseAreaId) { Leaderboard updatedLeaderboard = getService().apply(new UpdateLeaderboard(leaderboardName, newLeaderboardName, newLeaderboardDisplayName, newDiscardingThresholds, newCourseAreaId)); From c4fb89fb38c78536ace9df37e29dac40de344eb6 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 18 Jan 2016 15:13:24 +0100 Subject: [PATCH 129/165] refined exception list of SailingServiceImpl.denoteForRaceLogTracking Change-Id: Iaf17608e35020c428c629eecf2c5170edb3f97fb --- .../com/sap/sailing/gwt/ui/server/SailingServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 ce5e236c402..b388f232ebf 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 @@ -212,6 +212,7 @@ import com.sap.sailing.domain.common.racelog.RacingProcedureType; import com.sap.sailing.domain.common.racelog.tracking.CompetitorRegistrationOnRaceLogDisabledException; import com.sap.sailing.domain.common.racelog.tracking.DoesNotHaveRegattaLogException; import com.sap.sailing.domain.common.racelog.tracking.MappableToDevice; +import com.sap.sailing.domain.common.racelog.tracking.NotDenotableForRaceLogTrackingException; import com.sap.sailing.domain.common.racelog.tracking.NotDenotedForRaceLogTrackingException; import com.sap.sailing.domain.common.racelog.tracking.RaceLogTrackingState; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; @@ -5014,11 +5015,10 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S @Override public void denoteForRaceLogTracking(String leaderboardName, - String raceColumnName, String fleetName) throws Exception { + String raceColumnName, String fleetName) throws NotFoundException, NotDenotableForRaceLogTrackingException { Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName); RaceColumn raceColumn = getRaceColumn(leaderboardName, raceColumnName); Fleet fleet = getFleetByName(raceColumn, fleetName); - getRaceLogTrackingAdapter().denoteRaceForRaceLogTracking(getService(), leaderboard, raceColumn, fleet, null); } From 7b9321336e3bf964a4ae8efbc5857fc2534ec61c Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 18 Jan 2016 15:21:01 +0100 Subject: [PATCH 130/165] avoid redundant contains/remove double lookup in SailingServiceImpl.findDuplicates Change-Id: I65eba92b15187ae489cbb6c7d59adf8303a41496 --- .../com/sap/sailing/gwt/ui/server/SailingServiceImpl.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) 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 b388f232ebf..e2edfe161fa 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 @@ -5103,13 +5103,10 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S hasRegattaLike.registerCompetitors(competitorsToRegister); } - private HashSet filterDuplicates(Set competitorsToRegister, - HashSet competitorSetToRemove) { - + private HashSet filterDuplicates(Set competitorsToRegister, HashSet competitorSetToRemove) { for (Iterator iterator = competitorSetToRemove.iterator(); iterator.hasNext();) { Competitor competitor = iterator.next(); - if (competitorsToRegister.contains(competitor)){ - competitorsToRegister.remove(competitor); + if (competitorsToRegister.remove(competitor)) { iterator.remove(); } } From d6cd41def9428bfa2c86716f201a707a6cf03911 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 18 Jan 2016 15:29:16 +0100 Subject: [PATCH 131/165] improved Javadoc Change-Id: I86022d11facc9e799ab23a13ba483b5cff482b3e --- .../com/sap/sailing/gwt/ui/server/SailingServiceImpl.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 e2edfe161fa..90526da9276 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 @@ -5125,7 +5125,11 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S } /** - * Also finds the last position of the marks, if set by pinging them + * Also finds the last position of the marks if set by pinging them as long as currently a {@link TrackedRace} exists + * whose tracking interval spans the current time. If at least a non-spanning {@link TrackedRace} can be found in the + * scope of the leaderboard, the time-wise closest position fix for the mark will be used as its position. + * If the mark has been pinged through the {@link RegattaLog} but no {@link TrackedRace} exists that has loaded that ping, + * the ping won't be visible to this API. */ private MarkDTO convertToMarkDTO(LeaderboardThatHasRegattaLike leaderboard, Mark mark) { final TimePoint now = MillisecondsTimePoint.now(); From 22471f9903c1bde2e372205bb2c85a880d79bd7e Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 18 Jan 2016 15:34:38 +0100 Subject: [PATCH 132/165] made a few variables final; removed redundant cast Change-Id: I244d0259aceb4d084d048d0e58292481317da5e6 --- .../gwt/ui/server/SailingServiceImpl.java | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) 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 90526da9276..d8d65389d6b 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 @@ -5823,21 +5823,18 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S */ @Override public Iterable getMarksInRegattaLog(String leaderboardName) throws DoesNotHaveRegattaLogException { - Leaderboard l = getService().getLeaderboardByName(leaderboardName); + final Leaderboard l = getService().getLeaderboardByName(leaderboardName); if (! (l instanceof HasRegattaLike)) { throw new DoesNotHaveRegattaLogException(); } - LeaderboardThatHasRegattaLike leaderboard = (LeaderboardThatHasRegattaLike) l; - RegattaLog regattaLog = ((HasRegattaLike) l).getRegattaLike().getRegattaLog(); - - Set markDTOs = new HashSet<>(); - - List markEvents = new AllEventsOfTypeFinder<>(regattaLog, /* only unrevoked */ true, RegattaLogDefineMarkEvent.class).analyze(); + final LeaderboardThatHasRegattaLike leaderboard = (LeaderboardThatHasRegattaLike) l; + final RegattaLog regattaLog = leaderboard.getRegattaLike().getRegattaLog(); + final Set markDTOs = new HashSet<>(); + final List markEvents = new AllEventsOfTypeFinder<>(regattaLog, /* only unrevoked */ true, RegattaLogDefineMarkEvent.class).analyze(); for (RegattaLogEvent regattaLogEvent : markEvents) { - RegattaLogDefineMarkEvent defineMarkEvent = (RegattaLogDefineMarkEvent) regattaLogEvent; + final RegattaLogDefineMarkEvent defineMarkEvent = (RegattaLogDefineMarkEvent) regattaLogEvent; markDTOs.add(convertToMarkDTO(leaderboard, defineMarkEvent.getMark())); } - return markDTOs; } @@ -5854,23 +5851,19 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S */ private List> getLogHierarchy(String leaderboardName) { List> result = new ArrayList<>(); - Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName); if (leaderboard == null) { return null; } - if (leaderboard instanceof HasRegattaLike) { result.add(((HasRegattaLike) leaderboard).getRegattaLike().getRegattaLog()); } - for (RaceColumn raceColumn : leaderboard.getRaceColumns()) { for (Fleet fleet : raceColumn.getFleets()) { RaceLog raceLog = raceColumn.getRaceLog(fleet); result.add(raceLog); } } - return result; } From aff525180e3edd89e66cbc272fec75410228acbe Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 18 Jan 2016 15:38:37 +0100 Subject: [PATCH 133/165] single point of exit pattern Change-Id: I5c8040a5babc3f4562c116fbb9a041da813b01d6 --- .../gwt/ui/server/SailingServiceImpl.java | 34 ++++++++----------- 1 file changed, 15 insertions(+), 19 deletions(-) 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 d8d65389d6b..d8afdd56601 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 @@ -5850,18 +5850,20 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S * @return */ private List> getLogHierarchy(String leaderboardName) { - List> result = new ArrayList<>(); + final List> result; Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName); if (leaderboard == null) { - return null; - } - if (leaderboard instanceof HasRegattaLike) { - result.add(((HasRegattaLike) leaderboard).getRegattaLike().getRegattaLog()); - } - for (RaceColumn raceColumn : leaderboard.getRaceColumns()) { - for (Fleet fleet : raceColumn.getFleets()) { - RaceLog raceLog = raceColumn.getRaceLog(fleet); - result.add(raceLog); + result = null; + } else { + result = new ArrayList<>(); + if (leaderboard instanceof HasRegattaLike) { + result.add(((HasRegattaLike) leaderboard).getRegattaLike().getRegattaLog()); + } + for (RaceColumn raceColumn : leaderboard.getRaceColumns()) { + for (Fleet fleet : raceColumn.getFleets()) { + RaceLog raceLog = raceColumn.getRaceLog(fleet); + result.add(raceLog); + } } } return result; @@ -5869,15 +5871,9 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S public boolean doesRegattaLogContainCompetitors(String leaderboardName) throws DoesNotHaveRegattaLogException { RegattaLog regattaLog = getRegattaLogInternal(leaderboardName); - - List comeptitorRegistrationEvents = new AllEventsOfTypeFinder<>(regattaLog, /* only unrevoked */ true, RegattaLogRegisterCompetitorEvent.class) - .analyze(); - - if (comeptitorRegistrationEvents.isEmpty()){ - return false; - } else { - return true; - } + List comeptitorRegistrationEvents = new AllEventsOfTypeFinder<>(regattaLog, + /* only unrevoked */ true, RegattaLogRegisterCompetitorEvent.class).analyze(); + return !comeptitorRegistrationEvents.isEmpty(); } @Override From cf9dd8f662763958036f00a5db8a093959b527a9 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 18 Jan 2016 15:40:55 +0100 Subject: [PATCH 134/165] replaced equals check on RaceLog by == Change-Id: I80a7bab98377b63e9068ed48eed36a25089c9a48 --- .../java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 d8afdd56601..951062f46de 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 @@ -5993,7 +5993,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S for (RaceColumn raceColumn : leaderboard.getRaceColumns()) { for (Fleet fleet : raceColumn.getFleets()) { RaceLog raceLog = raceColumn.getRaceLog(fleet); - if (!raceLog.equals(raceLogToIgnore)){ + if (raceLog != raceLogToIgnore) { LastPublishedCourseDesignFinder finder = new LastPublishedCourseDesignFinder(raceLog); CourseBase course = finder.analyze(); for (Waypoint waypoint: course.getWaypoints()){ From a5e4ccb4656c74f28404d77bf82439e1f59be910 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 18 Jan 2016 15:51:00 +0100 Subject: [PATCH 135/165] removed FIXME; append /fleetName to list of races containing mark Change-Id: I62facd34621de2080a94c710ab4d2272b71200ef --- .../ui/adminconsole/RaceLogCourseManagementWidget.java | 5 ++--- .../sap/sailing/gwt/ui/server/SailingServiceImpl.java | 9 ++++----- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCourseManagementWidget.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCourseManagementWidget.java index 0bd6f795127..906ce52d397 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCourseManagementWidget.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCourseManagementWidget.java @@ -126,12 +126,11 @@ public class RaceLogCourseManagementWidget extends CourseManagementWidget { @Override protected void markSelectionChanged() { Set marksToRemove = marks.getSelectionModel().getSelectedSet(); - sailingService.checkIfMarksAreUsedInOtherRaceLogs(leaderboardName, raceColumnName, fleetName, marksToRemove, new AsyncCallback>() { @Override - public void onSuccess(Pairresult) { - if (result.getA()){ + public void onSuccess(Pair result) { + if (result.getA()) { removeMark.setEnabled(false); removeMark.setTitle(stringMessages.removalOfMarkDisabledMayBeUsedInRaces(result.getB())); } else { 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 951062f46de..f64f0291020 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 @@ -5996,11 +5996,10 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S if (raceLog != raceLogToIgnore) { LastPublishedCourseDesignFinder finder = new LastPublishedCourseDesignFinder(raceLog); CourseBase course = finder.analyze(); - for (Waypoint waypoint: course.getWaypoints()){ - for (Mark mark: waypoint.getMarks()){ - if (markIds.contains(mark.getId().toString())){ - //FIXME: check how to infer race name - racesContainingMarksToDeleteInCourse.add(raceColumn.getName()); + for (Waypoint waypoint: course.getWaypoints()) { + for (Mark mark : waypoint.getMarks()){ + if (markIds.contains(mark.getId().toString())) { + racesContainingMarksToDeleteInCourse.add(raceColumn.getName()+"/"+fleet.getName()); marksAreUsedInOtherRaceLogs = true; } } From 16196258c9c11550fa45dd14d62943383c355de0 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 18 Jan 2016 16:34:44 +0100 Subject: [PATCH 136/165] restored DeviceIdentifier serialization/deserialization test functionality from removed RaceLogSerializationTest Change-Id: Icfbf819c7a766ec1035db717fc6cf72bf560f9dd --- .../gwt/ui/server/SailingServiceImpl.java | 2 +- .../DeviceIdentifierSerializationTest.java | 66 +++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/DeviceIdentifierSerializationTest.java 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 f64f0291020..670ee2e6b03 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 @@ -5997,7 +5997,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S LastPublishedCourseDesignFinder finder = new LastPublishedCourseDesignFinder(raceLog); CourseBase course = finder.analyze(); for (Waypoint waypoint: course.getWaypoints()) { - for (Mark mark : waypoint.getMarks()){ + for (Mark mark : waypoint.getMarks()) { if (markIds.contains(mark.getId().toString())) { racesContainingMarksToDeleteInCourse.add(raceColumn.getName()+"/"+fleet.getName()); marksAreUsedInOtherRaceLogs = true; diff --git a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/DeviceIdentifierSerializationTest.java b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/DeviceIdentifierSerializationTest.java new file mode 100644 index 00000000000..76bcf92d04d --- /dev/null +++ b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/DeviceIdentifierSerializationTest.java @@ -0,0 +1,66 @@ +package com.sap.sailing.server.gateway.test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.json.simple.JSONObject; +import org.junit.Before; +import org.junit.Test; + +import com.sap.sailing.domain.racelog.tracking.test.mock.MockEmptyServiceFinder; +import com.sap.sailing.domain.racelog.tracking.test.mock.SmartphoneImeiIdentifier; +import com.sap.sailing.domain.racelog.tracking.test.mock.SmartphoneImeiJsonHandler; +import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; +import com.sap.sailing.domain.racelogtracking.PlaceHolderDeviceIdentifier; +import com.sap.sailing.domain.trackfiles.TrackFileImportDeviceIdentifierImpl; +import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; +import com.sap.sailing.server.gateway.deserialization.impl.DeviceIdentifierJsonDeserializer; +import com.sap.sailing.server.gateway.serialization.impl.DeviceIdentifierJsonSerializer; +import com.sap.sailing.server.gateway.serialization.racelog.tracking.DeviceIdentifierJsonHandler; +import com.sap.sailing.server.gateway.serialization.racelog.tracking.impl.PlaceHolderDeviceIdentifierJsonHandler; +import com.sap.sse.common.TypeBasedServiceFinder; + +public class DeviceIdentifierSerializationTest { + @Before + public void setup() { + } + + @Test + public void testSerializationOfDeviceIdentifier() throws JsonDeserializationException { + final DeviceIdentifierJsonDeserializer myDeserializer = DeviceIdentifierJsonDeserializer.create(new SmartphoneImeiJsonHandler(), SmartphoneImeiIdentifier.TYPE); + final DeviceIdentifierJsonSerializer mySerializer = DeviceIdentifierJsonSerializer.create(new SmartphoneImeiJsonHandler(), SmartphoneImeiIdentifier.TYPE); + DeviceIdentifier device = new SmartphoneImeiIdentifier("abc"); + JSONObject json = mySerializer.serialize(device); + DeviceIdentifier deserialized = myDeserializer.deserialize(json); + assertEquals(device, deserialized); + } + + @Test + public void testSerializationOfDeviceIdentifierWithNoSerializer() throws JsonDeserializationException { + TypeBasedServiceFinder onlyFallback = new MockEmptyServiceFinder<>(); + onlyFallback.setFallbackService(new PlaceHolderDeviceIdentifierJsonHandler()); + final DeviceIdentifierJsonDeserializer myDeserializer = new DeviceIdentifierJsonDeserializer(onlyFallback); + final DeviceIdentifierJsonSerializer mySerializer = DeviceIdentifierJsonSerializer.create(new SmartphoneImeiJsonHandler(), SmartphoneImeiIdentifier.TYPE); + DeviceIdentifier device = new SmartphoneImeiIdentifier("abc"); + JSONObject json = mySerializer.serialize(device); + DeviceIdentifier deserialized = myDeserializer.deserialize(json); + assertTrue(deserialized instanceof PlaceHolderDeviceIdentifier); + assertEquals(device.getStringRepresentation(), deserialized.getStringRepresentation()); + assertEquals(device.getIdentifierType(), deserialized.getIdentifierType()); + } + + @Test + public void testSerializationOfDeviceIdentifierWithNoDeserializer() throws JsonDeserializationException { + TypeBasedServiceFinder onlyFallback = new MockEmptyServiceFinder<>(); + onlyFallback.setFallbackService(new PlaceHolderDeviceIdentifierJsonHandler()); + final DeviceIdentifierJsonDeserializer myDeserializer = DeviceIdentifierJsonDeserializer.create(new SmartphoneImeiJsonHandler(), SmartphoneImeiIdentifier.TYPE); + final DeviceIdentifierJsonSerializer mySerializer = new DeviceIdentifierJsonSerializer(onlyFallback); + //track file device id can't be restored from string rep + DeviceIdentifier device = new TrackFileImportDeviceIdentifierImpl("file", "track"); + JSONObject json = mySerializer.serialize(device); + DeviceIdentifier deserialized = myDeserializer.deserialize(json); + assertTrue(deserialized instanceof PlaceHolderDeviceIdentifier); + assertEquals(device.getStringRepresentation(), deserialized.getStringRepresentation()); + assertEquals(device.getIdentifierType(), deserialized.getIdentifierType()); + } +} From 053268e0d54b37aeb350960988c3a043e0646e61 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 19 Jan 2016 19:57:15 +0100 Subject: [PATCH 137/165] enhanced RaceLogFinishPositioningConfirmedEvent and RaceLogFinishPositioningListChangedEvent by fields for score, rank, comment and finishing time Change-Id: Ib751beb081a1eecfe462919eaa3ce6ea71e56cd3 --- .../impl/DomainObjectFactoryImpl.java | 28 +++++---- .../domain/persistence/impl/FieldNames.java | 4 +- .../impl/MongoObjectFactoryImpl.java | 19 ++++--- .../abstractlog/race/CompetitorResult.java | 30 ++++++++++ .../abstractlog/race/CompetitorResults.java | 13 ++--- .../ConfirmedFinishPositioningListFinder.java | 1 - .../race/impl/CompetitorResultsImpl.java | 8 +-- .../mongodb/test/RaceLogMongoDBTest.java | 13 +++++ ...ingAndRetrievingRaceLogInLeaderboards.java | 57 +++++++++++++------ ...tStoringAndRetrievingRaceLogInRegatta.java | 24 ++------ ...PositioningConfirmedEventDeserializer.java | 30 ++++++---- ...sitioningListChangedEventDeserializer.java | 8 +-- ...shPositioningConfirmedEventSerializer.java | 31 +++++----- ...PositioningListChangedEventSerializer.java | 30 +++++----- ...sitioningConfirmedEventSerializerTest.java | 34 ++++++----- .../server/test/MasterDataImportTest.java | 10 ++-- .../server/impl/RaceLogScoringReplicator.java | 34 +++++------ 17 files changed, 215 insertions(+), 159 deletions(-) create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/CompetitorResult.java diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java index d83d3620927..09de3f6d1e0 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java @@ -57,6 +57,7 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogSuppressedMarkPassingsEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; import com.sap.sailing.domain.abstractlog.race.SimpleRaceLogIdentifier; +import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultImpl; import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultsImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogCourseAreaChangeEventImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogCourseDesignChangedEventImpl; @@ -1568,27 +1569,30 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { } private CompetitorResults loadPositionedCompetitors(BasicDBList dbPositionedCompetitorList) { - CompetitorResults positionedCompetitors = new CompetitorResultsImpl(); + CompetitorResultsImpl positionedCompetitors = new CompetitorResultsImpl(); + int rankCounter = 1; for (Object object : dbPositionedCompetitorList) { DBObject dbObject = (DBObject) object; - - Serializable competitorId = (Serializable) dbObject.get(FieldNames.COMPETITOR_ID.name()); - - String competitorName = (String) dbObject.get(FieldNames.COMPETITOR_DISPLAY_NAME.name()); + final Serializable competitorId = (Serializable) dbObject.get(FieldNames.COMPETITOR_ID.name()); + String competitorDisplayName = (String) dbObject.get(FieldNames.COMPETITOR_DISPLAY_NAME.name()); //The Competitor name is a new field in the list. Therefore the name might be null for existing events. In this case a standard name is set. - if (competitorName == null) { - competitorName = "loaded competitor"; + if (competitorDisplayName == null) { + competitorDisplayName = "loaded competitor"; } - //At this point we do not retrieve the competitor object since at any point in time, especially after a server restart, the DomainFactory and its competitor //cache might be empty. But at this time the race log is loaded from database, so the competitor would be null. //By not using the Competitor object retrieved from the DomainFactory we get completely independent from server restarts and the timepoint of loading //competitors by tracking providers. - - MaxPointsReason maxPointsReason = MaxPointsReason.valueOf((String) dbObject.get(FieldNames.LEADERBOARD_SCORE_CORRECTION_MAX_POINTS_REASON.name())); - - Util.Triple positionedCompetitor = new Util.Triple(competitorId, competitorName, maxPointsReason); + final Integer rank = (Integer) dbObject.get(FieldNames.LEADERBOARD_RANK.name()); + final MaxPointsReason maxPointsReason = MaxPointsReason.valueOf((String) dbObject.get(FieldNames.LEADERBOARD_SCORE_CORRECTION_MAX_POINTS_REASON.name())); + final Double score = (Double) dbObject.get(FieldNames.LEADERBOARD_CORRECTED_SCORE.name()); + final Long finishingTimePointAsMillis = (Long) dbObject.get(FieldNames.RACE_LOG_FINISHING_TIME_AS_MILLIS.name()); + final TimePoint finishingTime = finishingTimePointAsMillis == null ? null : new MillisecondsTimePoint(finishingTimePointAsMillis); + final String comment = (String) dbObject.get(FieldNames.LEADERBOARD_SCORE_CORRECTION_COMMENT.name()); + CompetitorResultImpl positionedCompetitor = new CompetitorResultImpl( + competitorId, competitorDisplayName, rank == null ? rankCounter : rank, maxPointsReason, score, finishingTime, comment); positionedCompetitors.add(positionedCompetitor); + rankCounter++; } return positionedCompetitors; } diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java index 4f9412e8a08..2709a1a64ea 100755 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java @@ -74,7 +74,7 @@ public enum FieldNames { LEADERBOARD_IS_MEDAL_RACE_COLUMN, LEADERBOARD_CARRIED_POINTS, LEADERBOARD_CARRIED_POINTS_BY_ID, LEADERBOARD_SCORE_CORRECTIONS, LEADERBOARD_DISCARDING_THRESHOLDS, LEADERBOARD_SCORE_CORRECTION_MAX_POINTS_REASON, LEADERBOARD_CORRECTED_SCORE, LEADERBOARD_SCORE_CORRECTION_TIMESTAMP, - LEADERBOARD_SCORE_CORRECTION_COMMENT, LEADERBOARD_COLUMN_FACTORS, + LEADERBOARD_RANK, LEADERBOARD_SCORE_CORRECTION_COMMENT, LEADERBOARD_COLUMN_FACTORS, // leaderboard group LEADERBOARD_GROUP_UUID, LEADERBOARD_GROUP_NAME, LEADERBOARD_GROUP_DESCRIPTION, @@ -95,7 +95,7 @@ public enum FieldNames { RACE_LOG_REVOKED_REASON, RACE_LOG_FROM, RACE_LOG_TO, RACE_LOG_MARK, RACE_LOG_DEVICE_MAPPING_EVENT_ID, RACE_LOG_CLOSING_TIMEPOINT, TIMEPOINT_OF_FIXED_MARKPASSING, INDEX_OF_PASSED_WAYPOINT,INDEX_OF_FIRST_SUPPRESSED_WAYPOINT, MARK, RACE_LOG_COMPETITOR_ID, RACE_LOG_DEPDENDENT_ON_FLEET, RACE_LOG_DEPDENDENT_ON_RACECOLUMN, RACE_LOG_DEPDENDENT_ON_REGATTALIKE, - RACE_LOG_START_TIME_DIFFERENCE_IN_MS, + RACE_LOG_START_TIME_DIFFERENCE_IN_MS, RACE_LOG_FINISHING_TIME_AS_MILLIS, /** @deprecated Replaced by WAYPOINT_PASSINGINSTRUCTIONS, still used to migrate old races*/ @Deprecated WAYPOINT_PASSINGSIDE, /** @deprecated Replaced by CONTROLPOINTWITHTWOMARKS_ID, still used to migrate old races*/ @Deprecated GATE_ID, /** @deprecated Replaced by CONTROLPOINTWITHTWOMARKS_NAME, still used to migrate old races*/ @Deprecated GATE_NAME, diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java index 0bbc0721096..f690d7e4e99 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java @@ -19,6 +19,8 @@ import com.mongodb.DBObject; import com.mongodb.WriteConcern; import com.mongodb.util.JSON; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.CompetitorResult; +import com.sap.sailing.domain.abstractlog.race.CompetitorResults; import com.sap.sailing.domain.abstractlog.race.RaceLogCourseAreaChangedEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogDependentStartTimeEvent; @@ -1208,22 +1210,25 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { return result; } - private BasicDBList storePositionedCompetitors(List> positionedCompetitors) { + private BasicDBList storePositionedCompetitors(CompetitorResults positionedCompetitors) { BasicDBList dbList = new BasicDBList(); if (positionedCompetitors != null) { - for (com.sap.sse.common.Util.Triple competitorPair : positionedCompetitors) { + for (CompetitorResult competitorPair : positionedCompetitors) { dbList.add(storePositionedCompetitor(competitorPair)); } } return dbList; } - private DBObject storePositionedCompetitor(com.sap.sse.common.Util.Triple competitorTriple) { + private DBObject storePositionedCompetitor(CompetitorResult competitorResult) { DBObject result = new BasicDBObject(); - result.put(FieldNames.COMPETITOR_ID.name(), competitorTriple.getA()); - result.put(FieldNames.COMPETITOR_DISPLAY_NAME.name(), competitorTriple.getB()); - result.put(FieldNames.LEADERBOARD_SCORE_CORRECTION_MAX_POINTS_REASON.name(), competitorTriple.getC().name()); - + result.put(FieldNames.COMPETITOR_ID.name(), competitorResult.getCompetitorId()); + result.put(FieldNames.COMPETITOR_DISPLAY_NAME.name(), competitorResult.getCompetitorDisplayName()); + result.put(FieldNames.LEADERBOARD_SCORE_CORRECTION_MAX_POINTS_REASON.name(), competitorResult.getMaxPointsReason() == null ? null : competitorResult.getMaxPointsReason().name()); + result.put(FieldNames.LEADERBOARD_CORRECTED_SCORE.name(), competitorResult.getScore()); + result.put(FieldNames.RACE_LOG_FINISHING_TIME_AS_MILLIS.name(), competitorResult.getFinishingTime() == null ? null : competitorResult.getFinishingTime().asMillis()); + result.put(FieldNames.LEADERBOARD_RANK.name(), competitorResult.getOneBasedRank()); + result.put(FieldNames.LEADERBOARD_SCORE_CORRECTION_COMMENT.name(), competitorResult.getComment()); return result; } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/CompetitorResult.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/CompetitorResult.java new file mode 100644 index 00000000000..50c07b9a824 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/CompetitorResult.java @@ -0,0 +1,30 @@ +package com.sap.sailing.domain.abstractlog.race; + +import java.io.Serializable; + +import com.sap.sailing.domain.common.MaxPointsReason; +import com.sap.sse.common.TimePoint; + +/** + * holds the competitor ID, the competitor name, the finishing rank, an optional score, the optional {@link MaxPointReason} and + * an optional finishing time, important for handicapped races. An optional comment for the competitor's result can also be + * provided as a simple {@link String}, such as a reason for a disqualification or a redress given. + * + * @author Axel Uhl (D043530) + * + */ +public interface CompetitorResult extends Serializable { + Serializable getCompetitorId(); + + String getCompetitorDisplayName(); + + int getOneBasedRank(); + + MaxPointsReason getMaxPointsReason(); + + Double getScore(); + + TimePoint getFinishingTime(); + + String getComment(); +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/CompetitorResults.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/CompetitorResults.java index 0cd9baf9035..9abbcae0b33 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/CompetitorResults.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/CompetitorResults.java @@ -1,15 +1,10 @@ package com.sap.sailing.domain.abstractlog.race; -import java.io.Serializable; -import java.util.List; - -import com.sap.sailing.domain.common.MaxPointsReason; -import com.sap.sse.common.Util; /** - * A triple holding the competitor ID, the competitor name and the {@link MaxPointReason} documenting the score for the - * competitor + * A set of competitor results; order does not tell anything about the finishing order which can be seen from + * the {@link CompetitorResult#getRank}. */ -public interface CompetitorResults extends List> { - +public interface CompetitorResults extends Iterable { + boolean add(CompetitorResult result); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/ConfirmedFinishPositioningListFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/ConfirmedFinishPositioningListFinder.java index e1ce52945f6..381df5b1c36 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/ConfirmedFinishPositioningListFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/ConfirmedFinishPositioningListFinder.java @@ -19,7 +19,6 @@ public class ConfirmedFinishPositioningListFinder extends RaceLogAnalyzer> implements CompetitorResults { +public class CompetitorResultsImpl extends ArrayList implements CompetitorResults { private static final long serialVersionUID = 4928351242700897387L; - } diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/RaceLogMongoDBTest.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/RaceLogMongoDBTest.java index 7c94c108303..6abadaf2984 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/RaceLogMongoDBTest.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/RaceLogMongoDBTest.java @@ -4,6 +4,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.net.UnknownHostException; +import java.util.Iterator; import java.util.UUID; import junit.framework.Assert; @@ -11,6 +12,8 @@ import junit.framework.Assert; import org.junit.Before; import com.mongodb.MongoException; +import com.sap.sailing.domain.abstractlog.race.CompetitorResult; +import com.sap.sailing.domain.abstractlog.race.CompetitorResults; import com.sap.sailing.domain.base.ControlPointWithTwoMarks; import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.DomainFactory; @@ -37,6 +40,7 @@ import com.sap.sailing.domain.persistence.PersistenceFactory; import com.sap.sailing.domain.racelog.RaceLogStore; import com.sap.sailing.domain.regattalog.RegattaLogStore; import com.sap.sse.common.TimePoint; +import com.sap.sse.common.Util; public abstract class RaceLogMongoDBTest extends AbstractMongoDBTest { @@ -133,4 +137,13 @@ public abstract class RaceLogMongoDBTest extends AbstractMongoDBTest { return MongoRegattaLogStoreFactory.INSTANCE.getMongoRegattaLogStore(mongoObjectFactory, domainObjectFactory); } + public static void assertCompetitorResultsEqual(final CompetitorResults expectedCompetitorResults, final CompetitorResults loadedCompetitorResults) { + assertEquals(Util.size(expectedCompetitorResults), Util.size(loadedCompetitorResults)); + final Iterator iExpected = expectedCompetitorResults.iterator(); + final Iterator iLoaded = loadedCompetitorResults.iterator(); + while (iExpected.hasNext()) { + assertEquals(iExpected.next(), iLoaded.next()); + } + } + } diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java index 483deeae753..69fceafcff4 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java @@ -7,7 +7,6 @@ import static org.mockito.Mockito.doCallRealMethod; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import java.io.Serializable; import java.net.UnknownHostException; import java.util.UUID; @@ -21,6 +20,7 @@ import com.mongodb.DBObject; import com.mongodb.MongoException; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; +import com.sap.sailing.domain.abstractlog.race.CompetitorResult; import com.sap.sailing.domain.abstractlog.race.CompetitorResults; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogCourseAreaChangedEvent; @@ -39,6 +39,7 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogStartProcedureChangedEvent import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; import com.sap.sailing.domain.abstractlog.race.SimpleRaceLogIdentifier; +import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultImpl; import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultsImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogCourseAreaChangeEventImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogCourseDesignChangedEventImpl; @@ -299,14 +300,11 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD Color.RED, "someone@nowhere.de", null, null, null, /* timeOnTimeFactor */ null, /* timeOnDistanceAllowancePerNauticalMile */ null); CompetitorResults storedPositioningList = new CompetitorResultsImpl(); - storedPositioningList.add(new com.sap.sse.common.Util.Triple(storedCompetitor.getId(), storedCompetitor.getName(), MaxPointsReason.NONE)); - + storedPositioningList.add(new CompetitorResultImpl(storedCompetitor.getId(), storedCompetitor.getName(), /* rank */ + 1, MaxPointsReason.NONE, /* score */ null, /* finishingTimePoint */null, /* comment */null)); RaceLogFinishPositioningConfirmedEvent event = new RaceLogFinishPositioningConfirmedEventImpl(now, author, 0, storedPositioningList); - addAndStoreRaceLogEvent(leaderboard, raceColumnName, event); - RaceLog loadedRaceLog = retrieveRaceLog(); - loadedRaceLog.lockForRead(); try { RaceLogEvent loadedEvent = loadedRaceLog.getFirstRawFix(); @@ -320,14 +318,41 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD } } + @Test + public void testStoreAndRetrieveSimpleLeaderboardWithRaceLogFinishPositioningConfirmedEventWithContents() { + Competitor storedCompetitor = DomainFactory.INSTANCE.getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", + Color.RED, "someone@nowhere.de", null, null, null, + /* timeOnTimeFactor */ null, /* timeOnDistanceAllowancePerNauticalMile */ null); + CompetitorResults storedPositioningList = new CompetitorResultsImpl(); + final TimePoint finishingTimePoint = MillisecondsTimePoint.now(); + final String comment = "This is a comment"; + storedPositioningList.add(new CompetitorResultImpl(storedCompetitor.getId(), storedCompetitor.getName(), /* rank */ + 1, MaxPointsReason.NONE, /* score */ 12.3, finishingTimePoint, comment)); + RaceLogFinishPositioningConfirmedEvent event = new RaceLogFinishPositioningConfirmedEventImpl(now, author, 0, storedPositioningList); + addAndStoreRaceLogEvent(leaderboard, raceColumnName, event); + RaceLog loadedRaceLog = retrieveRaceLog(); + loadedRaceLog.lockForRead(); + try { + RaceLogEvent loadedEvent = loadedRaceLog.getFirstRawFix(); + RaceLogFinishPositioningConfirmedEvent loadedConfirmedEvent = (RaceLogFinishPositioningConfirmedEvent) loadedEvent; + CompetitorResults results = loadedConfirmedEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons(); + assertEquals(1, Util.size(results)); + final CompetitorResult result = results.iterator().next(); + assertEquals(comment, result.getComment()); + assertEquals(12.3, result.getScore(), 0.000001); + assertEquals(MaxPointsReason.NONE, result.getMaxPointsReason()); + assertEquals(1, result.getOneBasedRank()); + assertEquals(finishingTimePoint, result.getFinishingTime()); + } finally { + loadedRaceLog.unlockAfterRead(); + } + } + @Test public void testStoreAndRetrieveSimpleLeaderboardWithBackwardsCompatibleRaceLogFinishPositioningConfirmedEvent() { RaceLogFinishPositioningConfirmedEvent event = new RaceLogFinishPositioningConfirmedEventImpl(now, author, 0, null); - createAndStoreOldRaceLogFinishPositioningConfirmedEventDBEntry(); - RaceLog loadedRaceLog = retrieveRaceLog(); - loadedRaceLog.lockForRead(); try { RaceLogEvent loadedEvent = loadedRaceLog.getFirstRawFix(); @@ -369,8 +394,8 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD Competitor storedCompetitor = DomainFactory.INSTANCE.getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", Color.RED, "someone@nowhere.de", null, null, null, /* timeOnTimeFactor */ null, /* timeOnDistanceAllowancePerNauticalMile */ null); CompetitorResults storedPositioningList = new CompetitorResultsImpl(); - storedPositioningList.add(new com.sap.sse.common.Util.Triple(storedCompetitor.getId(), storedCompetitor.getName(), MaxPointsReason.NONE)); - + storedPositioningList.add(new CompetitorResultImpl(storedCompetitor.getId(), storedCompetitor.getName(), /* rank */ + 1, MaxPointsReason.NONE, /* score */ null, /* finishingTimePoint */null, /* comment */null)); RaceLogFinishPositioningListChangedEvent event = new RaceLogFinishPositioningListChangedEventImpl(now, author, 0, storedPositioningList); addAndStoreRaceLogEvent(leaderboard, raceColumnName, event); @@ -385,10 +410,9 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD assertEquals(event.getPassId(), loadedPositioningEvent.getPassId()); assertEquals(event.getId(), loadedPositioningEvent.getId()); assertEquals(event.getInvolvedBoats().size(), loadedPositioningEvent.getInvolvedBoats().size()); - assertEquals(event.getPositionedCompetitorsIDsNamesMaxPointsReasons().size(), loadedPositioningEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons().size()); - assertEquals(event.getPositionedCompetitorsIDsNamesMaxPointsReasons().get(0).getA(), loadedPositioningEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons().get(0).getA()); - assertEquals(event.getPositionedCompetitorsIDsNamesMaxPointsReasons().get(0).getB(), loadedPositioningEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons().get(0).getB()); - assertEquals(event.getPositionedCompetitorsIDsNamesMaxPointsReasons().get(0).getC().name(), loadedPositioningEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons().get(0).getC().name()); + final CompetitorResults expectedCompetiorResults = event.getPositionedCompetitorsIDsNamesMaxPointsReasons(); + final CompetitorResults loadedCompetitorResults = loadedPositioningEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons(); + assertCompetitorResultsEqual(expectedCompetiorResults, loadedCompetitorResults); assertEquals(1, Util.size(loadedRaceLog.getFixes())); } finally { loadedRaceLog.unlockAfterRead(); @@ -399,11 +423,8 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD public void testStoreAndRetrieveSimpleLeaderboardWithRaceLogCourseAreaChangeEvent() { final UUID uuid = UUID.randomUUID(); RaceLogCourseAreaChangedEvent event = new RaceLogCourseAreaChangeEventImpl(now, author, 0, uuid); - addAndStoreRaceLogEvent(leaderboard, raceColumnName, event); - RaceLog loadedRaceLog = retrieveRaceLog(); - loadedRaceLog.lockForRead(); try { RaceLogEvent loadedEvent = loadedRaceLog.getFirstRawFix(); diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java index dea3c3d63e4..046d7bf82bf 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java @@ -3,7 +3,6 @@ package com.sap.sailing.mongodb.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; -import java.io.Serializable; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; @@ -31,6 +30,7 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogRaceStatusEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogStartProcedureChangedEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; +import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultImpl; import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultsImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogCourseAreaChangeEventImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogCourseDesignChangedEventImpl; @@ -202,14 +202,10 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends AbstractTestStorin Competitor storedCompetitor = DomainFactory.INSTANCE.getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", Color.RED, "someone@nowhere.de", null, null, null, /* timeOnTimeFactor */ null, /* timeOnDistanceAllowancePerNauticalMile */ null); CompetitorResults storedPositioningList = new CompetitorResultsImpl(); - storedPositioningList.add(new com.sap.sse.common.Util.Triple(storedCompetitor.getId(), storedCompetitor.getName(), MaxPointsReason.NONE)); - + storedPositioningList.add(new CompetitorResultImpl(storedCompetitor.getId(), storedCompetitor.getName(), /* rank */ 1, MaxPointsReason.NONE, /* score */ null, /* finishingTime */ null, /* comment */ null)); RaceLogFinishPositioningListChangedEvent event = new RaceLogFinishPositioningListChangedEventImpl(now, author, 0, storedPositioningList); - addAndStoreRaceLogEvent(regatta, raceColumnName, event); - RaceLog loadedRaceLog = retrieveRaceLog(); - loadedRaceLog.lockForRead(); try { RaceLogEvent loadedEvent = loadedRaceLog.getFirstRawFix(); @@ -218,10 +214,7 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends AbstractTestStorin assertEquals(event.getPassId(), loadedPositioningEvent.getPassId()); assertEquals(event.getId(), loadedPositioningEvent.getId()); assertEquals(event.getInvolvedBoats().size(), loadedPositioningEvent.getInvolvedBoats().size()); - assertEquals(event.getPositionedCompetitorsIDsNamesMaxPointsReasons().size(), loadedPositioningEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons().size()); - assertEquals(event.getPositionedCompetitorsIDsNamesMaxPointsReasons().get(0).getA(), loadedPositioningEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons().get(0).getA()); - assertEquals(event.getPositionedCompetitorsIDsNamesMaxPointsReasons().get(0).getB(), loadedPositioningEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons().get(0).getB()); - assertEquals(event.getPositionedCompetitorsIDsNamesMaxPointsReasons().get(0).getC().name(), loadedPositioningEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons().get(0).getC().name()); + assertCompetitorResultsEqual(event.getPositionedCompetitorsIDsNamesMaxPointsReasons(), loadedPositioningEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons()); assertEquals(1, Util.size(loadedRaceLog.getFixes())); } finally { loadedRaceLog.unlockAfterRead(); @@ -233,14 +226,10 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends AbstractTestStorin Competitor storedCompetitor = DomainFactory.INSTANCE.getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", Color.RED, "someone@nowhere.de", null, null, null, /* timeOnTimeFactor */ null, /* timeOnDistanceAllowancePerNauticalMile */ null); CompetitorResults storedPositioningList = new CompetitorResultsImpl(); - storedPositioningList.add(new com.sap.sse.common.Util.Triple(storedCompetitor.getId(), storedCompetitor.getName(), MaxPointsReason.NONE)); - + storedPositioningList.add(new CompetitorResultImpl(storedCompetitor.getId(), storedCompetitor.getName(), /* rank */ 1, MaxPointsReason.NONE, /* score */ null, /* finishingTime */ null, /* comment */ null)); RaceLogFinishPositioningConfirmedEvent event = new RaceLogFinishPositioningConfirmedEventImpl(now, author, 0, storedPositioningList); - addAndStoreRaceLogEvent(regatta, raceColumnName, event); - RaceLog loadedRaceLog = retrieveRaceLog(); - loadedRaceLog.lockForRead(); try { RaceLogEvent loadedEvent = loadedRaceLog.getFirstRawFix(); @@ -249,10 +238,7 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends AbstractTestStorin assertEquals(event.getPassId(), loadedConfirmedEvent.getPassId()); assertEquals(event.getId(), loadedConfirmedEvent.getId()); assertEquals(event.getInvolvedBoats().size(), loadedConfirmedEvent.getInvolvedBoats().size()); - assertEquals(event.getPositionedCompetitorsIDsNamesMaxPointsReasons().size(), loadedConfirmedEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons().size()); - assertEquals(event.getPositionedCompetitorsIDsNamesMaxPointsReasons().get(0).getA(), loadedConfirmedEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons().get(0).getA()); - assertEquals(event.getPositionedCompetitorsIDsNamesMaxPointsReasons().get(0).getB(), loadedConfirmedEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons().get(0).getB()); - assertEquals(event.getPositionedCompetitorsIDsNamesMaxPointsReasons().get(0).getC().name(), loadedConfirmedEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons().get(0).getC().name()); + assertCompetitorResultsEqual(event.getPositionedCompetitorsIDsNamesMaxPointsReasons(), loadedConfirmedEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons()); assertEquals(1, Util.size(loadedRaceLog.getFixes())); } finally { loadedRaceLog.unlockAfterRead(); diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningConfirmedEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningConfirmedEventDeserializer.java index 684435f0f33..9a7c16e46fc 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningConfirmedEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningConfirmedEventDeserializer.java @@ -9,6 +9,7 @@ import org.json.simple.JSONObject; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.race.CompetitorResults; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultImpl; import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultsImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogFinishPositioningConfirmedEventImpl; import com.sap.sailing.domain.base.Competitor; @@ -18,7 +19,7 @@ import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; import com.sap.sailing.server.gateway.deserialization.impl.Helpers; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogFinishPositioningConfirmedEventSerializer; import com.sap.sse.common.TimePoint; -import com.sap.sse.common.Util; +import com.sap.sse.common.impl.MillisecondsTimePoint; public class RaceLogFinishPositioningConfirmedEventDeserializer extends BaseRaceLogEventDeserializer { @@ -38,21 +39,30 @@ public class RaceLogFinishPositioningConfirmedEventDeserializer extends BaseRace private CompetitorResults deserializePositionedCompetitors(JSONArray jsonPositionedCompetitors) throws JsonDeserializationException { CompetitorResults positionedCompetitors = new CompetitorResultsImpl(); - + int rankCounter = 1; for (Object object : jsonPositionedCompetitors) { JSONObject jsonPositionedCompetitor = Helpers.toJSONObjectSafe(object); - Serializable competitorId = (Serializable) jsonPositionedCompetitor.get(RaceLogFinishPositioningConfirmedEventSerializer.FIELD_COMPETITOR_ID); competitorId = Helpers.tryUuidConversion(competitorId); - String competitorName = (String) jsonPositionedCompetitor.get(RaceLogFinishPositioningConfirmedEventSerializer.FIELD_COMPETITOR_NAME); - - String maxPointsReasonName = (String) jsonPositionedCompetitor.get(RaceLogFinishPositioningConfirmedEventSerializer.FIELD_SCORE_CORRECTIONS_MAX_POINTS_REASON); - MaxPointsReason maxPointsReason = MaxPointsReason.valueOf(maxPointsReasonName); - - Util.Triple positionedCompetitor = new Util.Triple(competitorId, competitorName, maxPointsReason); + final String competitorDisplayName = (String) jsonPositionedCompetitor.get(RaceLogFinishPositioningConfirmedEventSerializer.FIELD_COMPETITOR_NAME); + final String maxPointsReasonName = (String) jsonPositionedCompetitor.get(RaceLogFinishPositioningConfirmedEventSerializer.FIELD_SCORE_CORRECTIONS_MAX_POINTS_REASON); + final MaxPointsReason maxPointsReason = MaxPointsReason.valueOf(maxPointsReasonName); + /* + jsonPositionedCompetitor.put(FIELD_SCORE, positionedCompetitor.getScore()); + jsonPositionedCompetitor.put(FIELD_COMMENT, positionedCompetitor.getComment()); + jsonPositionedCompetitor.put(FIELD_RANK, positionedCompetitor.getRank()); + jsonPositionedCompetitor.put(FIELD_FINISHING_TIME_POINT_AS_MILLIS, positionedCompetitor.getFinishingTime() == null ? null : positionedCompetitor.getFinishingTime().asMillis()); + */ + final Integer rank = (Integer) jsonPositionedCompetitor.get(RaceLogFinishPositioningConfirmedEventSerializer.FIELD_RANK); + final Double score = (Double) jsonPositionedCompetitor.get(RaceLogFinishPositioningConfirmedEventSerializer.FIELD_SCORE); + final Long finishingTimePointAsMillis = (Long) jsonPositionedCompetitor.get(RaceLogFinishPositioningConfirmedEventSerializer.FIELD_FINISHING_TIME_POINT_AS_MILLIS); + final TimePoint finishingTime = finishingTimePointAsMillis == null ? null : new MillisecondsTimePoint(finishingTimePointAsMillis); + final String comment = (String) jsonPositionedCompetitor.get(RaceLogFinishPositioningConfirmedEventSerializer.FIELD_COMMENT); + CompetitorResultImpl positionedCompetitor = new CompetitorResultImpl( + competitorId, competitorDisplayName, rank == null ? rankCounter : rank, maxPointsReason, score, finishingTime, comment); + rankCounter++; positionedCompetitors.add(positionedCompetitor); } - return positionedCompetitors; } diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningListChangedEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningListChangedEventDeserializer.java index e0561b41c54..c7a45d47a3d 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningListChangedEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningListChangedEventDeserializer.java @@ -9,6 +9,7 @@ import org.json.simple.JSONObject; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.race.CompetitorResults; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultImpl; import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultsImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogFinishPositioningListChangedEventImpl; import com.sap.sailing.domain.base.Competitor; @@ -18,7 +19,6 @@ import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; import com.sap.sailing.server.gateway.deserialization.impl.Helpers; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogFinishPositioningListChangedEventSerializer; import com.sap.sse.common.TimePoint; -import com.sap.sse.common.Util; public class RaceLogFinishPositioningListChangedEventDeserializer extends BaseRaceLogEventDeserializer { @@ -41,15 +41,13 @@ public class RaceLogFinishPositioningListChangedEventDeserializer extends BaseRa for (Object object : jsonPositionedCompetitors) { JSONObject jsonPositionedCompetitor = Helpers.toJSONObjectSafe(object); - Serializable competitorId = (Serializable) jsonPositionedCompetitor.get(RaceLogFinishPositioningListChangedEventSerializer.FIELD_COMPETITOR_ID); competitorId = Helpers.tryUuidConversion(competitorId); String competitorName = (String) jsonPositionedCompetitor.get(RaceLogFinishPositioningListChangedEventSerializer.FIELD_COMPETITOR_NAME); - String maxPointsReasonName = (String) jsonPositionedCompetitor.get(RaceLogFinishPositioningListChangedEventSerializer.FIELD_SCORE_CORRECTIONS_MAX_POINTS_REASON); MaxPointsReason maxPointsReason = MaxPointsReason.valueOf(maxPointsReasonName); - - Util.Triple positionedCompetitor = new Util.Triple(competitorId, competitorName, maxPointsReason); + CompetitorResultImpl positionedCompetitor = new CompetitorResultImpl( + competitorId, competitorName, /* rank */ 1, maxPointsReason, /* score */ null, /* finishingTime */ null, /* comment */ null); positionedCompetitors.add(positionedCompetitor); } diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogFinishPositioningConfirmedEventSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogFinishPositioningConfirmedEventSerializer.java index d755014ad47..3e2a132ef80 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogFinishPositioningConfirmedEventSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogFinishPositioningConfirmedEventSerializer.java @@ -1,17 +1,14 @@ package com.sap.sailing.server.gateway.serialization.racelog.impl; -import java.io.Serializable; -import java.util.List; - import org.json.simple.JSONArray; import org.json.simple.JSONObject; +import com.sap.sailing.domain.abstractlog.race.CompetitorResult; +import com.sap.sailing.domain.abstractlog.race.CompetitorResults; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.server.gateway.serialization.JsonSerializer; -import com.sap.sse.common.Util; public class RaceLogFinishPositioningConfirmedEventSerializer extends BaseRaceLogEventSerializer { @@ -21,6 +18,10 @@ public class RaceLogFinishPositioningConfirmedEventSerializer extends BaseRaceLo public static final String FIELD_COMPETITOR_ID = "competitorId"; public static final String FIELD_COMPETITOR_NAME = "competitorName"; public static final String FIELD_SCORE_CORRECTIONS_MAX_POINTS_REASON = "maxPointsReason"; + public static final String FIELD_SCORE = "score"; + public static final String FIELD_COMMENT = "comment"; + public static final String FIELD_RANK = "rank"; + public static final String FIELD_FINISHING_TIME_POINT_AS_MILLIS = "finishingTimePointAsMillis"; public RaceLogFinishPositioningConfirmedEventSerializer(JsonSerializer competitorSerializer) { super(competitorSerializer); @@ -34,28 +35,26 @@ public class RaceLogFinishPositioningConfirmedEventSerializer extends BaseRaceLo @Override public JSONObject serialize(RaceLogEvent object) { RaceLogFinishPositioningConfirmedEvent finishPositioningConfirmedEvent = (RaceLogFinishPositioningConfirmedEvent) object; - JSONObject result = super.serialize(finishPositioningConfirmedEvent); - result.put(FIELD_POSITIONED_COMPETITORS, serializePositionedCompetitors(finishPositioningConfirmedEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons())); - return result; } - private JSONArray serializePositionedCompetitors(List> positionedCompetitors) { + private JSONArray serializePositionedCompetitors(CompetitorResults positionedCompetitors) { JSONArray jsonPositionedCompetitors = new JSONArray(); - if (positionedCompetitors != null) { // for backwards compatibility reasons - for (Util.Triple positionedCompetitor : positionedCompetitors) { + for (CompetitorResult positionedCompetitor : positionedCompetitors) { JSONObject jsonPositionedCompetitor = new JSONObject(); - - jsonPositionedCompetitor.put(FIELD_COMPETITOR_ID, positionedCompetitor.getA().toString()); - jsonPositionedCompetitor.put(FIELD_COMPETITOR_NAME, positionedCompetitor.getB()); - jsonPositionedCompetitor.put(FIELD_SCORE_CORRECTIONS_MAX_POINTS_REASON, positionedCompetitor.getC().name()); + jsonPositionedCompetitor.put(FIELD_COMPETITOR_ID, positionedCompetitor.getCompetitorId().toString()); + jsonPositionedCompetitor.put(FIELD_COMPETITOR_NAME, positionedCompetitor.getCompetitorDisplayName()); + jsonPositionedCompetitor.put(FIELD_SCORE_CORRECTIONS_MAX_POINTS_REASON, positionedCompetitor.getMaxPointsReason().name()); + jsonPositionedCompetitor.put(FIELD_SCORE, positionedCompetitor.getScore()); + jsonPositionedCompetitor.put(FIELD_COMMENT, positionedCompetitor.getComment()); + jsonPositionedCompetitor.put(FIELD_RANK, positionedCompetitor.getOneBasedRank()); + jsonPositionedCompetitor.put(FIELD_FINISHING_TIME_POINT_AS_MILLIS, positionedCompetitor.getFinishingTime() == null ? null : positionedCompetitor.getFinishingTime().asMillis()); jsonPositionedCompetitors.add(jsonPositionedCompetitor); } } - return jsonPositionedCompetitors; } diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogFinishPositioningListChangedEventSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogFinishPositioningListChangedEventSerializer.java index 209fd01064f..246999e544f 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogFinishPositioningListChangedEventSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogFinishPositioningListChangedEventSerializer.java @@ -1,17 +1,14 @@ package com.sap.sailing.server.gateway.serialization.racelog.impl; -import java.io.Serializable; -import java.util.List; - import org.json.simple.JSONArray; import org.json.simple.JSONObject; +import com.sap.sailing.domain.abstractlog.race.CompetitorResult; +import com.sap.sailing.domain.abstractlog.race.CompetitorResults; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningListChangedEvent; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.server.gateway.serialization.JsonSerializer; -import com.sap.sse.common.Util; public class RaceLogFinishPositioningListChangedEventSerializer extends BaseRaceLogEventSerializer { @@ -20,6 +17,10 @@ public class RaceLogFinishPositioningListChangedEventSerializer extends BaseRace public static final String FIELD_COMPETITOR_ID = "competitorId"; public static final String FIELD_COMPETITOR_NAME = "competitorName"; public static final String FIELD_SCORE_CORRECTIONS_MAX_POINTS_REASON = "maxPointsReason"; + public static final String FIELD_SCORE = "score"; + public static final String FIELD_COMMENT = "comment"; + public static final String FIELD_RANK = "rank"; + public static final String FIELD_FINISHING_TIME_POINT_AS_MILLIS = "finishingTimePointAsMillis"; public RaceLogFinishPositioningListChangedEventSerializer(JsonSerializer competitorSerializer) { super(competitorSerializer); @@ -33,23 +34,22 @@ public class RaceLogFinishPositioningListChangedEventSerializer extends BaseRace @Override public JSONObject serialize(RaceLogEvent object) { RaceLogFinishPositioningListChangedEvent finishPositioningListEvent = (RaceLogFinishPositioningListChangedEvent) object; - JSONObject result = super.serialize(finishPositioningListEvent); - result.put(FIELD_POSITIONED_COMPETITORS, serializePositionedCompetitors(finishPositioningListEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons())); - return result; } - private JSONArray serializePositionedCompetitors(List> positionedCompetitors) { + private JSONArray serializePositionedCompetitors(CompetitorResults positionedCompetitors) { JSONArray jsonPositionedCompetitors = new JSONArray(); - - for (Util.Triple positionedCompetitor : positionedCompetitors) { + for (CompetitorResult positionedCompetitor : positionedCompetitors) { JSONObject jsonPositionedCompetitor = new JSONObject(); - - jsonPositionedCompetitor.put(FIELD_COMPETITOR_ID, positionedCompetitor.getA().toString()); - jsonPositionedCompetitor.put(FIELD_COMPETITOR_NAME, positionedCompetitor.getB()); - jsonPositionedCompetitor.put(FIELD_SCORE_CORRECTIONS_MAX_POINTS_REASON, positionedCompetitor.getC().name()); + jsonPositionedCompetitor.put(FIELD_COMPETITOR_ID, positionedCompetitor.getCompetitorId().toString()); + jsonPositionedCompetitor.put(FIELD_COMPETITOR_NAME, positionedCompetitor.getCompetitorDisplayName()); + jsonPositionedCompetitor.put(FIELD_SCORE_CORRECTIONS_MAX_POINTS_REASON, positionedCompetitor.getMaxPointsReason().name()); + jsonPositionedCompetitor.put(FIELD_SCORE, positionedCompetitor.getScore()); + jsonPositionedCompetitor.put(FIELD_COMMENT, positionedCompetitor.getComment()); + jsonPositionedCompetitor.put(FIELD_RANK, positionedCompetitor.getOneBasedRank()); + jsonPositionedCompetitor.put(FIELD_FINISHING_TIME_POINT_AS_MILLIS, positionedCompetitor.getFinishingTime() == null ? null : positionedCompetitor.getFinishingTime().asMillis()); jsonPositionedCompetitors.add(jsonPositionedCompetitor); } diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogFinishPositioningConfirmedEventSerializerTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogFinishPositioningConfirmedEventSerializerTest.java index 74e560a6bfd..9735e2dbb04 100644 --- a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogFinishPositioningConfirmedEventSerializerTest.java +++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogFinishPositioningConfirmedEventSerializerTest.java @@ -3,8 +3,9 @@ package com.sap.sailing.server.gateway.serialization.test.racelog; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; -import java.io.Serializable; +import java.util.Iterator; import java.util.UUID; import org.json.simple.JSONObject; @@ -13,8 +14,10 @@ import org.junit.Test; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; +import com.sap.sailing.domain.abstractlog.race.CompetitorResult; import com.sap.sailing.domain.abstractlog.race.CompetitorResults; import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent; +import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultImpl; import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultsImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogFinishPositioningConfirmedEventImpl; import com.sap.sailing.domain.base.DomainFactory; @@ -52,10 +55,19 @@ public class RaceLogFinishPositioningConfirmedEventSerializerTest { positioningList = new CompetitorResultsImpl(); } + public static void assertCompetitorResultsEqual(final CompetitorResults expectedCompetitorResults, final CompetitorResults loadedCompetitorResults) { + assertEquals(Util.size(expectedCompetitorResults), Util.size(loadedCompetitorResults)); + final Iterator iExpected = expectedCompetitorResults.iterator(); + final Iterator iLoaded = loadedCompetitorResults.iterator(); + while (iExpected.hasNext()) { + assertEquals(iExpected.next(), iLoaded.next()); + } + } + @Test public void testSerializeAndDeserializeRaceLogFinishPositioningConfirmedEvent() throws JsonDeserializationException { - positioningList.add(new com.sap.sse.common.Util.Triple(UUID.randomUUID(), "SAP Extreme", - MaxPointsReason.NONE)); + positioningList.add(new CompetitorResultImpl(UUID.randomUUID(), "SAP Extreme", /* rank */ 1, + MaxPointsReason.NONE, /* score */ null, /* finishingTime */ null, /* comment */ null)); event = new RaceLogFinishPositioningConfirmedEventImpl(now, author, 0, positioningList); JSONObject jsonConfirmationEvent = serializer.serialize(event); RaceLogFinishPositioningConfirmedEvent deserializedEvent = (RaceLogFinishPositioningConfirmedEvent) deserializer @@ -68,14 +80,8 @@ public class RaceLogFinishPositioningConfirmedEventSerializerTest { assertEquals(0, Util.size(deserializedEvent.getInvolvedBoats())); assertNotNull(event.getPositionedCompetitorsIDsNamesMaxPointsReasons()); assertNotNull(deserializedEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons()); - assertEquals(1, event.getPositionedCompetitorsIDsNamesMaxPointsReasons().size()); - assertEquals(1, deserializedEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons().size()); - assertEquals(event.getPositionedCompetitorsIDsNamesMaxPointsReasons().get(0).getA(), deserializedEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons() - .get(0).getA()); - assertEquals(event.getPositionedCompetitorsIDsNamesMaxPointsReasons().get(0).getB(), deserializedEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons() - .get(0).getB()); - assertEquals(event.getPositionedCompetitorsIDsNamesMaxPointsReasons().get(0).getC(), deserializedEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons() - .get(0).getC()); + assertEquals(1, Util.size(event.getPositionedCompetitorsIDsNamesMaxPointsReasons())); + assertCompetitorResultsEqual(event.getPositionedCompetitorsIDsNamesMaxPointsReasons(), deserializedEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons()); } @Test @@ -93,7 +99,7 @@ public class RaceLogFinishPositioningConfirmedEventSerializerTest { assertEquals(0, Util.size(deserializedEvent.getInvolvedBoats())); assertNull(event.getPositionedCompetitorsIDsNamesMaxPointsReasons()); assertNotNull(deserializedEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons()); - assertEquals(0, deserializedEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons().size()); + assertTrue(Util.isEmpty(deserializedEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons())); } @Test @@ -111,8 +117,8 @@ public class RaceLogFinishPositioningConfirmedEventSerializerTest { assertEquals(0, Util.size(deserializedEvent.getInvolvedBoats())); assertNotNull(event.getPositionedCompetitorsIDsNamesMaxPointsReasons()); assertNotNull(deserializedEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons()); - assertEquals(0, event.getPositionedCompetitorsIDsNamesMaxPointsReasons().size()); - assertEquals(0, deserializedEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons().size()); + assertTrue(Util.isEmpty(event.getPositionedCompetitorsIDsNamesMaxPointsReasons())); + assertTrue(Util.isEmpty(deserializedEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons())); } } diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java index 4d29a1a5927..03889f1a95b 100644 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java @@ -43,6 +43,7 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent; +import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultImpl; import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultsImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogFinishPositioningConfirmedEventImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogStartTimeEventImpl; @@ -126,7 +127,6 @@ import com.sap.sailing.server.masterdata.DummyTrackedRace; import com.sap.sailing.server.masterdata.MasterDataImporter; import com.sap.sse.common.Color; import com.sap.sse.common.TimePoint; -import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsDurationImpl; import com.sap.sse.common.impl.MillisecondsTimePoint; import com.sap.sse.common.media.MimeType; @@ -847,10 +847,10 @@ public class MasterDataImportTest { // Add a competitor-related race log event to ensure that no competitor resolution is attempted while receiving TimePoint logTimePoint2 = logTimePoint.plus(10); CompetitorResults positionedCompetitors = new CompetitorResultsImpl(); - positionedCompetitors.add(new Util.Triple(competitor.getId(), competitor - .getName(), MaxPointsReason.DNS)); - positionedCompetitors.add(new Util.Triple(competitor2.getId(), - competitor2.getName(), MaxPointsReason.NONE)); + positionedCompetitors.add(new CompetitorResultImpl( + competitor.getId(), competitor.getName(), /* rank */ 1, MaxPointsReason.DNS, /* score */ null, /* finishingTime */ null, /* comment */ null)); + positionedCompetitors.add(new CompetitorResultImpl( + competitor2.getId(), competitor2.getName(), /* rank */ 2, MaxPointsReason.NONE, /* score */ null, /* finishingTime */ null, /* comment */ null)); RaceLogFinishPositioningConfirmedEvent finishPositioningConfirmedEvent = new RaceLogFinishPositioningConfirmedEventImpl( logTimePoint2, author, 1, positionedCompetitors); raceColumn.getRaceLog(testFleet1).add(finishPositioningConfirmedEvent); diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RaceLogScoringReplicator.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RaceLogScoringReplicator.java index 8a9b8b2a725..3f6d6f25102 100644 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RaceLogScoringReplicator.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RaceLogScoringReplicator.java @@ -1,9 +1,9 @@ package com.sap.sailing.server.impl; -import java.io.Serializable; -import java.util.List; import java.util.concurrent.Callable; +import com.sap.sailing.domain.abstractlog.race.CompetitorResult; +import com.sap.sailing.domain.abstractlog.race.CompetitorResults; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent; @@ -112,34 +112,30 @@ public class RaceLogScoringReplicator implements RaceColumnListener { * disqualifications entered by the race committee with the tracked ranks. When a tracked rank for a competitor is * not the same as the rank of the race committee, a score correction is issued. The positioning list contains a * list of competitors sorted by the positioning order when finishing. Additionally a MaxPointsReason might be - * entered by the Race Committee. + * entered by the Race Committee.

    + * + * TODO bug 3420: also extract the optional score / finishing time / comment and make good use of it * * @param timePoint * the TimePoint at which the race committee confirmed their last rank list entered in the app. */ private void checkNeedForScoreCorrectionByResultsOfRaceCommittee(Leaderboard leaderboard, RaceColumn raceColumn, Fleet fleet, RaceLog raceLog, TimePoint timePoint) { - int numberOfCompetitorsInLeaderboard = Util.size(leaderboard.getCompetitors()); int numberOfCompetitorsInRace; - List> positioningList; - + CompetitorResults positioningList; numberOfCompetitorsInRace = getNumberOfCompetitorsInRace(raceColumn, fleet, numberOfCompetitorsInLeaderboard); - ConfirmedFinishPositioningListFinder confirmedPositioningListFinder = new ConfirmedFinishPositioningListFinder(raceLog); positioningList = confirmedPositioningListFinder.analyze(); - if (positioningList == null) { // we expect this case for old sailing events such as ESS Singapore, Quingdao, where the confirmation event did not contain the finish // positioning list FinishPositioningListFinder positioningListFinder = new FinishPositioningListFinder(raceLog); positioningList = positioningListFinder.analyze(); } - if (positioningList != null) { - for (com.sap.sse.common.Util.Triple positionedCompetitor : positioningList) { - Competitor competitor = service.getBaseDomainFactory().getExistingCompetitorById(positionedCompetitor.getA()); - - if (positionedCompetitor.getC().equals(MaxPointsReason.NONE)) { + for (CompetitorResult positionedCompetitor : positioningList) { + Competitor competitor = service.getBaseDomainFactory().getExistingCompetitorById(positionedCompetitor.getCompetitorId()); + if (positionedCompetitor.getMaxPointsReason().equals(MaxPointsReason.NONE)) { try { resetMaxPointsReasonIfNecessary(leaderboard, raceColumn, timePoint, competitor); int rankByRaceCommittee = getRankInPositioningListByRaceCommittee(positioningList, positionedCompetitor); @@ -152,7 +148,6 @@ public class RaceLogScoringReplicator implements RaceColumnListener { setMaxPointsReasonInLeaderboardIfNecessary(leaderboard, raceColumn, timePoint, positionedCompetitor, competitor); } } - //Since the metadata update is used by the Sailing suite to determine the final state of a race, it has to be triggered, even though //no score correction was performed applyMetadataUpdate(leaderboard, timePoint, COMMENT_TEXT_ON_SCORE_CORRECTION); @@ -160,11 +155,10 @@ public class RaceLogScoringReplicator implements RaceColumnListener { } private boolean setMaxPointsReasonInLeaderboardIfNecessary(Leaderboard leaderboard, RaceColumn raceColumn, - TimePoint timePoint, com.sap.sse.common.Util.Triple positionedCompetitor, Competitor competitor) { + TimePoint timePoint, CompetitorResult positionedCompetitor, Competitor competitor) { boolean scoreHasBeenCorrected = false; - MaxPointsReason trackedMaxPointsReason = leaderboard.getMaxPointsReason(competitor, raceColumn, timePoint); - MaxPointsReason maxPointsReasonByRaceCommittee = positionedCompetitor.getC(); + MaxPointsReason maxPointsReasonByRaceCommittee = positionedCompetitor.getMaxPointsReason(); if (!maxPointsReasonByRaceCommittee.equals(trackedMaxPointsReason)) { applyMaxPointsReasonOperation(leaderboard, raceColumn, competitor, maxPointsReasonByRaceCommittee, timePoint); scoreHasBeenCorrected = true; @@ -219,10 +213,10 @@ public class RaceLogScoringReplicator implements RaceColumnListener { * Race Committee. The rank of a competitor according to the Race Committee is represented by the position in the given positioningList * @param positioningList The list containing the competitors. The rank is represented by the position of a competitor in the list * @param positionedCompetitor the competitor whose rank shall be determined - * @return the rank of the given positionedCompetitor + * @return the (one-based) rank of the given positionedCompetitor */ - private int getRankInPositioningListByRaceCommittee(List> positioningList, com.sap.sse.common.Util.Triple positionedCompetitor) { - return positioningList.indexOf(positionedCompetitor) + 1; // indexOf gives the zero-based position requested competitor in the list, + 1 gives the one-based rank + private int getRankInPositioningListByRaceCommittee(CompetitorResults positioningList, CompetitorResult positionedCompetitor) { + return positionedCompetitor.getOneBasedRank(); } private int getNumberOfCompetitorsInRace(RaceColumn raceColumn, Fleet fleet, int numberOfCompetitorsInLeaderboard) { From 3095adc8eeedeff4fe780566d4d64409f6b5f624 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 19 Jan 2016 20:30:33 +0100 Subject: [PATCH 138/165] as suggested by bug 3420 comment #2, refactors common parts of RaceLogFinishPositioning deserialization in gateway bundle Change-Id: I13819430107ef932f5fab433164ec9316f5e78d5 --- ...PositioningConfirmedEventDeserializer.java | 54 ++------------- ...LogFinishPositioningEventDeserializer.java | 65 +++++++++++++++++++ ...sitioningListChangedEventDeserializer.java | 42 ++---------- 3 files changed, 74 insertions(+), 87 deletions(-) create mode 100644 java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningEventDeserializer.java diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningConfirmedEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningConfirmedEventDeserializer.java index 9a7c16e46fc..27bbff64e24 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningConfirmedEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningConfirmedEventDeserializer.java @@ -1,69 +1,23 @@ package com.sap.sailing.server.gateway.deserialization.racelog.impl; import java.io.Serializable; -import java.util.List; - -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.race.CompetitorResults; -import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultImpl; -import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultsImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogFinishPositioningConfirmedEventImpl; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.common.MaxPointsReason; -import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; -import com.sap.sailing.server.gateway.deserialization.impl.Helpers; -import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogFinishPositioningConfirmedEventSerializer; import com.sap.sse.common.TimePoint; -import com.sap.sse.common.impl.MillisecondsTimePoint; -public class RaceLogFinishPositioningConfirmedEventDeserializer extends BaseRaceLogEventDeserializer { +public class RaceLogFinishPositioningConfirmedEventDeserializer extends RaceLogFinishPositioningEventDeserializer { public RaceLogFinishPositioningConfirmedEventDeserializer(JsonDeserializer competitorDeserializer) { super(competitorDeserializer); } - @Override - protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, AbstractLogEventAuthor author, TimePoint timePoint, int passId, List competitors) - throws JsonDeserializationException { - - JSONArray jsonPositionedCompetitors = Helpers.getNestedArraySafe(object, RaceLogFinishPositioningConfirmedEventSerializer.FIELD_POSITIONED_COMPETITORS); - CompetitorResults positionedCompetitors = deserializePositionedCompetitors(jsonPositionedCompetitors); - + protected RaceLogFinishPositioningConfirmedEventImpl createRaceLogFinishPositioningEvent(Serializable id, + TimePoint createdAt, AbstractLogEventAuthor author, TimePoint timePoint, int passId, + CompetitorResults positionedCompetitors) { return new RaceLogFinishPositioningConfirmedEventImpl(createdAt, timePoint, author, id, passId, positionedCompetitors); } - - private CompetitorResults deserializePositionedCompetitors(JSONArray jsonPositionedCompetitors) throws JsonDeserializationException { - CompetitorResults positionedCompetitors = new CompetitorResultsImpl(); - int rankCounter = 1; - for (Object object : jsonPositionedCompetitors) { - JSONObject jsonPositionedCompetitor = Helpers.toJSONObjectSafe(object); - Serializable competitorId = (Serializable) jsonPositionedCompetitor.get(RaceLogFinishPositioningConfirmedEventSerializer.FIELD_COMPETITOR_ID); - competitorId = Helpers.tryUuidConversion(competitorId); - final String competitorDisplayName = (String) jsonPositionedCompetitor.get(RaceLogFinishPositioningConfirmedEventSerializer.FIELD_COMPETITOR_NAME); - final String maxPointsReasonName = (String) jsonPositionedCompetitor.get(RaceLogFinishPositioningConfirmedEventSerializer.FIELD_SCORE_CORRECTIONS_MAX_POINTS_REASON); - final MaxPointsReason maxPointsReason = MaxPointsReason.valueOf(maxPointsReasonName); - /* - jsonPositionedCompetitor.put(FIELD_SCORE, positionedCompetitor.getScore()); - jsonPositionedCompetitor.put(FIELD_COMMENT, positionedCompetitor.getComment()); - jsonPositionedCompetitor.put(FIELD_RANK, positionedCompetitor.getRank()); - jsonPositionedCompetitor.put(FIELD_FINISHING_TIME_POINT_AS_MILLIS, positionedCompetitor.getFinishingTime() == null ? null : positionedCompetitor.getFinishingTime().asMillis()); - */ - final Integer rank = (Integer) jsonPositionedCompetitor.get(RaceLogFinishPositioningConfirmedEventSerializer.FIELD_RANK); - final Double score = (Double) jsonPositionedCompetitor.get(RaceLogFinishPositioningConfirmedEventSerializer.FIELD_SCORE); - final Long finishingTimePointAsMillis = (Long) jsonPositionedCompetitor.get(RaceLogFinishPositioningConfirmedEventSerializer.FIELD_FINISHING_TIME_POINT_AS_MILLIS); - final TimePoint finishingTime = finishingTimePointAsMillis == null ? null : new MillisecondsTimePoint(finishingTimePointAsMillis); - final String comment = (String) jsonPositionedCompetitor.get(RaceLogFinishPositioningConfirmedEventSerializer.FIELD_COMMENT); - CompetitorResultImpl positionedCompetitor = new CompetitorResultImpl( - competitorId, competitorDisplayName, rank == null ? rankCounter : rank, maxPointsReason, score, finishingTime, comment); - rankCounter++; - positionedCompetitors.add(positionedCompetitor); - } - return positionedCompetitors; - } - } diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningEventDeserializer.java new file mode 100644 index 00000000000..ddc073e7cba --- /dev/null +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningEventDeserializer.java @@ -0,0 +1,65 @@ +package com.sap.sailing.server.gateway.deserialization.racelog.impl; + +import java.io.Serializable; +import java.util.List; + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.race.CompetitorResults; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningEvent; +import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultImpl; +import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultsImpl; +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.common.MaxPointsReason; +import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; +import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; +import com.sap.sailing.server.gateway.deserialization.impl.Helpers; +import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogFinishPositioningConfirmedEventSerializer; +import com.sap.sse.common.TimePoint; +import com.sap.sse.common.impl.MillisecondsTimePoint; + +public abstract class RaceLogFinishPositioningEventDeserializer extends BaseRaceLogEventDeserializer { + + public RaceLogFinishPositioningEventDeserializer(JsonDeserializer competitorDeserializer) { + super(competitorDeserializer); + } + + @Override + protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, AbstractLogEventAuthor author, TimePoint timePoint, int passId, List competitors) + throws JsonDeserializationException { + JSONArray jsonPositionedCompetitors = Helpers.getNestedArraySafe(object, RaceLogFinishPositioningConfirmedEventSerializer.FIELD_POSITIONED_COMPETITORS); + CompetitorResults positionedCompetitors = deserializePositionedCompetitors(jsonPositionedCompetitors); + return createRaceLogFinishPositioningEvent(id, createdAt, author, timePoint, passId, positionedCompetitors); + } + + protected abstract RaceLogFinishPositioningEvent createRaceLogFinishPositioningEvent(Serializable id, + TimePoint createdAt, AbstractLogEventAuthor author, TimePoint timePoint, int passId, + CompetitorResults positionedCompetitors); + + private CompetitorResults deserializePositionedCompetitors(JSONArray jsonPositionedCompetitors) throws JsonDeserializationException { + CompetitorResults positionedCompetitors = new CompetitorResultsImpl(); + int rankCounter = 1; + for (Object object : jsonPositionedCompetitors) { + JSONObject jsonPositionedCompetitor = Helpers.toJSONObjectSafe(object); + Serializable competitorId = (Serializable) jsonPositionedCompetitor.get(RaceLogFinishPositioningConfirmedEventSerializer.FIELD_COMPETITOR_ID); + competitorId = Helpers.tryUuidConversion(competitorId); + final String competitorDisplayName = (String) jsonPositionedCompetitor.get(RaceLogFinishPositioningConfirmedEventSerializer.FIELD_COMPETITOR_NAME); + final String maxPointsReasonName = (String) jsonPositionedCompetitor.get(RaceLogFinishPositioningConfirmedEventSerializer.FIELD_SCORE_CORRECTIONS_MAX_POINTS_REASON); + final MaxPointsReason maxPointsReason = MaxPointsReason.valueOf(maxPointsReasonName); + final Integer rank = (Integer) jsonPositionedCompetitor.get(RaceLogFinishPositioningConfirmedEventSerializer.FIELD_RANK); + final Double score = (Double) jsonPositionedCompetitor.get(RaceLogFinishPositioningConfirmedEventSerializer.FIELD_SCORE); + final Long finishingTimePointAsMillis = (Long) jsonPositionedCompetitor.get(RaceLogFinishPositioningConfirmedEventSerializer.FIELD_FINISHING_TIME_POINT_AS_MILLIS); + final TimePoint finishingTime = finishingTimePointAsMillis == null ? null : new MillisecondsTimePoint(finishingTimePointAsMillis); + final String comment = (String) jsonPositionedCompetitor.get(RaceLogFinishPositioningConfirmedEventSerializer.FIELD_COMMENT); + CompetitorResultImpl positionedCompetitor = new CompetitorResultImpl( + competitorId, competitorDisplayName, rank == null ? rankCounter : rank, maxPointsReason, score, finishingTime, comment); + rankCounter++; + positionedCompetitors.add(positionedCompetitor); + } + return positionedCompetitors; + } + +} diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningListChangedEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningListChangedEventDeserializer.java index c7a45d47a3d..76f74ffea6a 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningListChangedEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningListChangedEventDeserializer.java @@ -1,57 +1,25 @@ package com.sap.sailing.server.gateway.deserialization.racelog.impl; import java.io.Serializable; -import java.util.List; - -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.race.CompetitorResults; -import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultImpl; -import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultsImpl; +import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningEvent; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogFinishPositioningListChangedEventImpl; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.common.MaxPointsReason; -import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; -import com.sap.sailing.server.gateway.deserialization.impl.Helpers; -import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogFinishPositioningListChangedEventSerializer; import com.sap.sse.common.TimePoint; -public class RaceLogFinishPositioningListChangedEventDeserializer extends BaseRaceLogEventDeserializer { +public class RaceLogFinishPositioningListChangedEventDeserializer extends RaceLogFinishPositioningEventDeserializer { public RaceLogFinishPositioningListChangedEventDeserializer(JsonDeserializer competitorDeserializer) { super(competitorDeserializer); } @Override - protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, AbstractLogEventAuthor author, TimePoint timePoint, int passId, List competitors) - throws JsonDeserializationException { - - JSONArray jsonPositionedCompetitors = Helpers.getNestedArraySafe(object, RaceLogFinishPositioningListChangedEventSerializer.FIELD_POSITIONED_COMPETITORS); - CompetitorResults positionedCompetitors = deserializePositionedCompetitors(jsonPositionedCompetitors); - + protected RaceLogFinishPositioningEvent createRaceLogFinishPositioningEvent(Serializable id, + TimePoint createdAt, AbstractLogEventAuthor author, TimePoint timePoint, int passId, + CompetitorResults positionedCompetitors) { return new RaceLogFinishPositioningListChangedEventImpl(createdAt, timePoint, author, id, passId, positionedCompetitors); } - - private CompetitorResults deserializePositionedCompetitors(JSONArray jsonPositionedCompetitors) throws JsonDeserializationException { - CompetitorResults positionedCompetitors = new CompetitorResultsImpl(); - - for (Object object : jsonPositionedCompetitors) { - JSONObject jsonPositionedCompetitor = Helpers.toJSONObjectSafe(object); - Serializable competitorId = (Serializable) jsonPositionedCompetitor.get(RaceLogFinishPositioningListChangedEventSerializer.FIELD_COMPETITOR_ID); - competitorId = Helpers.tryUuidConversion(competitorId); - String competitorName = (String) jsonPositionedCompetitor.get(RaceLogFinishPositioningListChangedEventSerializer.FIELD_COMPETITOR_NAME); - String maxPointsReasonName = (String) jsonPositionedCompetitor.get(RaceLogFinishPositioningListChangedEventSerializer.FIELD_SCORE_CORRECTIONS_MAX_POINTS_REASON); - MaxPointsReason maxPointsReason = MaxPointsReason.valueOf(maxPointsReasonName); - CompetitorResultImpl positionedCompetitor = new CompetitorResultImpl( - competitorId, competitorName, /* rank */ 1, maxPointsReason, /* score */ null, /* finishingTime */ null, /* comment */ null); - positionedCompetitors.add(positionedCompetitor); - } - - return positionedCompetitors; - } - } From 3f80eaf66b2ca16f955e374705d1236702957ae8 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 19 Jan 2016 20:42:45 +0100 Subject: [PATCH 139/165] also factored the commonalities of the *serializers* for the RaceLogFinishPositioningEvent types Change-Id: I58eaf0b8c109c6113b3ced1982b1877885b78f2d --- ...shPositioningConfirmedEventSerializer.java | 44 +-------------- ...ceLogFinishPositioningEventSerializer.java | 56 +++++++++++++++++++ ...PositioningListChangedEventSerializer.java | 42 +------------- 3 files changed, 58 insertions(+), 84 deletions(-) create mode 100644 java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogFinishPositioningEventSerializer.java diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogFinishPositioningConfirmedEventSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogFinishPositioningConfirmedEventSerializer.java index 3e2a132ef80..31af1458cf2 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogFinishPositioningConfirmedEventSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogFinishPositioningConfirmedEventSerializer.java @@ -1,28 +1,13 @@ package com.sap.sailing.server.gateway.serialization.racelog.impl; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; - -import com.sap.sailing.domain.abstractlog.race.CompetitorResult; -import com.sap.sailing.domain.abstractlog.race.CompetitorResults; -import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.server.gateway.serialization.JsonSerializer; -public class RaceLogFinishPositioningConfirmedEventSerializer extends BaseRaceLogEventSerializer { +public class RaceLogFinishPositioningConfirmedEventSerializer extends RaceLogFinishPositioningEventSerializer { public static final String VALUE_CLASS = RaceLogFinishPositioningConfirmedEvent.class.getSimpleName(); - public static final String FIELD_POSITIONED_COMPETITORS = "positionedCompetitors"; - public static final String FIELD_COMPETITOR_ID = "competitorId"; - public static final String FIELD_COMPETITOR_NAME = "competitorName"; - public static final String FIELD_SCORE_CORRECTIONS_MAX_POINTS_REASON = "maxPointsReason"; - public static final String FIELD_SCORE = "score"; - public static final String FIELD_COMMENT = "comment"; - public static final String FIELD_RANK = "rank"; - public static final String FIELD_FINISHING_TIME_POINT_AS_MILLIS = "finishingTimePointAsMillis"; - public RaceLogFinishPositioningConfirmedEventSerializer(JsonSerializer competitorSerializer) { super(competitorSerializer); } @@ -31,31 +16,4 @@ public class RaceLogFinishPositioningConfirmedEventSerializer extends BaseRaceLo protected String getClassFieldValue() { return VALUE_CLASS; } - - @Override - public JSONObject serialize(RaceLogEvent object) { - RaceLogFinishPositioningConfirmedEvent finishPositioningConfirmedEvent = (RaceLogFinishPositioningConfirmedEvent) object; - JSONObject result = super.serialize(finishPositioningConfirmedEvent); - result.put(FIELD_POSITIONED_COMPETITORS, serializePositionedCompetitors(finishPositioningConfirmedEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons())); - return result; - } - - private JSONArray serializePositionedCompetitors(CompetitorResults positionedCompetitors) { - JSONArray jsonPositionedCompetitors = new JSONArray(); - if (positionedCompetitors != null) { // for backwards compatibility reasons - for (CompetitorResult positionedCompetitor : positionedCompetitors) { - JSONObject jsonPositionedCompetitor = new JSONObject(); - jsonPositionedCompetitor.put(FIELD_COMPETITOR_ID, positionedCompetitor.getCompetitorId().toString()); - jsonPositionedCompetitor.put(FIELD_COMPETITOR_NAME, positionedCompetitor.getCompetitorDisplayName()); - jsonPositionedCompetitor.put(FIELD_SCORE_CORRECTIONS_MAX_POINTS_REASON, positionedCompetitor.getMaxPointsReason().name()); - jsonPositionedCompetitor.put(FIELD_SCORE, positionedCompetitor.getScore()); - jsonPositionedCompetitor.put(FIELD_COMMENT, positionedCompetitor.getComment()); - jsonPositionedCompetitor.put(FIELD_RANK, positionedCompetitor.getOneBasedRank()); - jsonPositionedCompetitor.put(FIELD_FINISHING_TIME_POINT_AS_MILLIS, positionedCompetitor.getFinishingTime() == null ? null : positionedCompetitor.getFinishingTime().asMillis()); - jsonPositionedCompetitors.add(jsonPositionedCompetitor); - } - } - return jsonPositionedCompetitors; - } - } diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogFinishPositioningEventSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogFinishPositioningEventSerializer.java new file mode 100644 index 00000000000..875fc490c6f --- /dev/null +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogFinishPositioningEventSerializer.java @@ -0,0 +1,56 @@ +package com.sap.sailing.server.gateway.serialization.racelog.impl; + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import com.sap.sailing.domain.abstractlog.race.CompetitorResult; +import com.sap.sailing.domain.abstractlog.race.CompetitorResults; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningEvent; +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.server.gateway.serialization.JsonSerializer; + +public abstract class RaceLogFinishPositioningEventSerializer extends BaseRaceLogEventSerializer { + public static final String FIELD_POSITIONED_COMPETITORS = "positionedCompetitors"; + public static final String FIELD_COMPETITOR_ID = "competitorId"; + public static final String FIELD_COMPETITOR_NAME = "competitorName"; + public static final String FIELD_SCORE_CORRECTIONS_MAX_POINTS_REASON = "maxPointsReason"; + public static final String FIELD_SCORE = "score"; + public static final String FIELD_COMMENT = "comment"; + public static final String FIELD_RANK = "rank"; + public static final String FIELD_FINISHING_TIME_POINT_AS_MILLIS = "finishingTimePointAsMillis"; + + public RaceLogFinishPositioningEventSerializer(JsonSerializer competitorSerializer) { + super(competitorSerializer); + } + + @Override + protected abstract String getClassFieldValue(); + + @Override + public JSONObject serialize(RaceLogEvent object) { + RaceLogFinishPositioningEvent finishPositioningConfirmedEvent = (RaceLogFinishPositioningEvent) object; + JSONObject result = super.serialize(finishPositioningConfirmedEvent); + result.put(FIELD_POSITIONED_COMPETITORS, serializePositionedCompetitors(finishPositioningConfirmedEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons())); + return result; + } + + private JSONArray serializePositionedCompetitors(CompetitorResults positionedCompetitors) { + JSONArray jsonPositionedCompetitors = new JSONArray(); + if (positionedCompetitors != null) { // for backwards compatibility reasons + for (CompetitorResult positionedCompetitor : positionedCompetitors) { + JSONObject jsonPositionedCompetitor = new JSONObject(); + jsonPositionedCompetitor.put(FIELD_COMPETITOR_ID, positionedCompetitor.getCompetitorId().toString()); + jsonPositionedCompetitor.put(FIELD_COMPETITOR_NAME, positionedCompetitor.getCompetitorDisplayName()); + jsonPositionedCompetitor.put(FIELD_SCORE_CORRECTIONS_MAX_POINTS_REASON, positionedCompetitor.getMaxPointsReason().name()); + jsonPositionedCompetitor.put(FIELD_SCORE, positionedCompetitor.getScore()); + jsonPositionedCompetitor.put(FIELD_COMMENT, positionedCompetitor.getComment()); + jsonPositionedCompetitor.put(FIELD_RANK, positionedCompetitor.getOneBasedRank()); + jsonPositionedCompetitor.put(FIELD_FINISHING_TIME_POINT_AS_MILLIS, positionedCompetitor.getFinishingTime() == null ? null : positionedCompetitor.getFinishingTime().asMillis()); + jsonPositionedCompetitors.add(jsonPositionedCompetitor); + } + } + return jsonPositionedCompetitors; + } + +} diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogFinishPositioningListChangedEventSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogFinishPositioningListChangedEventSerializer.java index 246999e544f..bc6c4a3fda2 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogFinishPositioningListChangedEventSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogFinishPositioningListChangedEventSerializer.java @@ -1,26 +1,12 @@ package com.sap.sailing.server.gateway.serialization.racelog.impl; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; - -import com.sap.sailing.domain.abstractlog.race.CompetitorResult; -import com.sap.sailing.domain.abstractlog.race.CompetitorResults; -import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningListChangedEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.server.gateway.serialization.JsonSerializer; -public class RaceLogFinishPositioningListChangedEventSerializer extends BaseRaceLogEventSerializer { +public class RaceLogFinishPositioningListChangedEventSerializer extends RaceLogFinishPositioningEventSerializer { public static final String VALUE_CLASS = RaceLogFinishPositioningListChangedEvent.class.getSimpleName(); - public static final String FIELD_POSITIONED_COMPETITORS = "positionedCompetitors"; - public static final String FIELD_COMPETITOR_ID = "competitorId"; - public static final String FIELD_COMPETITOR_NAME = "competitorName"; - public static final String FIELD_SCORE_CORRECTIONS_MAX_POINTS_REASON = "maxPointsReason"; - public static final String FIELD_SCORE = "score"; - public static final String FIELD_COMMENT = "comment"; - public static final String FIELD_RANK = "rank"; - public static final String FIELD_FINISHING_TIME_POINT_AS_MILLIS = "finishingTimePointAsMillis"; public RaceLogFinishPositioningListChangedEventSerializer(JsonSerializer competitorSerializer) { super(competitorSerializer); @@ -30,30 +16,4 @@ public class RaceLogFinishPositioningListChangedEventSerializer extends BaseRace protected String getClassFieldValue() { return VALUE_CLASS; } - - @Override - public JSONObject serialize(RaceLogEvent object) { - RaceLogFinishPositioningListChangedEvent finishPositioningListEvent = (RaceLogFinishPositioningListChangedEvent) object; - JSONObject result = super.serialize(finishPositioningListEvent); - result.put(FIELD_POSITIONED_COMPETITORS, serializePositionedCompetitors(finishPositioningListEvent.getPositionedCompetitorsIDsNamesMaxPointsReasons())); - return result; - } - - private JSONArray serializePositionedCompetitors(CompetitorResults positionedCompetitors) { - JSONArray jsonPositionedCompetitors = new JSONArray(); - for (CompetitorResult positionedCompetitor : positionedCompetitors) { - JSONObject jsonPositionedCompetitor = new JSONObject(); - jsonPositionedCompetitor.put(FIELD_COMPETITOR_ID, positionedCompetitor.getCompetitorId().toString()); - jsonPositionedCompetitor.put(FIELD_COMPETITOR_NAME, positionedCompetitor.getCompetitorDisplayName()); - jsonPositionedCompetitor.put(FIELD_SCORE_CORRECTIONS_MAX_POINTS_REASON, positionedCompetitor.getMaxPointsReason().name()); - jsonPositionedCompetitor.put(FIELD_SCORE, positionedCompetitor.getScore()); - jsonPositionedCompetitor.put(FIELD_COMMENT, positionedCompetitor.getComment()); - jsonPositionedCompetitor.put(FIELD_RANK, positionedCompetitor.getOneBasedRank()); - jsonPositionedCompetitor.put(FIELD_FINISHING_TIME_POINT_AS_MILLIS, positionedCompetitor.getFinishingTime() == null ? null : positionedCompetitor.getFinishingTime().asMillis()); - jsonPositionedCompetitors.add(jsonPositionedCompetitor); - } - - return jsonPositionedCompetitors; - } - } From 471b8585b7097c6cd6f98be0baf58e8eadf97fd3 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 19 Jan 2016 20:48:04 +0100 Subject: [PATCH 140/165] if an explicit score is provided in the RaceLogFinishPositioningEvent object, it is applied in the score correction (bug 3420) Change-Id: Iedb4388168024c0f581b96149c295dcb57fb66f0 --- .../server/impl/RaceLogScoringReplicator.java | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RaceLogScoringReplicator.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RaceLogScoringReplicator.java index 3f6d6f25102..e7e3f443243 100644 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RaceLogScoringReplicator.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RaceLogScoringReplicator.java @@ -138,9 +138,9 @@ public class RaceLogScoringReplicator implements RaceColumnListener { if (positionedCompetitor.getMaxPointsReason().equals(MaxPointsReason.NONE)) { try { resetMaxPointsReasonIfNecessary(leaderboard, raceColumn, timePoint, competitor); - int rankByRaceCommittee = getRankInPositioningListByRaceCommittee(positioningList, positionedCompetitor); + int rankByRaceCommittee = getRankInPositioningListByRaceCommittee(positionedCompetitor); correctScoreInLeaderboard(leaderboard, raceColumn, timePoint, numberOfCompetitorsInRace, - competitor, rankByRaceCommittee); + competitor, rankByRaceCommittee, positionedCompetitor.getScore()); } catch (NoWindException ex) { ex.printStackTrace(); } @@ -166,22 +166,23 @@ public class RaceLogScoringReplicator implements RaceColumnListener { return scoreHasBeenCorrected; } - private boolean correctScoreInLeaderboard(Leaderboard leaderboard, RaceColumn raceColumn, TimePoint timePoint, + private void correctScoreInLeaderboard(Leaderboard leaderboard, RaceColumn raceColumn, TimePoint timePoint, final int numberOfCompetitorsInRace, - Competitor competitor, int rankByRaceCommittee) throws NoWindException { - boolean scoreHasBeenCorrected = false; - Double scoreByRaceCommittee = leaderboard.getScoringScheme().getScoreForRank(leaderboard, raceColumn, competitor, + Competitor competitor, int rankByRaceCommittee, Double optionalExplicitScore) throws NoWindException { + final Double scoreByRaceCommittee; + if (optionalExplicitScore == null) { + scoreByRaceCommittee = leaderboard.getScoringScheme().getScoreForRank(leaderboard, raceColumn, competitor, rankByRaceCommittee, new Callable() { @Override public Integer call() { return numberOfCompetitorsInRace; } }, leaderboard.getNumberOfCompetitorsInLeaderboardFetcher(), timePoint); - + } else { + scoreByRaceCommittee = optionalExplicitScore; + } // Do ALWAYS apply score corrections from race committee applyScoreCorrectionOperation(leaderboard, raceColumn, competitor, scoreByRaceCommittee, timePoint); - scoreHasBeenCorrected = true; - return scoreHasBeenCorrected; } private boolean resetMaxPointsReasonIfNecessary(Leaderboard leaderboard, RaceColumn raceColumn, TimePoint timePoint, Competitor competitor) { @@ -209,13 +210,16 @@ public class RaceLogScoringReplicator implements RaceColumnListener { } /** - * The positioning list contains a list of competitors sorted by the positioning order when finishing. Additionally a MaxPointsReason might be entered by the - * Race Committee. The rank of a competitor according to the Race Committee is represented by the position in the given positioningList - * @param positioningList The list containing the competitors. The rank is represented by the position of a competitor in the list - * @param positionedCompetitor the competitor whose rank shall be determined + * The positioning list contains a list of competitors sorted by the positioning order when finishing. Additionally + * a MaxPointsReason might be entered by the Race Committee. The rank of a competitor according to the Race + * Committee used to be represented by the position in the list in earlier versions; now it is made explicit in the + * {@link CompetitorResult#getOneBasedRank()} attribute. + * @param positionedCompetitor + * the competitor whose rank shall be determined + * * @return the (one-based) rank of the given positionedCompetitor */ - private int getRankInPositioningListByRaceCommittee(CompetitorResults positioningList, CompetitorResult positionedCompetitor) { + private int getRankInPositioningListByRaceCommittee(CompetitorResult positionedCompetitor) { return positionedCompetitor.getOneBasedRank(); } From 86c494204927e16209595ea6f3b6f619e59974f2 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 20 Jan 2016 08:40:58 +0100 Subject: [PATCH 141/165] added missing COmpetitorResultImpl class Change-Id: I2c08a429851c3604f5f0f8718b52174d30be027a --- .../race/impl/CompetitorResultImpl.java | 135 ++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/CompetitorResultImpl.java diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/CompetitorResultImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/CompetitorResultImpl.java new file mode 100644 index 00000000000..da8728f267b --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/CompetitorResultImpl.java @@ -0,0 +1,135 @@ +package com.sap.sailing.domain.abstractlog.race.impl; + +import java.io.Serializable; + +import com.sap.sailing.domain.abstractlog.race.CompetitorResult; +import com.sap.sailing.domain.common.MaxPointsReason; +import com.sap.sse.common.TimePoint; + +public class CompetitorResultImpl implements CompetitorResult { + private static final long serialVersionUID = 4928351242700897387L; + + private final Serializable competitorId; + + private final String competitorDisplayName; + + private final int oneBasedRank; + + private final MaxPointsReason maxPointsReason; + + private final Double score; + + private final TimePoint finishingTime; + + private final String comment; + + public CompetitorResultImpl(Serializable competitorId, String competitorDisplayName, int oneBasedRank, + MaxPointsReason maxPointsReason, Double score, TimePoint finishingTime, String comment) { + super(); + this.competitorId = competitorId; + this.competitorDisplayName = competitorDisplayName; + this.oneBasedRank = oneBasedRank; + this.maxPointsReason = maxPointsReason; + this.score = score; + this.finishingTime = finishingTime; + this.comment = comment; + } + + @Override + public Serializable getCompetitorId() { + return competitorId; + } + + @Override + public String getCompetitorDisplayName() { + return competitorDisplayName; + } + + @Override + public int getOneBasedRank() { + return oneBasedRank; + } + + @Override + public MaxPointsReason getMaxPointsReason() { + return maxPointsReason; + } + + @Override + public Double getScore() { + return score; + } + + @Override + public TimePoint getFinishingTime() { + return finishingTime; + } + + @Override + public String getComment() { + return comment; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((comment == null) ? 0 : comment.hashCode()); + result = prime * result + ((competitorDisplayName == null) ? 0 : competitorDisplayName.hashCode()); + result = prime * result + ((competitorId == null) ? 0 : competitorId.hashCode()); + result = prime * result + ((finishingTime == null) ? 0 : finishingTime.hashCode()); + result = prime * result + ((maxPointsReason == null) ? 0 : maxPointsReason.hashCode()); + result = prime * result + oneBasedRank; + result = prime * result + ((score == null) ? 0 : score.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + CompetitorResultImpl other = (CompetitorResultImpl) obj; + if (comment == null) { + if (other.comment != null) + return false; + } else if (!comment.equals(other.comment)) + return false; + if (competitorDisplayName == null) { + if (other.competitorDisplayName != null) + return false; + } else if (!competitorDisplayName.equals(other.competitorDisplayName)) + return false; + if (competitorId == null) { + if (other.competitorId != null) + return false; + } else if (!competitorId.equals(other.competitorId)) + return false; + if (finishingTime == null) { + if (other.finishingTime != null) + return false; + } else if (!finishingTime.equals(other.finishingTime)) + return false; + if (maxPointsReason != other.maxPointsReason) + return false; + if (oneBasedRank != other.oneBasedRank) + return false; + if (score == null) { + if (other.score != null) + return false; + } else if (!score.equals(other.score)) + return false; + return true; + } + + @Override + public String toString() { + return "CompetitorResultImpl [competitorId=" + competitorId + ", competitorName=" + competitorDisplayName + ", rank=" + + oneBasedRank + ", maxPointsReason=" + maxPointsReason + ", score=" + score + ", finishingTime=" + + finishingTime + ", comment=" + comment + "]"; + } + +} From e5eb4f19b3dc851f03aa056bb49989ba826b0726 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 20 Jan 2016 10:14:35 +0100 Subject: [PATCH 142/165] adjusted PositioningFragment to changes around CompetitorResults/CompetitorResult Change-Id: Ib90f29218f6f654312c836625c951a7e87140e7b --- .../app/domain/impl/CompetitorsWithIdImpl.java | 9 +++++---- .../ui/fragments/raceinfo/PositioningFragment.java | 11 ++++++++--- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/CompetitorsWithIdImpl.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/CompetitorsWithIdImpl.java index c4fc49979e4..c2169d77982 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/CompetitorsWithIdImpl.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/CompetitorsWithIdImpl.java @@ -2,6 +2,7 @@ package com.sap.sailing.racecommittee.app.domain.impl; import java.io.Serializable; +import com.sap.sailing.domain.abstractlog.race.CompetitorResult; import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sse.common.Util; @@ -19,11 +20,11 @@ public class CompetitorsWithIdImpl { mReason = reason; } - public CompetitorsWithIdImpl(long id, Util.Triple triple) { + public CompetitorsWithIdImpl(long id, CompetitorResult triple) { mId = id; - mKey = triple.getA(); - mText = triple.getB(); - mReason = triple.getC(); + mKey = triple.getCompetitorId(); + mText = triple.getCompetitorDisplayName(); + mReason = triple.getMaxPointsReason(); } public long getId() { diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/PositioningFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/PositioningFragment.java index eaab231301d..5fb288029eb 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/PositioningFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/PositioningFragment.java @@ -12,12 +12,15 @@ import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.Toast; + import com.h6ah4i.android.widget.advrecyclerview.animator.SwipeDismissItemAnimator; import com.h6ah4i.android.widget.advrecyclerview.draggable.RecyclerViewDragDropManager; import com.h6ah4i.android.widget.advrecyclerview.swipeable.RecyclerViewSwipeManager; import com.h6ah4i.android.widget.advrecyclerview.touchguard.RecyclerViewTouchActionGuardManager; import com.h6ah4i.android.widget.advrecyclerview.utils.WrapperAdapterUtils; +import com.sap.sailing.domain.abstractlog.race.CompetitorResult; import com.sap.sailing.domain.abstractlog.race.CompetitorResults; +import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultImpl; import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultsImpl; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CompetitorStore; @@ -248,7 +251,7 @@ public class PositioningFragment extends BaseFragment private ArrayList initializeFinishList() { ArrayList positioning = new ArrayList<>(); if (getRaceState() != null && getRaceState().getFinishPositioningList() != null) { - for (Util.Triple results : getRaceState().getFinishPositioningList()) { + for (CompetitorResult results : getRaceState().getFinishPositioningList()) { positioning.add(new CompetitorsWithIdImpl(mId, results)); mId++; } @@ -337,15 +340,17 @@ public class PositioningFragment extends BaseFragment } private void setCompetitorToBottomOfPositioningList(CompetitorsWithIdImpl item) { - int lastIndex = getCompetitorResults().size() - 1; + int lastIndex = Util.size(getCompetitorResults()) - 1; mFinishedData.remove(item); mFinishedData.add(lastIndex, item); } private CompetitorResults getCompetitorResults() { CompetitorResults result = new CompetitorResultsImpl(); + int oneBasedRank = 1; for (CompetitorsWithIdImpl item : mFinishedData) { - result.add(new Util.Triple(item.getKey(), item.getText(), item.getReason())); + result.add(new CompetitorResultImpl(item.getKey(), item.getText(), oneBasedRank++, item.getReason(), + /* score */ null, /* finishingTime */ null, /* comment */ null)); } return result; } From d011a205e9e4225156eef245d3f579bb2db25d5b Mon Sep 17 00:00:00 2001 From: Charlotte Proeller Date: Wed, 20 Jan 2016 12:19:55 +0000 Subject: [PATCH 143/165] Updated onboarding (markdown) --- wiki/onboarding.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wiki/onboarding.md b/wiki/onboarding.md index 979177eb53a..7fa16656440 100644 --- a/wiki/onboarding.md +++ b/wiki/onboarding.md @@ -8,7 +8,7 @@ First of all, make sure you've looked at http://www.amazon.de/Patterns-Elements- #### Installations -1. Eclipse (Eclipse Eclipse Committers), http://www.eclipse.org +1. Eclipse (Eclipse for Eclipse Committers, e.g. version "Mars"), http://www.eclipse.org 2. Eclipse Extensions * Install Google plugin for Eclipse (https://developers.google.com/eclipse/docs/download) * Install Eclipse debugger for GWT SuperDevMode (master version: http://p2.sapsailing.com/p2/sdbg; public release: http://sdbg.github.io/p2) From 1d93baa62c23bcc227b91f7600ed7b23e17c3473 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 21 Jan 2016 14:40:19 +0100 Subject: [PATCH 144/165] upgraded TracAPI from 3.1.1 to 3.1.2, hoping to ultimately fix the deadlock upon terminating a subscription and stopping a subscriber Change-Id: I82c5cb7fbaa9ab9f3b475245d96b35500dd3248f --- .../META-INF/MANIFEST.MF | 2 +- .../lib/TracAPI-src.jar | Bin 61840 -> 61840 bytes .../com.tractrac.clientmodule/lib/TracAPI.jar | Bin 786436 -> 786640 bytes java/com.tractrac.clientmodule/pom.xml | 1 - 4 files changed, 1 insertion(+), 2 deletions(-) diff --git a/java/com.tractrac.clientmodule/META-INF/MANIFEST.MF b/java/com.tractrac.clientmodule/META-INF/MANIFEST.MF index d0f23396912..62fecd52a14 100644 --- a/java/com.tractrac.clientmodule/META-INF/MANIFEST.MF +++ b/java/com.tractrac.clientmodule/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: TracTrac Client module Bundle-SymbolicName: com.tractrac.clientmodule -Bundle-Version: 3.1.1 +Bundle-Version: 3.1.2 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ClassPath: ., lib/TracAPI.jar diff --git a/java/com.tractrac.clientmodule/lib/TracAPI-src.jar b/java/com.tractrac.clientmodule/lib/TracAPI-src.jar index 6b8e4560d0679d7cdc2f7fbecb524ccfcb353f69..5d91727ada07c64189b59c8cccf6c335e2d9e400 100755 GIT binary patch delta 2255 zcmY*aYfzMB6n4d6fn8)ZK$ArXOTnE%L4zb=OHxdQHLVa8L`*QH5H!dOP&v&M8p2yP zNdiuzMqXz1Xc>(Th8e@hWkFzdxrmD*A}rw4Xqr>|oky&GJ?}Z^InTMg@3*_R+hK3F zgW9mjVa(H`luG3&ZRG4i^&AHoUOU8accu*Dc?Ek#vO>@HVMP?#q|FYBjWV zbjeff@KhQYrDz>}soXMJHi|-ZBFr_1{jmm}m{>oa?z{SNjJ(}G=7W%>>fJ5OI;x3b zY*?ZbdJiWG8fOK`o=$p?6G$EQx)1NLR|rj>bW*`Nk22*PNAaCWBRsX+o>bL)xC!@0 z7cy&|9Uz|PBP!k9|^vwU+Z7piL7d8z}xtqsDL}aUqQs+bw$J(TS%O5V@qfN$18FlD`=ZN6e-mx|mzxB#cOoBd+Ce933~ z*ATAQaTt;0oCVz1@tj4B4|8G}6$w7Vx7$<9=y9R^+?SEnkarMUm!jop09EW#<7=z= z^es*sdug^9DsZEe&#cg2yt`fwkakZoH%>nn;0ei}DA6+c_kj^<|84ZtV$(fE-6LH;CQO5G=W_9OAW6nt*Vr@Y3!u{ z9Kx$TQEhom7Cf^C%vm}*+hcC`udfX20Kf8GeK-bTcu zoA8YHHLcgguS6qf)+YFtYX6Rd*5r44-{Nfh)@3nv*-@2Id%Uk0a9nEht zCYmv8l^J?du3(OjuAm?575L{}MV|+*vR;t|=_@R6v&;nx%KEp#&Tm6IeQo^Ni-`7A zly65lbqB`J=zzbYV;#q%I^!5iJMk3{ccP7@*D%KEYv51r0{@dPT*+V;>dd?TD(B~4 zU&v^_j=!0yR`gY1Mcv=6=p(M1KR#jX-pc%GH=tK|V2 z9;`>|nz{|E}vTd_rrwa#Br*d!u`*lO$mknX|3B%d{ E0QvPAYXATM delta 2255 zcmY*aYfzMB6n4d6fn8)VK$AsGOTnE%!Ga`lOH#}WYg!>Hh?rnVA!v{nz;c=?G=#To zauabHH1aa5N6Tn*Fw7V}E(-#y%SBui5n%zRM$??y?>u7l>v_*P&w0+}eZSqkT~2$u zoYaPePNSY4p;RhI7*j(E)w7&rc)gV2?hF~k^9uHgB!!;s!-^=zenm8+c9KrauhGz! zk;PB3!$)agl%jR?rE>E~*(eIriE#HE_Qx1>VqD!Ay6--bW8~-YF&~61Rp)7C)=|w8 z#`?uNq4##7U@sd;j&#y{pFrx6?|pcOd_!r%_>&6Gd6X&VIE(Mh8sVee`lPDf+e3IZ zxRFKc>ICsTe^KG-Ar}zAUamA@;zL#-?Ih!WrCi89IShrSPFc*UrdXXYH$Fq>r|e>8 zQCNsL-=w76z*uBjgU&o5Rs=h9ux8q?C@c?A5&R;UL%uozhMK}>ybOjlXoeWqtf8M~ zMseX&VQ2o&Zf#c6z3{1U%H2FJBIdNHC}mb80!KBDRal%wYlNTN4Lyh$HHr@k{clP> zNYN4|i!p?dv{1nY)i17s0PoTvP!p5K^ccfDG$>z|-r_>iG8+_4v0p(*p%0}UD|bRj z5ue3E@(XY@LdO&GAgqWF5lOA%Xj|emIIKY|C`v4D)V)^AqN04eW6c}g#q4D6Uj$^q zwzs*^{^T7f=y+*NvbT9s;=6h{>mT2(d1Hy(_;4nDpSB(Zg9(=}%RA&mV26rUryt{H zNR_c4U6o}n<+&eaZa|v6>cMPRQT#zJ2LiGVfhp?^ZVeErohtJ9@B*BE9*&FY3?Tn) zUqiTj`(Z?qa^`bi$8#1kKFo<>RK)v>fG!^~z1xlQb6-JLecmB#U5b{YfmFUrjjyfx z)3-To^raWXV1WlEe`bUJqTO|JfV6vz+&KMQfG13U6t2Z6k1~f#jiv)%c)}^yA3W+U z3cAPA!+qxA_X_8|ZjJCVp5=rT!_Fd$2IPN%!4o<+KLkDTsLDQ9pgBCQg7kv|rJVK9Y?yj*v&+O8sP`5Zj( zg!88%sLJpcB{zLVdX=kKUV(?X=}4$3sZ@z2mz1J-U<}n(m_aW2rJC22R(X)MY4oK) z93rZGP;Gg2ICo!AJ%_QOI+)Q(f)WZ53Z?x1=}h!FvYx@?J6_kfemZf{=5NNJq?IQ zH{u!ZYh1(eKO51*%FC=75L{~MV|+*vR;uD=_{=7u*?N3%1&y9o!^RfdRzIk7m;l# zDBp&1>UNBu(GGum`#O$Cb;L3r?7&w%)PXjZUc(rtuYo_I6Z}s)aU}zts5AHaYn-2d zeF3B8I{s#+*w9yj4RwFFp^w-u{`iEcYYX$I-hf`=ja0V(zLCMW`DPZQ{U-WZ(ha>I zy0IRqcf1I>g=dy_E19{LTW>JxdXgB6dXV#==RLMlZ==T5+nd=o^ky?ky~`LU-brID zyn~(|+`-I=eb~jtKI|g6A36v6H!)vh2QS;6$+q2&oh}$aor-}C?AHx~Uowc<#|~xx E1Lb9+8vp+;WUbQYlFpP7#TOGDedj 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 delta 53254 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 diff --git a/java/com.tractrac.clientmodule/pom.xml b/java/com.tractrac.clientmodule/pom.xml index 878f6e1465b..3ff1a6b66dc 100755 --- a/java/com.tractrac.clientmodule/pom.xml +++ b/java/com.tractrac.clientmodule/pom.xml @@ -8,6 +8,5 @@ 1.0.0-SNAPSHOT com.tractrac.clientmodule - 3.1.1 eclipse-plugin From b81e6742e5f24c4529d29c77099682644b2ae3a7 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 21 Jan 2016 16:47:34 +0100 Subject: [PATCH 145/165] re-added version to TracAPI's pom.xml Change-Id: Ia234e07f754324801f072a4181e84859bfa7948d --- java/com.tractrac.clientmodule/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com.tractrac.clientmodule/pom.xml b/java/com.tractrac.clientmodule/pom.xml index 3ff1a6b66dc..b5d0c19ca46 100755 --- a/java/com.tractrac.clientmodule/pom.xml +++ b/java/com.tractrac.clientmodule/pom.xml @@ -8,5 +8,6 @@ 1.0.0-SNAPSHOT com.tractrac.clientmodule + 3.1.2 eclipse-plugin From e724c073fe641bb74c753e7c41d1050c725238bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Fri, 22 Jan 2016 08:29:08 +0100 Subject: [PATCH 146/165] Removes redundant fetching of marks via DeviceMappings --- .../sap/sailing/domain/tracking/TrackedRace.java | 2 +- .../domain/tracking/impl/TrackedRaceImpl.java | 14 +++----------- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java index 31460587ad4..94fde1cf210 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java @@ -872,7 +872,7 @@ public interface TrackedRace extends Serializable, IsManagedByCache getMarksFromRaceAndLogs() { + default Iterable getMarksFromRegattaLogs() { return getMarks(); } } 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 5a97bf8b68e..a18e6b488f9 100644 --- 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 @@ -49,7 +49,6 @@ import com.sap.sailing.domain.abstractlog.race.state.impl.RaceStateImpl; import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ReadonlyRacingProcedure; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogDefinedMarkAnalyzer; -import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogDeviceMarkMappingFinder; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Course; @@ -112,7 +111,6 @@ import com.sap.sailing.domain.polars.NotEnoughDataHasBeenAddedException; import com.sap.sailing.domain.polars.PolarDataService; import com.sap.sailing.domain.racelog.tracking.EmptyGPSFixStore; import com.sap.sailing.domain.racelog.tracking.GPSFixStore; -import com.sap.sailing.domain.racelogtracking.DeviceMapping; import com.sap.sailing.domain.ranking.OneDesignRankingMetric; import com.sap.sailing.domain.ranking.RankingMetric; import com.sap.sailing.domain.ranking.RankingMetric.RankingInfo; @@ -3249,7 +3247,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl } logger.info("Finished loading competitor tracks for " + getRace().getName()); logger.info("Started loading mark tracks for " + getRace().getName()); - for (Mark mark : getMarksFromRaceAndLogs()) { + for (Mark mark : getMarksFromRegattaLogs()) { try { gpsFixStore.loadMarkTrack((DynamicGPSFixTrack) getOrCreateTrack(mark), log, mark, startOfTimeWindowToLoad, endOfTimeWindowToLoad); @@ -3897,17 +3895,11 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl } @Override - public Iterable getMarksFromRaceAndLogs() { - final Map>> markMappings = new HashMap<>(); + public Iterable getMarksFromRegattaLogs() { final Set result = new HashSet<>(); - race.getCourse().getWaypoints().forEach(waypoint -> Util.addAll(waypoint.getMarks(), result)); - final Set marksDefinedInRegattaLog = new HashSet(); for (RegattaLog log : attachedRegattaLogs.values()) { - marksDefinedInRegattaLog.addAll(new RegattaLogDefinedMarkAnalyzer(log).analyze()); - markMappings.putAll(new RegattaLogDeviceMarkMappingFinder(log).analyze()); + result.addAll(new RegattaLogDefinedMarkAnalyzer(log).analyze()); } - result.addAll(marksDefinedInRegattaLog); - result.addAll(markMappings.keySet()); return result; } } From 4852325f7b1a18bb4967f9228285bf92a344ece0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Fri, 22 Jan 2016 08:36:00 +0100 Subject: [PATCH 147/165] Fixes minor typo --- .../domain/leaderboard/impl/AbstractLeaderboardImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java index e3b2d2631a7..8fb25796ae0 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java @@ -52,7 +52,7 @@ public abstract class AbstractLeaderboardImpl extends AbstractSimpleLeaderboardI */ private transient CompetitorProviderFromRaceColumnsAndRegattaLike competitorsProvider; - private final AbstractLogEventAuthor regattaLogEventAuthorForAbstraceLeaderboard = new LogEventAuthorImpl( + private final AbstractLogEventAuthor regattaLogEventAuthorForAbstractLeaderboard = new LogEventAuthorImpl( AbstractLeaderboardImpl.class.getName(), 0); private static final Logger logger = Logger.getLogger(AbstractLeaderboardImpl.class.getName()); @@ -217,7 +217,7 @@ public abstract class AbstractLeaderboardImpl extends AbstractSimpleLeaderboardI TimePoint now = MillisecondsTimePoint.now(); for (Competitor competitor : competitors) { - regattaLog.add(new RegattaLogRegisterCompetitorEventImpl(now, now, regattaLogEventAuthorForAbstraceLeaderboard, + regattaLog.add(new RegattaLogRegisterCompetitorEventImpl(now, now, regattaLogEventAuthorForAbstractLeaderboard, UUID.randomUUID(), competitor)); } } @@ -238,7 +238,7 @@ public abstract class AbstractLeaderboardImpl extends AbstractSimpleLeaderboardI RegisterCompetitorEvent registerEvent = (RegisterCompetitorEvent) event; if (competitorSet.contains(registerEvent.getCompetitor())) { try { - regattaLog.revokeEvent(regattaLogEventAuthorForAbstraceLeaderboard, event, + regattaLog.revokeEvent(regattaLogEventAuthorForAbstractLeaderboard, event, "unregistering competitor because no longer selected for registration"); } catch (NotRevokableException e) { logger.log(Level.WARNING, "could not unregister competitor by adding RevokeEvent", e); From e021c3b446cc055ba846ebfbaac43a08f25d9797 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Fri, 22 Jan 2016 08:55:19 +0100 Subject: [PATCH 148/165] Introduce RegattaLogAnalyzer for deregistering competitors on RegattaLog --- .../RegattaLogCompetitorDeregistrator.java | 56 +++++++++++++++++++ .../sailing/domain/base/impl/RegattaImpl.java | 21 ++----- .../impl/AbstractLeaderboardImpl.java | 27 +-------- 3 files changed, 63 insertions(+), 41 deletions(-) create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogCompetitorDeregistrator.java diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogCompetitorDeregistrator.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogCompetitorDeregistrator.java new file mode 100644 index 00000000000..7005db4aefd --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogCompetitorDeregistrator.java @@ -0,0 +1,56 @@ +package com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl; + +import java.util.HashSet; +import java.util.logging.Level; +import java.util.logging.Logger; + +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; +import com.sap.sailing.domain.abstractlog.shared.events.RegisterCompetitorEvent; +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.common.abstractlog.NotRevokableException; +import com.sap.sse.common.Util; + +/** + * Generates events that close the events that are responsible for the {@link #mapping} that is passed to the + * constructor. + * + * @author Jan Broß + * + */ +public class RegattaLogCompetitorDeregistrator extends + RegattaLogAnalyzer { + + private static final Logger logger = Logger.getLogger(RegattaLogCompetitorDeregistrator.class.getName()); + protected final Iterable competitorsToDeregister; + private AbstractLogEventAuthor eventAuthor; + + public RegattaLogCompetitorDeregistrator(RegattaLog log, Iterable competitorsToDeregister, AbstractLogEventAuthor eventAuthor) { + super(log); + this.competitorsToDeregister = competitorsToDeregister; + this.eventAuthor = eventAuthor; + } + + @Override + protected Void performAnalysis() { + HashSet competitorSet = new HashSet(); + Util.addAll(competitorsToDeregister, competitorSet); + + for (RegattaLogEvent event : log.getUnrevokedEventsDescending()) { + if (event instanceof RegisterCompetitorEvent) { + RegisterCompetitorEvent registerEvent = (RegisterCompetitorEvent) event; + if (competitorSet.contains(registerEvent.getCompetitor())) { + try { + log.revokeEvent(eventAuthor, event, + "unregistering competitor because no longer selected for registration"); + } catch (NotRevokableException e) { + logger.log(Level.WARNING, "could not unregister competitor by adding RevokeEvent", e); + } + } + } + } + + return null; + } +} diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java index 2d7f1200be6..e75d317fa73 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java @@ -25,8 +25,8 @@ import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogRegisterCompetitorEventImpl; +import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogCompetitorDeregistrator; import com.sap.sailing.domain.abstractlog.shared.analyzing.CompetitorsInLogAnalyzer; -import com.sap.sailing.domain.abstractlog.shared.events.RegisterCompetitorEvent; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseArea; @@ -46,11 +46,11 @@ import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.RegattaIdentifier; import com.sap.sailing.domain.common.RegattaName; import com.sap.sailing.domain.common.RegattaNameAndRaceName; -import com.sap.sailing.domain.common.abstractlog.NotRevokableException; import com.sap.sailing.domain.leaderboard.ResultDiscardingRule; import com.sap.sailing.domain.leaderboard.ScoringScheme; import com.sap.sailing.domain.leaderboard.impl.AbstractLeaderboardImpl; import com.sap.sailing.domain.leaderboard.impl.CompetitorProviderFromRaceColumnsAndRegattaLike; +import com.sap.sailing.domain.leaderboard.impl.FlexibleLeaderboardImpl; import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.racelog.RaceLogStore; import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore; @@ -782,20 +782,7 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene @Override public void deregisterCompetitors(Iterable competitors) { RegattaLog regattaLog = getRegattaLike().getRegattaLog(); - HashSet competitorSet = new HashSet(); - Util.addAll(competitors, competitorSet); - for (RegattaLogEvent event : regattaLog.getUnrevokedEventsDescending()) { - if (event instanceof RegisterCompetitorEvent) { - RegisterCompetitorEvent registerEvent = (RegisterCompetitorEvent) event; - if (competitorSet.contains(registerEvent.getCompetitor())) { - try { - regattaLog.revokeEvent(regattaLogEventAuthorForRegatta, event, - "unregistering competitor because no longer selected for registration"); - } catch (NotRevokableException e) { - logger.log(Level.WARNING, "could not unregister competitor by adding RevokeEvent", e); - } - } - } - } + RegattaLogCompetitorDeregistrator deregisterer = new RegattaLogCompetitorDeregistrator(regattaLog, competitors, regattaLogEventAuthorForRegatta); + deregisterer.analyze(); } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java index 8fb25796ae0..fee10341160 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java @@ -6,8 +6,6 @@ import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.UUID; -import java.util.logging.Level; -import java.util.logging.Logger; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; @@ -16,20 +14,18 @@ import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogRegisterCompetitorEventImpl; +import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogCompetitorDeregistrator; import com.sap.sailing.domain.abstractlog.shared.analyzing.CompetitorsInLogAnalyzer; -import com.sap.sailing.domain.abstractlog.shared.events.RegisterCompetitorEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.RaceColumnListener; import com.sap.sailing.domain.common.MaxPointsReason; -import com.sap.sailing.domain.common.abstractlog.NotRevokableException; import com.sap.sailing.domain.leaderboard.HasRaceColumnsAndRegattaLike; import com.sap.sailing.domain.leaderboard.ScoreCorrection; import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sse.common.TimePoint; -import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; /** @@ -54,9 +50,6 @@ public abstract class AbstractLeaderboardImpl extends AbstractSimpleLeaderboardI private final AbstractLogEventAuthor regattaLogEventAuthorForAbstractLeaderboard = new LogEventAuthorImpl( AbstractLeaderboardImpl.class.getName(), 0); - - private static final Logger logger = Logger.getLogger(AbstractLeaderboardImpl.class.getName()); - /** * @param scoreComparator @@ -230,21 +223,7 @@ public abstract class AbstractLeaderboardImpl extends AbstractSimpleLeaderboardI @Override public void deregisterCompetitors(Iterable competitors) { RegattaLog regattaLog = getRegattaLike().getRegattaLog(); - HashSet competitorSet = new HashSet(); - Util.addAll(competitors, competitorSet); - - for (RegattaLogEvent event : regattaLog.getUnrevokedEventsDescending()) { - if (event instanceof RegisterCompetitorEvent) { - RegisterCompetitorEvent registerEvent = (RegisterCompetitorEvent) event; - if (competitorSet.contains(registerEvent.getCompetitor())) { - try { - regattaLog.revokeEvent(regattaLogEventAuthorForAbstractLeaderboard, event, - "unregistering competitor because no longer selected for registration"); - } catch (NotRevokableException e) { - logger.log(Level.WARNING, "could not unregister competitor by adding RevokeEvent", e); - } - } - } - } + RegattaLogCompetitorDeregistrator deregisterer = new RegattaLogCompetitorDeregistrator(regattaLog, competitors, regattaLogEventAuthorForAbstractLeaderboard); + deregisterer.analyze(); } } From ede37ca1bdb68e8913d373f7e3ab6253c66af367 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Fri, 22 Jan 2016 09:00:41 +0100 Subject: [PATCH 149/165] Generalize CompetitorDergistrator Analyzer for usage with RaceLogs --- .../analyzing/CompetitorDeregistrator.java} | 17 +++++++++-------- .../sailing/domain/base/impl/RegattaImpl.java | 4 ++-- .../impl/AbstractLeaderboardImpl.java | 4 ++-- 3 files changed, 13 insertions(+), 12 deletions(-) rename java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/{regatta/tracking/analyzing/impl/RegattaLogCompetitorDeregistrator.java => shared/analyzing/CompetitorDeregistrator.java} (70%) diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogCompetitorDeregistrator.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/CompetitorDeregistrator.java similarity index 70% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogCompetitorDeregistrator.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/CompetitorDeregistrator.java index 7005db4aefd..813a4f40e18 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogCompetitorDeregistrator.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/CompetitorDeregistrator.java @@ -1,12 +1,13 @@ -package com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl; +package com.sap.sailing.domain.abstractlog.shared.analyzing; import java.util.HashSet; import java.util.logging.Level; import java.util.logging.Logger; +import com.sap.sailing.domain.abstractlog.AbstractLog; +import com.sap.sailing.domain.abstractlog.AbstractLogEvent; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; -import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; -import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; +import com.sap.sailing.domain.abstractlog.BaseLogAnalyzer; import com.sap.sailing.domain.abstractlog.shared.events.RegisterCompetitorEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.common.abstractlog.NotRevokableException; @@ -19,14 +20,14 @@ import com.sap.sse.common.Util; * @author Jan Broß * */ -public class RegattaLogCompetitorDeregistrator extends - RegattaLogAnalyzer { +public class CompetitorDeregistrator, EventT extends AbstractLogEvent, VisitorT> +extends BaseLogAnalyzer { - private static final Logger logger = Logger.getLogger(RegattaLogCompetitorDeregistrator.class.getName()); + private static final Logger logger = Logger.getLogger(CompetitorDeregistrator.class.getName()); protected final Iterable competitorsToDeregister; private AbstractLogEventAuthor eventAuthor; - public RegattaLogCompetitorDeregistrator(RegattaLog log, Iterable competitorsToDeregister, AbstractLogEventAuthor eventAuthor) { + public CompetitorDeregistrator(LogT log, Iterable competitorsToDeregister, AbstractLogEventAuthor eventAuthor) { super(log); this.competitorsToDeregister = competitorsToDeregister; this.eventAuthor = eventAuthor; @@ -37,7 +38,7 @@ public class RegattaLogCompetitorDeregistrator extends HashSet competitorSet = new HashSet(); Util.addAll(competitorsToDeregister, competitorSet); - for (RegattaLogEvent event : log.getUnrevokedEventsDescending()) { + for (EventT event : log.getUnrevokedEventsDescending()) { if (event instanceof RegisterCompetitorEvent) { RegisterCompetitorEvent registerEvent = (RegisterCompetitorEvent) event; if (competitorSet.contains(registerEvent.getCompetitor())) { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java index e75d317fa73..013a14b7ccb 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java @@ -25,7 +25,7 @@ import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogRegisterCompetitorEventImpl; -import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogCompetitorDeregistrator; +import com.sap.sailing.domain.abstractlog.shared.analyzing.CompetitorDeregistrator; import com.sap.sailing.domain.abstractlog.shared.analyzing.CompetitorsInLogAnalyzer; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; @@ -782,7 +782,7 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene @Override public void deregisterCompetitors(Iterable competitors) { RegattaLog regattaLog = getRegattaLike().getRegattaLog(); - RegattaLogCompetitorDeregistrator deregisterer = new RegattaLogCompetitorDeregistrator(regattaLog, competitors, regattaLogEventAuthorForRegatta); + CompetitorDeregistrator deregisterer = new CompetitorDeregistrator<>(regattaLog, competitors, regattaLogEventAuthorForRegatta); deregisterer.analyze(); } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java index fee10341160..4c3ef7f9c9f 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java @@ -14,7 +14,7 @@ import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogRegisterCompetitorEventImpl; -import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogCompetitorDeregistrator; +import com.sap.sailing.domain.abstractlog.shared.analyzing.CompetitorDeregistrator; import com.sap.sailing.domain.abstractlog.shared.analyzing.CompetitorsInLogAnalyzer; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Fleet; @@ -223,7 +223,7 @@ public abstract class AbstractLeaderboardImpl extends AbstractSimpleLeaderboardI @Override public void deregisterCompetitors(Iterable competitors) { RegattaLog regattaLog = getRegattaLike().getRegattaLog(); - RegattaLogCompetitorDeregistrator deregisterer = new RegattaLogCompetitorDeregistrator(regattaLog, competitors, regattaLogEventAuthorForAbstractLeaderboard); + CompetitorDeregistrator deregisterer = new CompetitorDeregistrator<>(regattaLog, competitors, regattaLogEventAuthorForAbstractLeaderboard); deregisterer.analyze(); } } From ebd1e9cb8109f32a1910c8035e624a6d74d67e6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Fri, 22 Jan 2016 10:07:32 +0100 Subject: [PATCH 150/165] Improve error message --- .../com/sap/sailing/domain/base/impl/AbstractRaceColumn.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java index 35becdbd8bb..bc797de581b 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java @@ -279,7 +279,7 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem public void registerCompetitors(Iterable competitors, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException { if (!isCompetitorRegistrationInRacelogEnabled(fleet)) { - throw new CompetitorRegistrationOnRaceLogDisabledException("Competitor registration not allows on fleet "+fleet+" in column "+this); + throw new CompetitorRegistrationOnRaceLogDisabledException("Competitor registration not allowed for fleet "+fleet+" in column "+this); } TimePoint now = MillisecondsTimePoint.now(); RaceLog raceLog = getRaceLog(fleet); From 15ce858eb7b7bbd577fcb0ae55e30271e99d6add Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Fri, 22 Jan 2016 13:47:23 +0100 Subject: [PATCH 151/165] Fixes bug in competitorRegistrationDialog --- .../ui/adminconsole/RaceLogCompetitorRegistrationDialog.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java index 2f4ef0be68e..d2ac7df71cd 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java @@ -10,8 +10,6 @@ import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sse.gwt.client.ErrorReporter; public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegistrationsDialog { - - private String leaderboardName; private String fleetName; private String raceColumnName; From 35af1394c67083b8ac30ac564a7abfe02a1c66df Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 22 Jan 2016 15:15:03 +0100 Subject: [PATCH 152/165] Got the first tests for mark passing update from race log changes running Change-Id: I857191e67ae8e408670832d02f1e1caab42d10a9 --- ...aceLogFinishPositioningConfirmedEvent.java | 8 +- ...eLogFinishPositioningListChangedEvent.java | 7 +- ...teFromRaceLogFinishPositioingListTest.java | 126 ++++++++++++ .../domain/test/mock/MockedTrackedRace.java | 9 + .../domain/tracking/DynamicTrackedRace.java | 40 +++- .../sailing/domain/tracking/MarkPassing.java | 11 ++ ...MarkPassingWithTimePointAndCompetitor.java | 5 + .../DummyMarkPassingWithTimePointOnly.java | 5 + .../tracking/impl/DynamicTrackedRaceImpl.java | 187 +++++++++++++++++- .../impl/DynamicTrackedRaceLogListener.java | 14 ++ .../domain/tracking/impl/MarkPassingImpl.java | 5 + .../gwt/ui/test/MockedTrackedRace.java | 9 + .../server/impl/RaceLogScoringReplicator.java | 25 ++- 13 files changed, 432 insertions(+), 19 deletions(-) create mode 100644 java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/MarkPassingUpdateFromRaceLogFinishPositioingListTest.java diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogFinishPositioningConfirmedEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogFinishPositioningConfirmedEvent.java index 801779a9631..7f04d90f9f8 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogFinishPositioningConfirmedEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogFinishPositioningConfirmedEvent.java @@ -2,10 +2,10 @@ package com.sap.sailing.domain.abstractlog.race; /** - * This RaceLog evet type confirms the entered positioning list. Since we do not guarantee the order of incoming events from the app (due to possible - * connectivity issues), this event type contains the the confirmed positioning list again. Although this racelog event type contains the same information - * such as {@link RaceLogFinishPositioningListChangedEvent} we keep it for backwards compatibility reasons. - * + * This RaceLog event type confirms the entered positioning list. Since we do not guarantee the order of incoming events + * from the app (due to possible connectivity issues), this event type contains the the confirmed positioning list + * again. Although this racelog event type contains the same information such as + * {@link RaceLogFinishPositioningListChangedEvent} we keep it for backwards compatibility reasons. */ public interface RaceLogFinishPositioningConfirmedEvent extends RaceLogFinishPositioningEvent { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogFinishPositioningListChangedEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogFinishPositioningListChangedEvent.java index 9fac2be5e73..072864893da 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogFinishPositioningListChangedEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogFinishPositioningListChangedEvent.java @@ -1,6 +1,11 @@ package com.sap.sailing.domain.abstractlog.race; - +/** + * Captures a temporary race result description. The result is not final yet and needs to be confirmed by + * a {@link RaceLogFinishPositioningConfirmedEvent} before it is adopted by other parts of the model. This + * type of event can be used to store the interims state of a result editing process before the result + * if committed. + */ public interface RaceLogFinishPositioningListChangedEvent extends RaceLogFinishPositioningEvent { } \ No newline at end of file diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/MarkPassingUpdateFromRaceLogFinishPositioingListTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/MarkPassingUpdateFromRaceLogFinishPositioingListTest.java new file mode 100644 index 00000000000..cc14fb14f86 --- /dev/null +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/MarkPassingUpdateFromRaceLogFinishPositioingListTest.java @@ -0,0 +1,126 @@ +package com.sap.sailing.domain.test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.text.ParseException; +import java.util.UUID; + +import org.junit.Before; +import org.junit.Test; + +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; +import com.sap.sailing.domain.abstractlog.race.CompetitorResult; +import com.sap.sailing.domain.abstractlog.race.CompetitorResults; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent; +import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultImpl; +import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultsImpl; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogFinishPositioningConfirmedEventImpl; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogPassChangeEventImpl; +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.RaceColumn; +import com.sap.sailing.domain.base.impl.CourseAreaImpl; +import com.sap.sailing.domain.common.NoWindException; +import com.sap.sailing.domain.common.WindSourceType; +import com.sap.sailing.domain.common.impl.DegreeBearingImpl; +import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl; +import com.sap.sailing.domain.common.impl.WindImpl; +import com.sap.sailing.domain.common.impl.WindSourceImpl; +import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; +import com.sap.sailing.domain.leaderboard.impl.FlexibleLeaderboardImpl; +import com.sap.sailing.domain.leaderboard.impl.LowPoint; +import com.sap.sailing.domain.leaderboard.impl.ThresholdBasedResultDiscardingRuleImpl; +import com.sap.sailing.domain.tracking.MarkPassing; +import com.sap.sailing.domain.tractracadapter.ReceiverType; +import com.sap.sse.common.Duration; +import com.sap.sse.common.TimePoint; +import com.sap.sse.common.Util; +import com.sap.sse.common.Util.Pair; +import com.sap.sse.common.impl.MillisecondsTimePoint; +import com.tractrac.model.lib.api.event.CreateModelException; +import com.tractrac.subscription.lib.api.SubscriberInitializationException; + +/** + * Tests the implementation for bug3420: when a {@link RaceLogFinishPositioningConfirmedEvent} is found in a race log + * that has a valid {@link CompetitorResult#getFinishingTime()} defined for a competitor, a wrapper mark passing is + * expected to be generated with that time point for the finish waypoint. When the event is invalidated, e.g., by + * detaching the race log or by starting a new pass or by sending a newer {@link RaceLogFinishPositioningConfirmedEvent} + * or one that has higher priority, the finish mark passings need to be updated accordingly. This can mean that entirely + * artificial mark passings need to be removed entirely; mark passings that only replaced an original mark passing by + * one with a modified finish time need to be reverted back to the original mark passing. + * + * @author Axel Uhl (D043530) + * + */ +public class MarkPassingUpdateFromRaceLogFinishPositioingListTest extends AbstractManeuverDetectionTestCase { + private FlexibleLeaderboard leaderboard; + private RaceLog raceLog; + private final AbstractLogEventAuthor author; + + public MarkPassingUpdateFromRaceLogFinishPositioingListTest() throws MalformedURLException, URISyntaxException { + super(); + author = new LogEventAuthorImpl("Me", 0); + } + + @Override + protected String getExpectedEventName() { + return "ESS Qingdao 2014"; + } + + + @Before + public void setUp() throws URISyntaxException, IOException, InterruptedException, ParseException, SubscriberInitializationException, CreateModelException { + super.setUp(); + URI storedUri = new URI("file:///"+new File("resources/event_20140429_ESSQingdao-Race_4.mtb").getCanonicalPath().replace('\\', '/')); + super.setUp( + new URL("file:///" + new File("resources/event_20140429_ESSQingdao-Race_4.txt").getCanonicalPath()), + /* liveUri */null, /* storedUri */storedUri, new ReceiverType[] { ReceiverType.MARKPASSINGS, + ReceiverType.MARKPOSITIONS, ReceiverType.RACECOURSE, ReceiverType.RAWPOSITIONS }); + getTrackedRace().recordWind( + new WindImpl(/* position */null, new MillisecondsTimePoint(dateFormat.parse("05/01/2014-09:02:00")), + new KnotSpeedWithBearingImpl(10, new DegreeBearingImpl(269))), + new WindSourceImpl(WindSourceType.WEB)); + leaderboard = new FlexibleLeaderboardImpl("Test", new ThresholdBasedResultDiscardingRuleImpl(new int[0]), new LowPoint(), new CourseAreaImpl("Here", UUID.randomUUID())); + final RaceColumn raceColumn = leaderboard.addRace(getTrackedRace(), "R", /* medalRace */ false); + raceLog = raceColumn.getRaceLog(raceColumn.getFleets().iterator().next()); + } + + /** + * Tests the Race 4 for competitor "Alinghi" at a time where the maneuver detection test is likely to compute + * a penalty although between the jibe and the tack there is a mark passing + */ + @Test + public void testOriginalFinishMarkPassingTime() throws ParseException, NoWindException { + Competitor alinghi = getCompetitorByName("Alinghi"); + final MarkPassing alinghiOriginalFinish = getTrackedRace().getMarkPassing(alinghi, getTrackedRace().getRace().getCourse().getLastWaypoint()); + final TimePoint alinghiOriginalFinishingTime = alinghiOriginalFinish.getTimePoint(); + assertNotNull(alinghiOriginalFinish.getTimePoint()); + final TimePoint now = MillisecondsTimePoint.now(); + final CompetitorResults alinghiFinishesNow = createCompetitorResults(new Util.Pair<>(alinghi, now)); + raceLog.add(new RaceLogFinishPositioningConfirmedEventImpl(now, author, /* pPassId */ 0, alinghiFinishesNow)); + final MarkPassing alinghiCorrectedFinishMarkPassing = getTrackedRace().getMarkPassing(alinghi, getTrackedRace().getRace().getCourse().getLastWaypoint()); + assertEquals(now, alinghiCorrectedFinishMarkPassing.getTimePoint()); + raceLog.add(new RaceLogPassChangeEventImpl(now.plus(Duration.ONE_SECOND), author, /* pass */ 1)); // this should invalidate the previously edited result + assertEquals(alinghiOriginalFinishingTime, getTrackedRace().getMarkPassing(alinghi, getTrackedRace().getRace().getCourse().getLastWaypoint()).getTimePoint()); + // TODO now eliminate the original finish mark passing, then set a finishing time in the race log to see how the synthetic mark passing is created and then again removed + } + + @SafeVarargs + private final CompetitorResults createCompetitorResults(Pair... finishingTimes) { + final CompetitorResults results = new CompetitorResultsImpl(); + int rank = 1; + for (Pair finishingTime : finishingTimes) { + results.add(new CompetitorResultImpl(finishingTime.getA().getId(), finishingTime.getA().getName(), rank++, /* maxPointsReason */ + null, /* score */null, finishingTime.getB(), /* comment */null)); + } + return results; + } +} diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java index 50d85683056..f625d913af3 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java @@ -7,6 +7,7 @@ import java.util.NavigableSet; import java.util.Set; import java.util.TreeSet; +import com.sap.sailing.domain.abstractlog.race.CompetitorResults; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; @@ -1008,4 +1009,12 @@ public class MockedTrackedRace implements DynamicTrackedRace { public IsManagedByCache resolve(SharedDomainFactory domainFactory) { return this; } + + @Override + public void updateFinishingTimesFromRaceLog(CompetitorResults event) { + } + + @Override + public void updateMarkPassingsAfterRaceLogChanges() { + } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/DynamicTrackedRace.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/DynamicTrackedRace.java index 85e2055ac8d..3b093a2eb58 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/DynamicTrackedRace.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/DynamicTrackedRace.java @@ -1,5 +1,9 @@ package com.sap.sailing.domain.tracking; +import com.sap.sailing.domain.abstractlog.race.CompetitorResult; +import com.sap.sailing.domain.abstractlog.race.CompetitorResults; +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.Mark; @@ -34,13 +38,39 @@ public interface DynamicTrackedRace extends TrackedRace { DynamicGPSFixTrack getOrCreateTrack(Mark mark); /** - * Updates all mark passings for competitor for this race. The - * mark passings must be provided in the order of the race's course and in - * increasing time stamps. Calling this method replaces all previous mark passings - * for this race for competitor and ensures that the "leaderboard" - * and all other derived information are updated accordingly. + * Updates all mark passings for competitor for this race. The mark passings must be provided in the + * order of the race's course and in increasing time stamps. Calling this method replaces all previous mark passings + * for this race for competitor and ensures that the "leaderboard" and all other derived information + * are updated accordingly. + *

    + * + * When an attached {@link RaceLog} has a {@link RaceLogFinishPositioningConfirmedEvent} that sets a + * {@link CompetitorResult#getFinishingTime() finishing time} for a competitor, it will be used to override the + * {@link MarkPassing#getTimePoint() time point} of the finishing waypoint's mark passing or, if no mark passing for + * the finishing waypoint exists yet for that competitor, create one. This can, in particular, be helpful when + * determining the time sailed for the {@code competitor} in order to determine the calculated time after applying + * any handicap rules and metrics.

    */ void updateMarkPassings(Competitor competitor, Iterable markPassings); + + /** + * The {@link CompetitorResults} from the race log may optionally set a finishing time for competitors. Also, + * depending on how the race log has been modified (e.g., a new pass could have been started or a + * {@link RaceLogFinishPositioningConfirmedEvent} could have been revoked) it may be possible that a finishing + * time previously set from the race log now has to be reset to its original state as coming from the tracking + * provider. This can either mean resetting the mark passing to its {@link MarkPassing#getOriginal() original} + * version or removing it in case the {@link MarkPassing#getOriginal()} method delivers {@code null}, meaning + * that this mark passing was solely based on the race log information which now would have disappeared. + */ + void updateFinishingTimesFromRaceLog(CompetitorResults result); + + /** + * When there is a significant change in the race logs attached to this race, such as adding another race log or + * removing a race log or switching to another pass in one of the race logs attached, the effects on the + * valid {@link RaceLogFinishPositioningConfirmedEvent} are analyzed, and if relevant, the mark passings + * for the finish line that are affected will be {@link #updateMarkPassings(Competitor, Iterable) updated}. + */ + void updateMarkPassingsAfterRaceLogChanges(); /** * Sets the start time as received from the tracking infrastructure. This isn't necessarily diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/MarkPassing.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/MarkPassing.java index c0e35282026..be1b5c8c789 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/MarkPassing.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/MarkPassing.java @@ -8,4 +8,15 @@ public interface MarkPassing extends Timed { Waypoint getWaypoint(); Competitor getCompetitor(); + + /** + * This mark passing may be a replacement of another mark passing that was created based on some other evidence, + * such as a race committee-provided finishing time. In this case, this method will return the original mark + * passing that was replaced. For regular mark passings, this method will return {@code this} object. It may + * return {@code null} if this mark passing has been synthesized, e.g., solely from a {@link RaceLog} event and needs + * to be removed again if that event is removed because it didn't replace any original mark passing. + * + * TODO what if we receive a real update for the finish mark passing? + */ + MarkPassing getOriginal(); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DummyMarkPassingWithTimePointAndCompetitor.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DummyMarkPassingWithTimePointAndCompetitor.java index 8dfccfd3922..0ff9c034bac 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DummyMarkPassingWithTimePointAndCompetitor.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DummyMarkPassingWithTimePointAndCompetitor.java @@ -30,4 +30,9 @@ public class DummyMarkPassingWithTimePointAndCompetitor implements MarkPassing { public Competitor getCompetitor() { return competitor; } + + @Override + public MarkPassing getOriginal() { + return this; + } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DummyMarkPassingWithTimePointOnly.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DummyMarkPassingWithTimePointOnly.java index 1edec662f70..8e94e07d7d1 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DummyMarkPassingWithTimePointOnly.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DummyMarkPassingWithTimePointOnly.java @@ -102,4 +102,9 @@ public class DummyMarkPassingWithTimePointOnly implements MarkPassing { } }; } + + @Override + public MarkPassing getOriginal() { + return this; + } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java index 6a9f5794f4d..f618e32cab7 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java @@ -3,11 +3,13 @@ package com.sap.sailing.domain.tracking.impl; import java.io.IOException; import java.io.ObjectInputStream; import java.io.Serializable; +import java.util.ArrayList; import java.util.Collection; import java.util.ConcurrentModificationException; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.NavigableSet; import java.util.Set; @@ -15,7 +17,11 @@ import java.util.function.Consumer; import java.util.logging.Level; import java.util.logging.Logger; +import com.sap.sailing.domain.abstractlog.race.CompetitorResult; +import com.sap.sailing.domain.abstractlog.race.CompetitorResults; import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.ConfirmedFinishPositioningListFinder; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; @@ -468,8 +474,159 @@ DynamicTrackedRace, GPSTrackListener { notifyListeners(listener -> listener.markPassingReceived(competitor, oldMarkPassings, markPassings)); } + /** + * A mark passing produced from a {@link RaceLogFinishPositioningConfirmedEvent} where a + * {@link CompetitorResult#getFinishingTime() finishing time} has been provided for a competitor. The mark passing + * may have replaced an original mark passing, as provided by the {@link MarkPassingCalculator} or an external + * connector, or it may have been provided solely based on the presence of the finishing time in the + * {@link RaceLogFinishPositioningConfirmedEvent}. This leads to a different implementation of the + * {@link #getOriginal} implementation. + * + * @author Axel Uhl (D043530) + */ + private static class MarkPassingFromRaceLogProvidedFinishingTimeImpl extends MarkPassingImpl { + private static final long serialVersionUID = 2900812554717213461L; + private final MarkPassing original; + + public MarkPassingFromRaceLogProvidedFinishingTimeImpl(TimePoint timePoint, Waypoint waypoint, Competitor competitor, MarkPassing original) { + super(timePoint, waypoint, competitor); + this.original = original; + } + + /** + * May return {@code null} in case this mark passing was created based solely on the finishing + * time taken from a {@link RaceLogFinishPositioningConfirmedEvent}, or may contain the original + * {@link MarkPassing} that it replaced, otherwise. The original mark passing is expected not to + * implement this interface. + */ + @Override + public MarkPassing getOriginal() { + return original; + } + } + @Override - public void updateMarkPassings(Competitor competitor, Iterable markPassings) { + public void updateMarkPassings(Competitor competitor, final Iterable markPassings) { + final CompetitorResult resultFromRaceLog = getResultsFromRaceLog(competitor); + final Iterable markPassingsToUse = createOrUpdateFinishMarkPassingIfRequired(competitor, markPassings, resultFromRaceLog); + updateMarkPassingsNotConsideringFinishingTimesFromRaceLog(competitor, markPassingsToUse); + } + + @Override + public void updateMarkPassingsAfterRaceLogChanges() { + updateFinishingTimesFromRaceLog(getResultsFromRaceLogs()); + } + + /** + * Iterates over the {@code markPassings} and checks if the finish mark passing needs to be updated based on the + * {@link CompetitorResult}. In the following cases an updated mark passings {@link Iterable} is returned that + * contains an update regarding the finish mark passing: + * + *

    + * + * If no such modification was required, the unmodified {@code markPassings} object is returned; otherwise, a new + * {@link Iterable} that contains the modifications regarding the finish mark passing is returned.

    + * + * Note that if that is a result of {@link #getMarkPassings(Competitor)} or + * {@link #getMarkPassingsInOrder(Waypoint)} then the caller must hold the corresponding read lock while calling + * this method. + */ + private Iterable createOrUpdateFinishMarkPassingIfRequired(final Competitor competitor, Iterable markPassings, CompetitorResult competitorResult) { + assert competitorResult == null || competitorResult.getCompetitorId().equals(competitor.getId()); + final Waypoint finish = getRace().getCourse().getLastWaypoint(); + final List copyOfMarkPassings = new ArrayList<>(); + boolean neededToCreateOrUpdateFinishMarkPassing = false; + boolean foundFinishMarkPassing = false; + for (final MarkPassing originalMarkPassing : markPassings) { + if (originalMarkPassing.getWaypoint() != finish) { + copyOfMarkPassings.add(originalMarkPassing); + } else { + foundFinishMarkPassing = true; + final MarkPassing finishMarkPassingToUse; + if (competitorResult != null && competitorResult.getFinishingTime() != null + && (originalMarkPassing.getOriginal() == originalMarkPassing || !originalMarkPassing.getTimePoint().equals(competitorResult.getFinishingTime()))) { + // since we so far only have the original mark passing or a wrapper mark passing with an + // incorrect time point, we need to create a wrapper mark passing: + finishMarkPassingToUse = new MarkPassingFromRaceLogProvidedFinishingTimeImpl( + competitorResult.getFinishingTime(), finish, competitor, + originalMarkPassing.getOriginal()); + logger.info(getRace().getName()+": Updating finish mark passing "+originalMarkPassing.getOriginal()+" to "+finishMarkPassingToUse); + neededToCreateOrUpdateFinishMarkPassing = true; + } else { + finishMarkPassingToUse = originalMarkPassing.getOriginal(); + if (copyOfMarkPassings != originalMarkPassing) { + logger.info(getRace().getName()+": Reverting race log-based finish mark passing "+originalMarkPassing+" to "+finishMarkPassingToUse+ + " because no finishing time found anymore for that competitor in race log"); + neededToCreateOrUpdateFinishMarkPassing = true; + } + } + if (finishMarkPassingToUse != null) { + copyOfMarkPassings.add(finishMarkPassingToUse); + } + } + } + if (!foundFinishMarkPassing && competitorResult != null && competitorResult.getFinishingTime() != null) { + // need to create a synthetic finish mark passing based on the race log-provided finishing time + final MarkPassingFromRaceLogProvidedFinishingTimeImpl finishMarkPassingToUse = new MarkPassingFromRaceLogProvidedFinishingTimeImpl( + competitorResult.getFinishingTime(), finish, competitor, + /* no original finish mark passing exists; synthetic finish mark passing */ null); + copyOfMarkPassings.add(finishMarkPassingToUse); + logger.info(getRace().getName()+": Created "+finishMarkPassingToUse+" based on finishing time provided in race log"); + neededToCreateOrUpdateFinishMarkPassing = true; + } + return neededToCreateOrUpdateFinishMarkPassing ? copyOfMarkPassings : markPassings; + } + + /** + * Looks in all {@link #attachedRaceLogs attached race logs} for the last valid + * {@link RaceLogFinishPositioningConfirmedEvent} that has a {@link CompetitorResult} for {@code competitor}. The + * first one found will be returned; if none is found, null will be returned. + */ + private CompetitorResult getResultsFromRaceLog(Competitor competitor) { + CompetitorResult result = null; + final CompetitorResults results = getResultsFromRaceLogs(); + if (results != null) { + for (CompetitorResult competitorResult : results) { + if (getRace().getCompetitorById(competitorResult.getCompetitorId()) == competitor) { + result = competitorResult; + break; + } + } + } + return result; + } + + private CompetitorResults getResultsFromRaceLogs() { + CompetitorResults results = null; + for (final RaceLog raceLog : attachedRaceLogs.values()) { + results = new ConfirmedFinishPositioningListFinder(raceLog).analyze(); + if (results != null) { + break; + } + } + return results; + } + + /** + * Updates the {@code markPassings} into the {@link #getMarkPassing(Competitor, Waypoint) mark passing data + * structure for the waypoints passed} and the {@link #getMarkPassings(Competitor) mark passing data structure for + * the competitor}. The mark passings are use as-is, without considering any + * {@link CompetitorResult#getFinishingTime() finishing times} for competitors coming from any {@link RaceLog}. + * See also {@link #updateMarkPassings(Competitor, Iterable)} which does consider those. + */ + private void updateMarkPassingsNotConsideringFinishingTimesFromRaceLog(Competitor competitor, Iterable markPassings) { LockUtil.lockForRead(getSerializationLock()); // keep serializer from reading the mark passings collections try { Map oldMarkPassings = new HashMap(); @@ -574,6 +731,33 @@ DynamicTrackedRace, GPSTrackListener { } } + @Override + public void updateFinishingTimesFromRaceLog(CompetitorResults results) { + final Waypoint finish = getRace().getCourse().getLastWaypoint(); + if (finish != null) { // can't do anything for an empty course + final Map resultMap = new HashMap<>(); + if (results != null) { + for (final CompetitorResult result : results) { + resultMap.put(getRace().getCompetitorById(result.getCompetitorId()), result); + } + } + for (final Competitor competitor : getRace().getCompetitors()) { + final CompetitorResult competitorResult = resultMap.get(competitor); + final NavigableSet markPassings = getMarkPassings(competitor); + final Iterable markPassingsToUse; + lockForRead(markPassings); + try { + markPassingsToUse = createOrUpdateFinishMarkPassingIfRequired(competitor, markPassings, competitorResult); + } finally { + unlockAfterRead(markPassings); + } + if (markPassingsToUse != markPassings) { + updateMarkPassingsNotConsideringFinishingTimesFromRaceLog(competitor, markPassingsToUse); + } + } + } + } + @Override public void lockForRead(Iterable markPassings) { getRace().getCourse().lockForRead(); @@ -829,4 +1013,5 @@ DynamicTrackedRace, GPSTrackListener { public DynamicGPSFixTrack getTrack(Mark mark) { return (DynamicGPSFixTrack) super.getTrack(mark); } + } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceLogListener.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceLogListener.java index a88bd5419e5..5abcfdd225a 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceLogListener.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceLogListener.java @@ -9,6 +9,7 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogDependentStartTimeEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogEndOfTrackingEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogFixedMarkPassingEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogPassChangeEvent; @@ -122,6 +123,7 @@ public class DynamicTrackedRaceLogListener extends BaseRaceLogEventVisitor { if (markPassingUpdateListener != null) { removeMarkPassingEvents(); } + trackedRace.updateMarkPassingsAfterRaceLogChanges(); } } @@ -157,6 +159,7 @@ public class DynamicTrackedRaceLogListener extends BaseRaceLogEventVisitor { markPassingDataFinder = new MarkPassingDataFinder(raceLog); analyzeMarkPassings(); } + trackedRace.updateMarkPassingsAfterRaceLogChanges(); } private void analyseTrackingTimes(RaceLog raceLog) { @@ -237,6 +240,7 @@ public class DynamicTrackedRaceLogListener extends BaseRaceLogEventVisitor { // previous pass was aborted; notify TracTrac trackedRace.onAbortedByRaceCommittee(abortingFlag.getUpperFlag()); } + trackedRace.updateMarkPassingsAfterRaceLogChanges(); } @Override @@ -249,6 +253,16 @@ public class DynamicTrackedRaceLogListener extends BaseRaceLogEventVisitor { analyzeCourseDesign(event.getCourseDesign()); } + /** + * We don't know whether this event is the one that is now valid; it could have a priority too low, or it could have + * a time point too early and thus superseded by a later event of the same type. There may also be other race logs. + * Therefore, re-evaluate the current situation "from scratch." + */ + @Override + public void visit(RaceLogFinishPositioningConfirmedEvent event) { + trackedRace.updateMarkPassingsAfterRaceLogChanges(); + } + @Override public void visit(RaceLogWindFixEvent event) { Wind wind = new RaceLogWindFixDeclinationHelper().getOptionallyDeclinationCorrectedWind(event); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/MarkPassingImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/MarkPassingImpl.java index 0c7ba574bab..8fbc636e24c 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/MarkPassingImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/MarkPassingImpl.java @@ -38,4 +38,9 @@ public class MarkPassingImpl implements MarkPassing { return ""+getTimePoint()+": "+getCompetitor()+" passed "+getWaypoint(); } + @Override + public MarkPassing getOriginal() { + return this; + } + } diff --git a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java index 5d721c9a944..c63e64954e6 100755 --- a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java +++ b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.NavigableSet; import java.util.Set; +import com.sap.sailing.domain.abstractlog.race.CompetitorResults; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; @@ -790,4 +791,12 @@ public class MockedTrackedRace implements DynamicTrackedRace { public IsManagedByCache resolve(SharedDomainFactory domainFactory) { return this; } + + @Override + public void updateFinishingTimesFromRaceLog(CompetitorResults event) { + } + + @Override + public void updateMarkPassingsAfterRaceLogChanges() { + } } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RaceLogScoringReplicator.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RaceLogScoringReplicator.java index e7e3f443243..a2b3ad0ec64 100644 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RaceLogScoringReplicator.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RaceLogScoringReplicator.java @@ -7,6 +7,7 @@ import com.sap.sailing.domain.abstractlog.race.CompetitorResults; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningListChangedEvent; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.ConfirmedFinishPositioningListFinder; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.FinishPositioningListFinder; import com.sap.sailing.domain.base.Competitor; @@ -89,11 +90,11 @@ public class RaceLogScoringReplicator implements RaceColumnListener { @Override public void raceLogEventAdded(RaceColumn raceColumn, RaceLogIdentifier raceLogIdentifier, RaceLogEvent event) { if (event instanceof RaceLogFinishPositioningConfirmedEvent) { - handleFinishPositioningList(raceColumn, raceLogIdentifier, event); + handleFinishPositioningList(raceColumn, raceLogIdentifier, (RaceLogFinishPositioningConfirmedEvent) event); } } - private void handleFinishPositioningList(RaceColumn raceColumn, RaceLogIdentifier raceLogIdentifier, RaceLogEvent event) { + private void handleFinishPositioningList(RaceColumn raceColumn, RaceLogIdentifier raceLogIdentifier, RaceLogFinishPositioningConfirmedEvent event) { Leaderboard leaderboard = service.getLeaderboardByName(raceLogIdentifier.getRegattaLikeParent().getName()); if (leaderboard != null) { Fleet fleet = raceColumn.getFleetByName(raceLogIdentifier.getFleetName()); @@ -108,11 +109,18 @@ public class RaceLogScoringReplicator implements RaceColumnListener { } /** - * Retrieves the last RaceLogFinishPositioningListChangedEvent from the racelog and compares the ranks and - * disqualifications entered by the race committee with the tracked ranks. When a tracked rank for a competitor is - * not the same as the rank of the race committee, a score correction is issued. The positioning list contains a - * list of competitors sorted by the positioning order when finishing. Additionally a MaxPointsReason might be - * entered by the Race Committee.

    + * Called when a {@link RaceLogFinishPositioningConfirmedEvent} was received by the {@link RaceLog}. Retrieves the + * last {@link RaceLogFinishPositioningConfirmedEvent} from the racelog and compares the ranks and disqualifications + * entered by the race committee with the tracked ranks. When a tracked rank for a competitor is not the same as the + * rank of the race committee, a score correction is issued. The positioning list contains a list of competitors + * sorted by the positioning order when finishing. Additionally a MaxPointsReason might be entered by the Race + * Committee. + *

    + * + * For backward compatibility (old releases didn't store the {@link CompetitorResults} in the event) if no + * {@link CompetitorResults} are found even though there was a {@link RaceLogFinishPositioningConfirmedEvent}, the + * last {@link RaceLogFinishPositioningListChangedEvent} event with {@link CompetitorResults} is looked up and its + * results are used. * * TODO bug 3420: also extract the optional score / finishing time / comment and make good use of it * @@ -130,7 +138,8 @@ public class RaceLogScoringReplicator implements RaceColumnListener { // we expect this case for old sailing events such as ESS Singapore, Quingdao, where the confirmation event did not contain the finish // positioning list FinishPositioningListFinder positioningListFinder = new FinishPositioningListFinder(raceLog); - positioningList = positioningListFinder.analyze(); + positioningList = positioningListFinder.analyze(); // this is OK because the precondition for calling this method is that a + // RaceLogFinishPositioningConfirmedEvent event was found in the race log } if (positioningList != null) { for (CompetitorResult positionedCompetitor : positioningList) { From a60146b350394f55574fb4df83941e2b83eb9149 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Fri, 22 Jan 2016 15:42:16 +0100 Subject: [PATCH 153/165] Initial implementation of action bar for CompetitorTable --- ...AbstractCompetitorRegistrationsDialog.java | 72 +---------------- .../gwt/ui/adminconsole/CompetitorPanel.java | 80 +------------------ .../adminconsole/CompetitorTableWrapper.java | 75 +++++++++++++++++ .../gwt/ui/adminconsole/TableWrapper.java | 2 + 4 files changed, 82 insertions(+), 147 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java index 51acc43f7a1..6c6369bab91 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorRegistrationsDialog.java @@ -7,7 +7,6 @@ import com.google.gwt.core.client.Callback; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.Window; -import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.CaptionPanel; import com.google.gwt.user.client.ui.CheckBox; @@ -68,17 +67,10 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia addCompetitorButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { - openAddCompetitorDialog(); + registeredCompetitorsTable.openEditCompetitorDialog(new CompetitorDTOImpl(), boatClass); } }); - final Button editCompetitorButton = new Button(stringMessages.edit(stringMessages.competitor())); - editCompetitorButton.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - openEditCompetitorDialog(); - } - }); final Button inviteCompetitorsButton = new Button(stringMessages.inviteSelectedCompetitors()); inviteCompetitorsButton.addClickHandler(new ClickHandler() { @Override @@ -122,7 +114,6 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia competitorRegistrationPanel.setCellVerticalAlignment(movePanel, HasVerticalAlignment.ALIGN_MIDDLE); competitorRegistrationPanel.add(allCompetitorsPanel); buttonPanel.add(addCompetitorButton); - buttonPanel.add(editCompetitorButton); buttonPanel.add(inviteCompetitorsButton); mainPanel.add(buttonPanel); showOnlyCompetitorsOfLogCheckBox = new CheckBox(stringMessages.showOnlyCompetitorsOfLog()); @@ -155,71 +146,11 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia CompetitorTableWrapper> to) { move(from, to, from.getSelectionModel().getSelectedSet()); } - - private void openAddCompetitorDialog() { - new CompetitorEditDialog(stringMessages, new CompetitorDTOImpl(), - new DataEntryDialog.DialogCallback() { - @Override - public void ok(CompetitorDTO competitor) { - sailingService.addOrUpdateCompetitor(competitor, new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError("Error trying to add competitor: " + caught.getMessage()); - } - - @Override - public void onSuccess(CompetitorDTO updatedCompetitor) { - registeredCompetitorsTable.getFilterField().add(updatedCompetitor); - } - }); - } - - @Override - public void cancel() { - } - }, boatClass).show(); - } protected boolean showOnlyCompetitorsOfLog(){ return showOnlyCompetitorsOfLogCheckBox.getValue(); } - private void openEditCompetitorDialog() { - // get currently selected competitor - if (registeredCompetitorsTable.getSelectionModel().getSelectedSet().size() != 1) { - // show some warning - } else { - final CompetitorDTO competitorToEdit = registeredCompetitorsTable.getSelectionModel().getSelectedSet() - .iterator().next(); - new CompetitorEditDialog(stringMessages, competitorToEdit, - new DataEntryDialog.DialogCallback() { - @Override - public void ok(CompetitorDTO competitor) { - sailingService.addOrUpdateCompetitor(competitor, new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError("Error trying to add competitor: " + caught.getMessage()); - } - - @Override - public void onSuccess(CompetitorDTO updatedCompetitor) { - int editedCompetitorIndex = registeredCompetitorsTable.getDataProvider().getList() - .indexOf(competitorToEdit); - registeredCompetitorsTable.getDataProvider().getList().remove(competitorToEdit); - registeredCompetitorsTable.getDataProvider().getList() - .add(editedCompetitorIndex, updatedCompetitor); - registeredCompetitorsTable.getDataProvider().refresh(); - } - }); - } - - @Override - public void cancel() { - } - }, /* boatClass */null).show(); - } - } - protected void refreshCompetitors() { registeredCompetitorsTable.getFilterField().removeAll(); allCompetitorsTable.getFilterField().removeAll(); @@ -263,5 +194,4 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia Util.addAll(registeredCompetitorsTable.getAllCompetitors(), registeredCompetitors); return registeredCompetitors; } - } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorPanel.java index 79570bfeb05..6df107211ff 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorPanel.java @@ -1,15 +1,9 @@ package com.sap.sailing.gwt.ui.adminconsole; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; import java.util.Set; -import com.google.gwt.cell.client.FieldUpdater; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; -import com.google.gwt.user.client.Window; -import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.SimplePanel; @@ -20,10 +14,8 @@ import com.sap.sailing.domain.common.dto.CompetitorDTO; import com.sap.sailing.domain.common.dto.CompetitorDTOImpl; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sse.common.Util; import com.sap.sse.gwt.client.ErrorReporter; import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel; -import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback; /** * Allows an administrator to view and edit the set of competitors currently maintained by the server. @@ -32,9 +24,6 @@ import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback; * */ public class CompetitorPanel extends SimplePanel { - private final SailingServiceAsync sailingService; - private final StringMessages stringMessages; - private final ErrorReporter errorReporter; private final CompetitorTableWrapper> competitorTable; private final RefreshableMultiSelectionModel refreshableCompetitorSelectionModel; private final String leaderboardName; @@ -47,9 +36,6 @@ public class CompetitorPanel extends SimplePanel { public CompetitorPanel(final SailingServiceAsync sailingService, final String leaderboardName, final StringMessages stringMessages, final ErrorReporter errorReporter) { super(); - this.sailingService = sailingService; - this.stringMessages = stringMessages; - this.errorReporter = errorReporter; this.leaderboardName = leaderboardName; this.competitorTable = new CompetitorTableWrapper<>(sailingService, stringMessages, errorReporter, /* multiSelection */ true, /* enablePager */ false); this.refreshableCompetitorSelectionModel = (RefreshableMultiSelectionModel) competitorTable.getSelectionModel(); @@ -74,7 +60,7 @@ public class CompetitorPanel extends SimplePanel { allowReloadButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { - allowUpdate(refreshableCompetitorSelectionModel.getSelectedSet()); + competitorTable.allowUpdate(refreshableCompetitorSelectionModel.getSelectedSet()); } }); buttonPanel.add(allowReloadButton); @@ -115,24 +101,8 @@ public class CompetitorPanel extends SimplePanel { } competitorsPanel.add(buttonPanel); - - // competitor table - ImagesBarColumn competitorActionColumn = new ImagesBarColumn( - new CompetitorConfigImagesBarCell(stringMessages)); - competitorActionColumn.setFieldUpdater(new FieldUpdater() { - @Override - public void update(int index, final CompetitorDTO competitor, String value) { - if (CompetitorConfigImagesBarCell.ACTION_EDIT.equals(value)) { - openEditCompetitorDialog(competitor); - } else if (CompetitorConfigImagesBarCell.ACTION_REFRESH.equals(value)) { - allowUpdate(Collections.singleton(competitor)); - } - } - - }); - - competitorTable.getTable().addColumn(competitorActionColumn, stringMessages.actions()); mainPanel.add(competitorTable); + refreshableCompetitorSelectionModel.addSelectionChangeHandler(new Handler() { @Override public void onSelectionChange(SelectionChangeEvent event) { @@ -146,52 +116,10 @@ public class CompetitorPanel extends SimplePanel { } } - private void allowUpdate(final Iterable competitors) { - List serializableSingletonList = new ArrayList(); - Util.addAll(competitors, serializableSingletonList); - sailingService.allowCompetitorResetToDefaults(serializableSingletonList, new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError("Error trying to allow resetting competitors " + competitors - + " to defaults: " + caught.getMessage()); - } - - @Override - public void onSuccess(Void result) { - Window.alert(stringMessages.successfullyAllowedCompetitorReset(competitors.toString())); - } - }); - } - private void openAddCompetitorDialog() { - openEditCompetitorDialog(new CompetitorDTOImpl()); + competitorTable.openEditCompetitorDialog(new CompetitorDTOImpl(), /* boat class to be used from CompetitorDTO */ null); } - - private void openEditCompetitorDialog(CompetitorDTO competitor) { - final CompetitorEditDialog dialog = new CompetitorEditDialog(stringMessages, competitor, new DialogCallback() { - @Override - public void ok(CompetitorDTO competitor) { - sailingService.addOrUpdateCompetitor(competitor, new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError("Error trying to update competitor: " + caught.getMessage()); - } - - @Override - public void onSuccess(CompetitorDTO updatedCompetitor) { - refreshCompetitorList(); - } - }); - } - - @Override - public void cancel() { - } - }, /* boat class to be used from CompetitorDTO */ null); - dialog.ensureDebugId("CompetitorEditDialog"); - dialog.show(); - } - + public void refreshCompetitorList() { competitorTable.refreshCompetitorList(leaderboardName); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java index 17ef1e46281..06bb3795c38 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java @@ -1,9 +1,11 @@ package com.sap.sailing.gwt.ui.adminconsole; import java.util.ArrayList; +import java.util.Collections; import java.util.Comparator; import java.util.List; +import com.google.gwt.cell.client.FieldUpdater; import com.google.gwt.cell.client.SafeHtmlCell; import com.google.gwt.core.client.Callback; import com.google.gwt.resources.client.ImageResource; @@ -12,6 +14,7 @@ import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.user.cellview.client.Column; import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler; import com.google.gwt.user.cellview.client.TextColumn; +import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.ImageResourceRenderer; import com.google.gwt.user.client.ui.Label; @@ -21,10 +24,12 @@ import com.sap.sailing.gwt.ui.client.FlagImageResolver; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sse.common.Color; +import com.sap.sse.common.Util; import com.sap.sse.common.util.NaturalComparator; import com.sap.sse.gwt.client.ErrorReporter; import com.sap.sse.gwt.client.celltable.EntityIdentityComparator; import com.sap.sse.gwt.client.celltable.RefreshableSelectionModel; +import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback; import com.sap.sse.gwt.client.panels.LabeledAbstractFilterablePanel; public class CompetitorTableWrapper> extends TableWrapper { @@ -209,6 +214,22 @@ public class CompetitorTableWrapper competitorActionColumn = new ImagesBarColumn( + new CompetitorConfigImagesBarCell(stringMessages)); + competitorActionColumn.setFieldUpdater(new FieldUpdater() { + @Override + public void update(int index, final CompetitorDTO competitor, String value) { + if (CompetitorConfigImagesBarCell.ACTION_EDIT.equals(value)) { + openEditCompetitorDialog(competitor, competitor.getBoatClass().getName()); + } else if (CompetitorConfigImagesBarCell.ACTION_REFRESH.equals(value)) { + allowUpdate(Collections.singleton(competitor)); + } + } + + }); + mainPanel.insert(filterField, 0); table.addColumnSortHandler(competitorColumnListHandler); table.addColumn(sailIdColumn, stringMessages.sailNumber()); @@ -220,6 +241,7 @@ public class CompetitorTableWrapper result) { filterField.updateAll(result); } + + void openEditCompetitorDialog(final CompetitorDTO competitor, String boatClass) { + final CompetitorEditDialog dialog = new CompetitorEditDialog(stringMessages, competitor, new DialogCallback() { + @Override + public void ok(final CompetitorDTO competitor) { + sailingService.addOrUpdateCompetitor(competitor, new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError("Error trying to update competitor: " + caught.getMessage()); + } + + @Override + public void onSuccess(CompetitorDTO updatedCompetitor) { + //only reload selected competitors reloading wirh refreshCompetitorList(leaderboardName) + //would not work in case the list is not based on a leaderboard e.g. AbstractCompetitorRegistrationDialog + int editedCompetitorIndex = getDataProvider().getList() + .indexOf(competitor); + getDataProvider().getList().remove(competitor); + if (editedCompetitorIndex >= 0){ + getDataProvider().getList().add(editedCompetitorIndex, updatedCompetitor); + } else { + //in case competitor was not present --> not edit, but create + getDataProvider().getList().add(updatedCompetitor); + } + getDataProvider().refresh(); + } + }); + } + + @Override + public void cancel() { + } + }, boatClass); + dialog.ensureDebugId("CompetitorEditDialog"); + dialog.show(); + } + + protected void allowUpdate(final Iterable competitors) { + List serializableSingletonList = new ArrayList(); + Util.addAll(competitors, serializableSingletonList); + sailingService.allowCompetitorResetToDefaults(serializableSingletonList, new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError("Error trying to allow resetting competitors " + competitors + + " to defaults: " + caught.getMessage()); + } + + @Override + public void onSuccess(Void result) { + Window.alert(stringMessages.successfullyAllowedCompetitorReset(competitors.toString())); + } + }); + } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TableWrapper.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TableWrapper.java index f4c8bc05f49..65d7549a29a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TableWrapper.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TableWrapper.java @@ -30,6 +30,7 @@ public abstract class TableWrapper> im protected VerticalPanel mainPanel; protected final SailingServiceAsync sailingService; protected final ErrorReporter errorReporter; + protected final StringMessages stringMessages; private final AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class); private final ListHandler columnSortHandler; @@ -48,6 +49,7 @@ public abstract class TableWrapper> im boolean multiSelection, boolean enablePager, EntityIdentityComparator entityIdentityComparator) { this.sailingService = sailingService; this.errorReporter = errorReporter; + this.stringMessages = stringMessages; table = new FlushableCellTable(10000, tableRes); table.ensureDebugId("WrappedTable"); this.dataProvider = new ListDataProvider(); From bb04c3479a36ef634e8591ccea8960aa8730bce6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bro=C3=9F?= Date: Fri, 22 Jan 2016 16:16:15 +0100 Subject: [PATCH 154/165] Fixes bug in comeptitorTableWrapper --- .../gwt/ui/adminconsole/CompetitorTableWrapper.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java index 06bb3795c38..9008fa15aed 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java @@ -310,8 +310,8 @@ public class CompetitorTableWrapper() { + void openEditCompetitorDialog(final CompetitorDTO originalCompetitor, String boatClass) { + final CompetitorEditDialog dialog = new CompetitorEditDialog(stringMessages, originalCompetitor, new DialogCallback() { @Override public void ok(final CompetitorDTO competitor) { sailingService.addOrUpdateCompetitor(competitor, new AsyncCallback() { @@ -322,11 +322,10 @@ public class CompetitorTableWrapper= 0){ getDataProvider().getList().add(editedCompetitorIndex, updatedCompetitor); } else { From a522f7450e43cd825fa58b5a869c3022c8edcedd Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 22 Jan 2016 16:20:46 +0100 Subject: [PATCH 155/165] added more tests for mark passing updates from race logs Change-Id: I5f1631678bef2ecf7b5a1e8dbc059705e562e9d9 --- ...teFromRaceLogFinishPositioingListTest.java | 40 +++++++++++++++++-- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/MarkPassingUpdateFromRaceLogFinishPositioingListTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/MarkPassingUpdateFromRaceLogFinishPositioingListTest.java index cc14fb14f86..6f44d8502a5 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/MarkPassingUpdateFromRaceLogFinishPositioingListTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/MarkPassingUpdateFromRaceLogFinishPositioingListTest.java @@ -2,6 +2,9 @@ package com.sap.sailing.domain.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; import java.io.File; import java.io.IOException; @@ -10,6 +13,9 @@ import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.text.ParseException; +import java.util.ArrayList; +import java.util.List; +import java.util.NavigableSet; import java.util.UUID; import org.junit.Before; @@ -99,18 +105,46 @@ public class MarkPassingUpdateFromRaceLogFinishPositioingListTest extends Abstra */ @Test public void testOriginalFinishMarkPassingTime() throws ParseException, NoWindException { + int passId = 0; Competitor alinghi = getCompetitorByName("Alinghi"); final MarkPassing alinghiOriginalFinish = getTrackedRace().getMarkPassing(alinghi, getTrackedRace().getRace().getCourse().getLastWaypoint()); final TimePoint alinghiOriginalFinishingTime = alinghiOriginalFinish.getTimePoint(); assertNotNull(alinghiOriginalFinish.getTimePoint()); final TimePoint now = MillisecondsTimePoint.now(); final CompetitorResults alinghiFinishesNow = createCompetitorResults(new Util.Pair<>(alinghi, now)); - raceLog.add(new RaceLogFinishPositioningConfirmedEventImpl(now, author, /* pPassId */ 0, alinghiFinishesNow)); + raceLog.add(new RaceLogFinishPositioningConfirmedEventImpl(now, author, passId, alinghiFinishesNow)); final MarkPassing alinghiCorrectedFinishMarkPassing = getTrackedRace().getMarkPassing(alinghi, getTrackedRace().getRace().getCourse().getLastWaypoint()); assertEquals(now, alinghiCorrectedFinishMarkPassing.getTimePoint()); - raceLog.add(new RaceLogPassChangeEventImpl(now.plus(Duration.ONE_SECOND), author, /* pass */ 1)); // this should invalidate the previously edited result + raceLog.add(new RaceLogPassChangeEventImpl(now.plus(Duration.ONE_SECOND), author, ++passId)); // this should invalidate the previously edited result assertEquals(alinghiOriginalFinishingTime, getTrackedRace().getMarkPassing(alinghi, getTrackedRace().getRace().getCourse().getLastWaypoint()).getTimePoint()); - // TODO now eliminate the original finish mark passing, then set a finishing time in the race log to see how the synthetic mark passing is created and then again removed + List withoutLast = new ArrayList<>(); + final NavigableSet alinghiOriginalMarkPassings = getTrackedRace().getMarkPassings(alinghi); + getTrackedRace().lockForRead(alinghiOriginalMarkPassings); + try { + withoutLast.addAll(alinghiOriginalMarkPassings); + } finally { + getTrackedRace().unlockAfterRead(alinghiOriginalMarkPassings); + } + withoutLast.remove(withoutLast.size()-1); + getTrackedRace().updateMarkPassings(alinghi, withoutLast); + assertNull(getTrackedRace().getMarkPassing(alinghi, getTrackedRace().getRace().getCourse().getLastWaypoint())); + raceLog.add(new RaceLogFinishPositioningConfirmedEventImpl(now, author, passId, alinghiFinishesNow)); + final MarkPassing alinghiSyntheticFinish = getTrackedRace().getMarkPassing(alinghi, getTrackedRace().getRace().getCourse().getLastWaypoint()); + assertEquals(now, alinghiSyntheticFinish.getTimePoint()); + assertNull(alinghiSyntheticFinish.getOriginal()); + // advancing to the next pass is expected to remove the synthetic mark passing again + raceLog.add(new RaceLogPassChangeEventImpl(now.plus(Duration.ONE_HOUR), author, ++passId)); + assertNull(getTrackedRace().getMarkPassing(alinghi, getTrackedRace().getRace().getCourse().getLastWaypoint())); + raceLog.add(new RaceLogFinishPositioningConfirmedEventImpl(now, author, passId, alinghiFinishesNow)); + final MarkPassing alinghiSyntheticFinish2 = getTrackedRace().getMarkPassing(alinghi, getTrackedRace().getRace().getCourse().getLastWaypoint()); + assertEquals(now, alinghiSyntheticFinish2.getTimePoint()); + assertNull(alinghiSyntheticFinish2.getOriginal()); + List withLastAgain = new ArrayList<>(withoutLast); + withLastAgain.add(alinghiOriginalFinish); + getTrackedRace().updateMarkPassings(alinghi, withLastAgain); + final MarkPassing alinghiNoLongerSynthetic = getTrackedRace().getMarkPassing(alinghi, getTrackedRace().getRace().getCourse().getLastWaypoint()); + assertSame(alinghiOriginalFinish, alinghiNoLongerSynthetic.getOriginal()); + assertTrue(alinghiNoLongerSynthetic.getOriginal() != alinghiNoLongerSynthetic); } @SafeVarargs From c6ca28750d317ae29a7592143f829d6263e16ede Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 22 Jan 2016 16:24:47 +0100 Subject: [PATCH 156/165] removed method from DynamicTrackedRace contract that was only used by Impl class Change-Id: I29b462c77de1b13932c31a39e43449b82d651d5c --- .../sailing/domain/test/mock/MockedTrackedRace.java | 5 ----- .../sailing/domain/tracking/DynamicTrackedRace.java | 12 ------------ .../domain/tracking/impl/DynamicTrackedRaceImpl.java | 12 ++++++++++-- .../sap/sailing/gwt/ui/test/MockedTrackedRace.java | 5 ----- 4 files changed, 10 insertions(+), 24 deletions(-) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java index 3ef95290686..ecf28a13037 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java @@ -7,7 +7,6 @@ import java.util.NavigableSet; import java.util.Set; import java.util.TreeSet; -import com.sap.sailing.domain.abstractlog.race.CompetitorResults; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; @@ -1027,10 +1026,6 @@ public class MockedTrackedRace implements DynamicTrackedRace { return this; } - @Override - public void updateFinishingTimesFromRaceLog(CompetitorResults event) { - } - @Override public void updateMarkPassingsAfterRaceLogChanges() { } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/DynamicTrackedRace.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/DynamicTrackedRace.java index 3b093a2eb58..f2f1c07b13c 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/DynamicTrackedRace.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/DynamicTrackedRace.java @@ -1,7 +1,6 @@ package com.sap.sailing.domain.tracking; import com.sap.sailing.domain.abstractlog.race.CompetitorResult; -import com.sap.sailing.domain.abstractlog.race.CompetitorResults; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent; import com.sap.sailing.domain.base.Competitor; @@ -53,17 +52,6 @@ public interface DynamicTrackedRace extends TrackedRace { */ void updateMarkPassings(Competitor competitor, Iterable markPassings); - /** - * The {@link CompetitorResults} from the race log may optionally set a finishing time for competitors. Also, - * depending on how the race log has been modified (e.g., a new pass could have been started or a - * {@link RaceLogFinishPositioningConfirmedEvent} could have been revoked) it may be possible that a finishing - * time previously set from the race log now has to be reset to its original state as coming from the tracking - * provider. This can either mean resetting the mark passing to its {@link MarkPassing#getOriginal() original} - * version or removing it in case the {@link MarkPassing#getOriginal()} method delivers {@code null}, meaning - * that this mark passing was solely based on the race log information which now would have disappeared. - */ - void updateFinishingTimesFromRaceLog(CompetitorResults result); - /** * When there is a significant change in the race logs attached to this race, such as adding another race log or * removing a race log or switching to another pass in one of the race logs attached, the effects on the diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java index 4cfd493f92d..9a3eceb6bc5 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java @@ -731,8 +731,16 @@ DynamicTrackedRace, GPSTrackListener { } } - @Override - public void updateFinishingTimesFromRaceLog(CompetitorResults results) { + /** + * The {@link CompetitorResults} from the race log may optionally set a finishing time for competitors. Also, + * depending on how the race log has been modified (e.g., a new pass could have been started or a + * {@link RaceLogFinishPositioningConfirmedEvent} could have been revoked) it may be possible that a finishing + * time previously set from the race log now has to be reset to its original state as coming from the tracking + * provider. This can either mean resetting the mark passing to its {@link MarkPassing#getOriginal() original} + * version or removing it in case the {@link MarkPassing#getOriginal()} method delivers {@code null}, meaning + * that this mark passing was solely based on the race log information which now would have disappeared. + */ + private void updateFinishingTimesFromRaceLog(CompetitorResults results) { final Waypoint finish = getRace().getCourse().getLastWaypoint(); if (finish != null) { // can't do anything for an empty course final Map resultMap = new HashMap<>(); diff --git a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java index 50cd77aa6ab..2367fbbc243 100755 --- a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java +++ b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java @@ -8,7 +8,6 @@ import java.util.List; import java.util.NavigableSet; import java.util.Set; -import com.sap.sailing.domain.abstractlog.race.CompetitorResults; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; @@ -788,10 +787,6 @@ public class MockedTrackedRace implements DynamicTrackedRace { return this; } - @Override - public void updateFinishingTimesFromRaceLog(CompetitorResults event) { - } - @Override public void updateMarkPassingsAfterRaceLogChanges() { } From 7a41f85d171dea11ff0bfd72c6be8c812a4d9484 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 22 Jan 2016 16:35:19 +0100 Subject: [PATCH 157/165] fixed mark fix loading tests which require now that there is a RegattaLogDefineMarkEvent in the RegattaLog Change-Id: Iac9d5e9699b7df4aed376b508c92ec49a097de89 --- .../domain/racelogtracking/test/AbstractGPSFixStoreTest.java | 2 +- .../racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java index 2c36ae15a3c..bc7380eb902 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java @@ -49,7 +49,7 @@ public class AbstractGPSFixStoreTest { protected final Competitor comp = DomainFactory.INSTANCE.getOrCreateCompetitor("comp", "comp", null, null, null, null, null, /* timeOnTimeFactor */ null, /* timeOnDistanceAllowanceInSecondsPerNauticalMile */ null); protected final Mark mark = DomainFactory.INSTANCE.getOrCreateMark("mark"); - private final AbstractLogEventAuthor author = new LogEventAuthorImpl("author", 0); + protected final AbstractLogEventAuthor author = new LogEventAuthorImpl("author", 0); protected GPSFixMoving createFix(long millis, double lat, double lng, double knots, double degrees) { return new GPSFixMovingImpl(new DegreePosition(lat, lng), diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java index fd62591f81b..93fa21832c5 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java @@ -9,6 +9,7 @@ import java.util.Collections; import org.junit.Test; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver; +import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDefineMarkEventImpl; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Course; @@ -46,6 +47,8 @@ public class TrackedRaceLoadsFixesTest extends AbstractGPSFixStoreTest { /* timeOnTimeFactor */ null, /* timeOnDistanceAllowancePerNauticalMile */ null); Mark mark2 = DomainFactory.INSTANCE.getOrCreateMark("mark2"); DeviceIdentifier markDevice = new SmartphoneImeiIdentifier("imei2"); + regattaLog.add(new RegattaLogDefineMarkEventImpl(new MillisecondsTimePoint(1), author, new MillisecondsTimePoint(1), 0, mark)); + regattaLog.add(new RegattaLogDefineMarkEventImpl(new MillisecondsTimePoint(1), author, new MillisecondsTimePoint(1), 0, mark2)); Course course = new CourseImpl("course", Arrays.asList(new Waypoint[] { new WaypointImpl(mark), new WaypointImpl(mark2) })); RaceDefinition race = new RaceDefinitionImpl("race", course, boatClass, Arrays.asList(new Competitor[] { comp, comp2 })); @@ -89,6 +92,8 @@ public class TrackedRaceLoadsFixesTest extends AbstractGPSFixStoreTest { Competitor comp2 = DomainFactory.INSTANCE.getOrCreateCompetitor("comp2", "comp2", null, null, null, null, null, /* timeOnTimeFactor */ null, /* timeOnDistanceAllowancePerNauticalMile */ null); Mark mark2 = DomainFactory.INSTANCE.getOrCreateMark("mark2"); + regattaLog.add(new RegattaLogDefineMarkEventImpl(new MillisecondsTimePoint(1), author, new MillisecondsTimePoint(1), 0, mark)); + regattaLog.add(new RegattaLogDefineMarkEventImpl(new MillisecondsTimePoint(1), author, new MillisecondsTimePoint(1), 0, mark2)); DeviceIdentifier device2 = new SmartphoneImeiIdentifier("imei2"); DeviceIdentifier device3 = new SmartphoneImeiIdentifier("imei3"); Course course = new CourseImpl("course", Arrays.asList(new Waypoint[] { new WaypointImpl(mark), From 5af777f7264fb2e808dd28a83ad5e4db41fe62de Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 22 Jan 2016 16:40:46 +0100 Subject: [PATCH 158/165] fixed tests by using different creation time stamps for mark definition events Change-Id: I5e89fe6e581a70e850c08cafeae62a2c85d489dd --- .../racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java index 93fa21832c5..1cd8a239441 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java @@ -48,7 +48,7 @@ public class TrackedRaceLoadsFixesTest extends AbstractGPSFixStoreTest { Mark mark2 = DomainFactory.INSTANCE.getOrCreateMark("mark2"); DeviceIdentifier markDevice = new SmartphoneImeiIdentifier("imei2"); regattaLog.add(new RegattaLogDefineMarkEventImpl(new MillisecondsTimePoint(1), author, new MillisecondsTimePoint(1), 0, mark)); - regattaLog.add(new RegattaLogDefineMarkEventImpl(new MillisecondsTimePoint(1), author, new MillisecondsTimePoint(1), 0, mark2)); + regattaLog.add(new RegattaLogDefineMarkEventImpl(new MillisecondsTimePoint(2), author, new MillisecondsTimePoint(1), 0, mark2)); Course course = new CourseImpl("course", Arrays.asList(new Waypoint[] { new WaypointImpl(mark), new WaypointImpl(mark2) })); RaceDefinition race = new RaceDefinitionImpl("race", course, boatClass, Arrays.asList(new Competitor[] { comp, comp2 })); @@ -93,7 +93,7 @@ public class TrackedRaceLoadsFixesTest extends AbstractGPSFixStoreTest { /* timeOnTimeFactor */ null, /* timeOnDistanceAllowancePerNauticalMile */ null); Mark mark2 = DomainFactory.INSTANCE.getOrCreateMark("mark2"); regattaLog.add(new RegattaLogDefineMarkEventImpl(new MillisecondsTimePoint(1), author, new MillisecondsTimePoint(1), 0, mark)); - regattaLog.add(new RegattaLogDefineMarkEventImpl(new MillisecondsTimePoint(1), author, new MillisecondsTimePoint(1), 0, mark2)); + regattaLog.add(new RegattaLogDefineMarkEventImpl(new MillisecondsTimePoint(2), author, new MillisecondsTimePoint(1), 0, mark2)); DeviceIdentifier device2 = new SmartphoneImeiIdentifier("imei2"); DeviceIdentifier device3 = new SmartphoneImeiIdentifier("imei3"); Course course = new CourseImpl("course", Arrays.asList(new Waypoint[] { new WaypointImpl(mark), From 60d6cbc4c615feff8a88d9ab7a136cfb28a237d0 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 22 Jan 2016 18:23:37 +0100 Subject: [PATCH 159/165] caching CompetitorResult objects in a Map in DynamicTrackedRaceImpl; this way regular mark passing updates are not troubled by expensive race log look-ups Change-Id: I2bfe6fcf4eac4a6b9749fb4ea8b549967bc4aeb8 --- .../tracking/impl/DynamicTrackedRaceImpl.java | 65 ++++++++----------- 1 file changed, 27 insertions(+), 38 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java index 9a3eceb6bc5..c631792071e 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java @@ -80,6 +80,13 @@ DynamicTrackedRace, GPSTrackListener { private transient Set startTimeChangedListeners; private transient Set raceAbortedListeners; + /** + * Caches the result from {@link #getResultsFromRaceLogs}. This cache is updated in + * {@link #updateMarkPassingsAfterRaceLogChanges()} which must be called by + * {@link DynamicTrackedRaceLogListener} when the race log situation may have changed. + */ + private Map competitorResultsFromRaceLog; + public DynamicTrackedRaceImpl(TrackedRegatta trackedRegatta, RaceDefinition race, Iterable sidelines, WindStore windStore, GPSFixStore gpsFixStore, long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed, @@ -88,6 +95,7 @@ DynamicTrackedRace, GPSTrackListener { super(trackedRegatta, race, sidelines, windStore, gpsFixStore, delayToLiveInMillis, millisecondsOverWhichToAverageWind, millisecondsOverWhichToAverageSpeed, delayForCacheInvalidationOfWindEstimation, useInternalMarkPassingAlgorithm, rankingMetricConstructor, raceLogResolver); + this.competitorResultsFromRaceLog = new HashMap<>(); this.logListener = new DynamicTrackedRaceLogListener(this); if (markPassingCalculator != null) { logListener.setMarkPassingUpdateListener(markPassingCalculator.getListener()); @@ -507,14 +515,15 @@ DynamicTrackedRace, GPSTrackListener { @Override public void updateMarkPassings(Competitor competitor, final Iterable markPassings) { - final CompetitorResult resultFromRaceLog = getResultsFromRaceLog(competitor); + final CompetitorResult resultFromRaceLog = competitorResultsFromRaceLog.get(competitor); final Iterable markPassingsToUse = createOrUpdateFinishMarkPassingIfRequired(competitor, markPassings, resultFromRaceLog); updateMarkPassingsNotConsideringFinishingTimesFromRaceLog(competitor, markPassingsToUse); } @Override public void updateMarkPassingsAfterRaceLogChanges() { - updateFinishingTimesFromRaceLog(getResultsFromRaceLogs()); + competitorResultsFromRaceLog = getResultsFromRaceLogs(); + updateFinishingTimesFromRaceLog(); } /** @@ -589,34 +598,19 @@ DynamicTrackedRace, GPSTrackListener { return neededToCreateOrUpdateFinishMarkPassing ? copyOfMarkPassings : markPassings; } - /** - * Looks in all {@link #attachedRaceLogs attached race logs} for the last valid - * {@link RaceLogFinishPositioningConfirmedEvent} that has a {@link CompetitorResult} for {@code competitor}. The - * first one found will be returned; if none is found, null will be returned. - */ - private CompetitorResult getResultsFromRaceLog(Competitor competitor) { - CompetitorResult result = null; - final CompetitorResults results = getResultsFromRaceLogs(); - if (results != null) { - for (CompetitorResult competitorResult : results) { - if (getRace().getCompetitorById(competitorResult.getCompetitorId()) == competitor) { - result = competitorResult; - break; - } - } - } - return result; - } - - private CompetitorResults getResultsFromRaceLogs() { + private Map getResultsFromRaceLogs() { + final Map result = new HashMap<>(); CompetitorResults results = null; for (final RaceLog raceLog : attachedRaceLogs.values()) { results = new ConfirmedFinishPositioningListFinder(raceLog).analyze(); if (results != null) { + for (CompetitorResult cr : results) { + result.put(getRace().getCompetitorById(cr.getCompetitorId()), cr); + } break; } } - return results; + return result; } /** @@ -732,25 +726,20 @@ DynamicTrackedRace, GPSTrackListener { } /** - * The {@link CompetitorResults} from the race log may optionally set a finishing time for competitors. Also, - * depending on how the race log has been modified (e.g., a new pass could have been started or a - * {@link RaceLogFinishPositioningConfirmedEvent} could have been revoked) it may be possible that a finishing - * time previously set from the race log now has to be reset to its original state as coming from the tracking - * provider. This can either mean resetting the mark passing to its {@link MarkPassing#getOriginal() original} - * version or removing it in case the {@link MarkPassing#getOriginal()} method delivers {@code null}, meaning - * that this mark passing was solely based on the race log information which now would have disappeared. + * The {@link CompetitorResults} from the race log as cached in {@link #competitorResultsFromRaceLog} may optionally + * set a finishing time for competitors. Also, depending on how the race log has been modified (e.g., a new pass + * could have been started or a {@link RaceLogFinishPositioningConfirmedEvent} could have been revoked) it may be + * possible that a finishing time previously set from the race log now has to be reset to its original state as + * coming from the tracking provider. This can either mean resetting the mark passing to its + * {@link MarkPassing#getOriginal() original} version or removing it in case the {@link MarkPassing#getOriginal()} + * method delivers {@code null}, meaning that this mark passing was solely based on the race log information which + * now would have disappeared. */ - private void updateFinishingTimesFromRaceLog(CompetitorResults results) { + private void updateFinishingTimesFromRaceLog() { final Waypoint finish = getRace().getCourse().getLastWaypoint(); if (finish != null) { // can't do anything for an empty course - final Map resultMap = new HashMap<>(); - if (results != null) { - for (final CompetitorResult result : results) { - resultMap.put(getRace().getCompetitorById(result.getCompetitorId()), result); - } - } for (final Competitor competitor : getRace().getCompetitors()) { - final CompetitorResult competitorResult = resultMap.get(competitor); + final CompetitorResult competitorResult = competitorResultsFromRaceLog.get(competitor); final NavigableSet markPassings = getMarkPassings(competitor); final Iterable markPassingsToUse; lockForRead(markPassings); From f8e3c32baeecfef0c0b40e1d224b76bdabdc117d Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 25 Jan 2016 11:11:03 +0100 Subject: [PATCH 160/165] integrated loading indicator in abstract entry point hierarchy and included in AdminConsole and EmbeddedMapAndWindChart entry points Change-Id: Ia22bed6fd44a2cf2035a313d73dacfa5236de63a --- java/com.sap.sailing.gwt.ui/AdminConsole.html | 72 ++++++++++++++++++ .../EmbeddedMapAndWindChart.html | 74 ++++++++++++++++++- java/com.sap.sailing.gwt.ui/Home.html | 4 +- .../ui/client/AbstractSecureEntryPoint.java | 10 +++ 4 files changed, 157 insertions(+), 3 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/AdminConsole.html b/java/com.sap.sailing.gwt.ui/AdminConsole.html index 182b6efdd40..d170f37244a 100644 --- a/java/com.sap.sailing.gwt.ui/AdminConsole.html +++ b/java/com.sap.sailing.gwt.ui/AdminConsole.html @@ -41,6 +41,73 @@ + + + @@ -61,5 +128,10 @@ +

    +

    SAP Sailing Analytics

    +

    Loading, please wait...

    +
    +
    diff --git a/java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.html b/java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.html index 440a01f45c2..7d41e6e92cc 100644 --- a/java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.html +++ b/java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.html @@ -24,6 +24,73 @@ + + + @@ -36,6 +103,11 @@ in order for this application to display correctly. - + +
    +

    SAP Sailing Analytics

    +

    Loading, please wait...

    +
    +
    diff --git a/java/com.sap.sailing.gwt.ui/Home.html b/java/com.sap.sailing.gwt.ui/Home.html index e4172f8e8a0..549a7c2e720 100644 --- a/java/com.sap.sailing.gwt.ui/Home.html +++ b/java/com.sap.sailing.gwt.ui/Home.html @@ -15,8 +15,8 @@ - - + + diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/AbstractSecureEntryPoint.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/AbstractSecureEntryPoint.java index 235981885d6..658a86f04ad 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/AbstractSecureEntryPoint.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/AbstractSecureEntryPoint.java @@ -1,6 +1,8 @@ package com.sap.sse.security.ui.client; import com.google.gwt.core.client.EntryPoint; +import com.google.gwt.dom.client.Document; +import com.google.gwt.dom.client.Element; import com.sap.sse.gwt.client.StringMessages; /** @@ -15,8 +17,16 @@ import com.sap.sse.gwt.client.StringMessages; public abstract class AbstractSecureEntryPoint extends com.sap.sse.gwt.client.AbstractEntryPoint implements WithSecurity { private WithSecurity securityProvider; + /** + * Initializes the {@link UserManagementService} and removes the optional loading indicator from the DOM which is + * identified by the "loading" ID. + */ protected void doOnModuleLoad() { securityProvider = new DefaultWithSecurityImpl(); + final Element optionalLoadingIndicator = Document.get().getElementById("loading"); + if (optionalLoadingIndicator != null) { + optionalLoadingIndicator.removeFromParent(); + } } @Override From 4c378e7ca9d8f5dac7997d354fc4ddf86d830152 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 25 Jan 2016 11:18:29 +0100 Subject: [PATCH 161/165] enhanced Javadoc Change-Id: Ib6322d3c9741b99c03ed5e5260dd468c347e1ab0 --- .../sap/sse/security/ui/client/AbstractSecureEntryPoint.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/AbstractSecureEntryPoint.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/AbstractSecureEntryPoint.java index 658a86f04ad..1d9909a951c 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/AbstractSecureEntryPoint.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/AbstractSecureEntryPoint.java @@ -19,7 +19,8 @@ public abstract class AbstractSecureEntryPoint extends /** * Initializes the {@link UserManagementService} and removes the optional loading indicator from the DOM which is - * identified by the "loading" ID. + * identified by the "loading" ID. See the Home.html or AdminConsole.html entry point implementations for examples + * of how such a loading indicator can nicely be implemented. */ protected void doOnModuleLoad() { securityProvider = new DefaultWithSecurityImpl(); From d6b3066620a256f06a3efbb9b61c1682e8392b2d Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 25 Jan 2016 15:28:17 +0100 Subject: [PATCH 162/165] renamed AdminConsole tab from Race Committee App to Race Manager App Change-Id: I0594862ec56681a934c7fb030c2aaea82e4b96f1 --- .../com/sap/sailing/gwt/ui/client/StringMessages.properties | 2 +- .../com/sap/sailing/gwt/ui/client/StringMessages_de.properties | 2 +- .../com/sap/sailing/gwt/ui/client/StringMessages_ru.properties | 2 +- .../com/sap/sailing/gwt/ui/client/StringMessages_zh.properties | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties index bd4f433a3e1..6a07d186edb 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties @@ -1,5 +1,5 @@ manage2Sail=Manage2Sail -raceCommitteeApp=Race Committee App +raceCommitteeApp=Race Manager App tracTracEvents=TracTrac Events swissTimingEvents=SwissTiming Events trackedBefore=History of tracked events diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties index 0175581a211..4fbe8e179a2 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties @@ -1,5 +1,5 @@ manage2Sail=Manage2Sail -raceCommitteeApp=Wettfahrtleiter App +raceCommitteeApp=Race Manager App createNewEvent=Create New EventtracTracEvents=TracTrac Events swissTimingEvents=SwissTiming Events trackedBefore=Historie verfolgter Events diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties index 0851dfbc3c5..971a95349da 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties @@ -1,6 +1,6 @@ # If you want new properties translated then sent this over GMR (Mark Angell ) manage2Sail=Manage2Sail -raceCommitteeApp=Race Committee App +raceCommitteeApp=Race Manager App tracTracEvents=События Трак Трак swissTimingEvents=События Swiss Timing trackedBefore=Ранее Отслеженные diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties index e4dfaca14ad..4b8f9acb8dd 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties @@ -1,5 +1,5 @@ manage2Sail=Manage2Sail -raceCommitteeApp=Race Committee App +raceCommitteeApp=Race Manager App enableRaceFilter=Enable filter finishLine=终点线 raceLabel=比赛轮次 From a070d86627ac164870769b427119d8fcbb7749dd Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 25 Jan 2016 18:28:39 +0100 Subject: [PATCH 163/165] upgraded to TracAPI 3.1.3, hoping to fix the deadlock issue Change-Id: Ib8f06a5841b9a46c07667d7f3c3757de7efd9abe --- .../META-INF/MANIFEST.MF | 2 +- java/com.tractrac.clientmodule/README.txt | 27 ++++++++++++++++++ .../lib/TracAPI-src.jar | Bin 61840 -> 61840 bytes .../com.tractrac.clientmodule/lib/TracAPI.jar | Bin 786640 -> 786659 bytes 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/java/com.tractrac.clientmodule/META-INF/MANIFEST.MF b/java/com.tractrac.clientmodule/META-INF/MANIFEST.MF index 62fecd52a14..5238374bdb5 100644 --- a/java/com.tractrac.clientmodule/META-INF/MANIFEST.MF +++ b/java/com.tractrac.clientmodule/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: TracTrac Client module Bundle-SymbolicName: com.tractrac.clientmodule -Bundle-Version: 3.1.2 +Bundle-Version: 3.1.3 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ClassPath: ., lib/TracAPI.jar diff --git a/java/com.tractrac.clientmodule/README.txt b/java/com.tractrac.clientmodule/README.txt index 4e5e0c38f1d..895702bd543 100644 --- a/java/com.tractrac.clientmodule/README.txt +++ b/java/com.tractrac.clientmodule/README.txt @@ -16,6 +16,33 @@ It contains also some files: - test.sh -> script that compiles the code in the src folder, creates the test.jar library and execute the code of the example. - Manifest.txt -> manifest used to create the test.jar file +******************************************** +************* TracAPI 3.1.3 **************** +******************************************** +This is a final version. Only fixes bugs in the implementation + +Release date: 25/01/2016 +Build number: 11888 + + 1) Bugs + + - The bug of the previous release (3.1.3) was not fixed. + +******************************************** +************* TracAPI 3.1.2 **************** +******************************************** +This is a final version. Only fixes bugs in the implementation + +Release date: 21/01/2016 +Build number: 11864 + + 1) Bugs + + - The ISubscriber.stop() method never finishes due to a deadlock (it happens sometimes). + There is a deadlock between one of the internal threads responsible to update the progress + and the thread that calls the stop method. The release 3.1.1 fixed a part of the bug but + it continues happening due to a new deadlock (Reported by Axel Uhl, 20/01/2016) + ******************************************** ************* TracAPI 3.1.1 **************** ******************************************** diff --git a/java/com.tractrac.clientmodule/lib/TracAPI-src.jar b/java/com.tractrac.clientmodule/lib/TracAPI-src.jar index 5d91727ada07c64189b59c8cccf6c335e2d9e400..169fe55519188c741f3a42f1f08934ab1589214f 100755 GIT binary patch delta 2255 zcmY*aYfzMB6n4d6fn8)ZK$8VbOTnE%!2%_5OH#}WYgz#+h?rnXA!v{npmLfiG=#To zl0=+Fjl9h2kun+`3?qh*%Ywk_a&=Kegaw=$O>=6$^N7{2=RM~<=Q)@6{dV_vJM8av zP#cywjCp#LQmGu395W|hJ=Z~o*N!sWoh5^KUcp|GsL->0OcB92ponDDPSJ@)H5%GJ zy67o(cq$EyQlyT)RBjtB8wDXc5$c-7{wRY^OspGE_gyD*jJ(}G=7W%>>f9~NI-yz4 zSiejs^d3$WIL-=^J)QI(r;$4BbsyeguVC_>bVk8BkJ9BFNAaCWBRsV`o>bL)xC!?L z7cy&|9Uz|LBg);~ol^K;DJQZ`4MCyl)0T0nFfhb4doMX}k1de&=MRFv(quX&5Bn3u%;3%?B5 zwl*g^n6w)O?Jtc&bouiI11>~W#o?3a;MpK}CTmm=k;Kb7rK<7=z_ z^es*sTls<*%5$Tn&#cg2y0=aakak}oH%>q2;R(|p`Rg&tqx6wdW9iTr?r_TWhfa8i zyq*d4@PKLLy~25~MP_y=f0VZ%r!-;I6y@g7)O-4j=GTX@H!}kRRs&# zVfZ!{ZJj!bRngYte_`0vl6VN#76yydfqx%wz)2+nOZUnFCwlL62Zl8mB`#@wwKf%L%jV;O z$6q`LK~QmdTBs&YKct;d5!afM1OuT+Yn!SPgEZUVXZmug;9O2uK;rm>a& zID}PsqS~tJQ0_jjdOl-Abs(dI1b?^`&UUu+3gcyIA)~qmcb`;)-^%kf3GDZ-jc3fN zjbrSr-N+bO2YzhJByph*KkvhJt2q``53aF3hHaGzm~2|hc9jWn|AzH!f8GGC-Uh@Y z8}W<}G_K?LpN;5Y^_4YjmtBEh+XS7gCg@w55TDZweql5G_nN_vZCT3sB`vXxj^;NR z^cc(AEOW_%vQt`N=eDAqzE=M1MR;2> z%D17Mx*g-EwZq@uzJcQr9np-3JMa|`cc6_GofzX>C-}Zy;D6GED;exUodwrl<^0_1 ziy6(=@i#NgioWu!sQbGWeMEQj$0v;4+nGQ82K4f8Y-aoK8)=N&Ze}prZla&%J<$81 z2kVjgCW)Y1cxEZLl9+40^*W=jH<7WR7da1l-(`FAZPd7SdmGz^zD!1`Zzbd8J1LC$ zchJ*=JD544AG^5Rk6i=~K(Th8e@hWkFzdxrmD*A}rw4Xqr>|oky&GJ?}Z^InTMg@3*_R+hK3F zgW9mjVa(H`luG3&ZRG4i^&AHoUOU8accu*Dc?Ek#vO>@HVMP?#q|FYBjWV zbjeff@KhQYrDz>}soXMJHi|-ZBFr_1{jmm}m{>oa?z{SNjJ(}G=7W%>>fJ5OI;x3b zY*?ZbdJiWG8fOK`o=$p?6G$EQx)1NLR|rj>bW*`Nk22*PNAaCWBRsX+o>bL)xC!@0 z7cy&|9Uz|PBP!k9|^vwU+Z7piL7d8z}xtqsDL}aUqQs+bw$J(TS%O5V@qfN$18FlD`=ZN6e-mx|mzxB#cOoBd+Ce933~ z*ATAQaTt;0oCVz1@tj4B4|8G}6$w7Vx7$<9=y9R^+?SEnkarMUm!jop09EW#<7=z= z^es*sdug^9DsZEe&#cg2yt`fwkakZoH%>nn;0ei}DA6+c_kj^<|84ZtV$(fE-6LH;CQO5G=W_9OAW6nt*Vr@Y3!u{ z9Kx$TQEhom7Cf^C%vm}*+hcC`udfX20Kf8GeK-bTcu zoA8YHHLcgguS6qf)+YFtYX6Rd*5r44-{Nfh)@3nv*-@2Id%Uk0a9nEht zCYmv8l^J?du3(OjuAm?575L{}MV|+*vR;t|=_@R6v&;nx%KEp#&Tm6IeQo^Ni-`7A zly65lbqB`J=zzbYV;#q%I^!5iJMk3{ccP7@*D%KEYv51r0{@dPT*+V;>dd?TD(B~4 zU&v^_j=!0yR`gY1Mcv=6=p(M1KR#jX-pc%GH=tK|V2 z9;`>|nz{|E}vTd_rrwa#Br*d!u`*lO$mknX|3B%d{ E0QvPAYXATM diff --git a/java/com.tractrac.clientmodule/lib/TracAPI.jar b/java/com.tractrac.clientmodule/lib/TracAPI.jar index afddb50016bce896590797f0d176ac93a574ab30..b2201015269a3c57d6914406b10d285ae614e015 100644 GIT binary patch delta 52549 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