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 3f920cc2d95..17b709e8f79 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 @@ -1615,8 +1615,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { loadRegattaLogEvents(result, query, identifier); } catch (Throwable t) { // something went wrong during DB access; report, then use empty new regatta log - logger.log(Level.SEVERE, "Error connecting to MongoDB, unable to load recorded regatta log data. Check MongoDB settings."); - logger.log(Level.SEVERE, "loadRegattaLog", t); + logger.log(Level.SEVERE, "Error connecting to MongoDB, unable to load recorded regatta log data for "+identifier+". Check MongoDB settings.", t); } return result; } @@ -1708,7 +1707,15 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { private RegattaLogRegisterCompetitorEvent loadRegattaLogRegisterCompetitorEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, DBObject dbObject) { Competitor comp = getCompetitorByID(dbObject); - return new RegattaLogRegisterCompetitorEventImpl(createdAt, logicalTimePoint, author, id, comp); + final RegattaLogRegisterCompetitorEvent result; + if (comp == null) { + result = null; + logger.log(Level.SEVERE, "Couldn't resolve competitor with ID "+dbObject.get(FieldNames.REGATTA_LOG_COMPETITOR_ID.name())+ + " from registration event with ID "+id+". Skipping this competitor registration."); + } else { + result = new RegattaLogRegisterCompetitorEventImpl(createdAt, logicalTimePoint, author, id, comp); + } + return result; } private RegattaLogCloseOpenEndedDeviceMappingEvent loadRegattaLogCloseOpenEndedDeviceMappingEvent(TimePoint createdAt, 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 b0e57554773..d975334a6fb 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,6 +24,7 @@ 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.analyzing.impl.TrackingTimesFinder; import com.sap.sailing.domain.abstractlog.race.impl.BaseRaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEndOfTrackingEventImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogStartOfTrackingEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; @@ -181,6 +182,14 @@ public class RaceLogRaceTracker implements RaceTracker, GPSFixReceivedListener { @Override public void stop(boolean preemptive) { + RaceLog raceLog = params.getRaceLog(); + final Pair trackingTimes = new TrackingTimesFinder(raceLog).analyze(); + if (trackingTimes == null || trackingTimes.getB() == null) { + // seems the first time tracking for this race is started; enter "now" as start of tracking + // into the race log + raceLog.add(new RaceLogEndOfTrackingEventImpl(MillisecondsTimePoint.now(), raceLogEventAuthor, /* passId */ 0)); + } + // mark passing calculator is automatically stopped, when the race status is set to {@link // TrackedRaceStatusEnum#FINISHED} trackedRace.setStatus(new TrackedRaceStatusImpl(TrackedRaceStatusEnum.FINISHED, 100)); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/FlexibleLeaderboardAsRegattaLikeIdentifier.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/FlexibleLeaderboardAsRegattaLikeIdentifier.java index 1deab01d8ca..80efa849a9d 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/FlexibleLeaderboardAsRegattaLikeIdentifier.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/FlexibleLeaderboardAsRegattaLikeIdentifier.java @@ -49,4 +49,9 @@ public class FlexibleLeaderboardAsRegattaLikeIdentifier implements RegattaLikeId public String getIdentifierType() { return FlexibleLeaderboard.class.getName(); } + + @Override + public String toString() { + return getClass().getName()+": leaderboardName="+getName(); + } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/RegattaAsRegattaLikeIdentifier.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/RegattaAsRegattaLikeIdentifier.java index cf14054c5b7..d1e9a8f03ff 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/RegattaAsRegattaLikeIdentifier.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/RegattaAsRegattaLikeIdentifier.java @@ -49,4 +49,9 @@ public class RegattaAsRegattaLikeIdentifier implements RegattaLikeIdentifier { public String getIdentifierType() { return Regatta.class.getName(); } + + @Override + public String toString() { + return getClass().getName()+": regattaName="+getName(); + } } 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 09ed454a331..336dadbd42e 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 @@ -57,14 +57,8 @@ public class RaceLogTrackingEventManagementRaceImagesBarCell extends ImagesBarCe if (startEndTrackingTime == null){ result.add(new ImageSpec(ACTION_START_TRACKING, stringMessages.startTracking(), makeImagePrototype(resources.startRaceLogTracking()))); } else { - if (startEndTrackingTime.getA() != null){ - if (startEndTrackingTime.getB() != null){ - result.add(new ImageSpec(ACTION_START_TRACKING, stringMessages.startTracking(), makeImagePrototype(resources.startRaceLogTracking()))); - } else { - result.add(new ImageSpec(ACTION_STOP_TRACKING, stringMessages.stopTracking(), makeImagePrototype(resources.stopRaceLogTracking()))); - } - } else { - result.add(new ImageSpec(ACTION_START_TRACKING, stringMessages.startTracking(), makeImagePrototype(resources.startRaceLogTracking()))); + if (startEndTrackingTime.getB() == null){ + result.add(new ImageSpec(ACTION_STOP_TRACKING, stringMessages.stopTracking(), makeImagePrototype(resources.stopRaceLogTracking()))); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SetTrackingTimesDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SetTrackingTimesDialog.java index ecaa5873dab..a56b4dfe2a5 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SetTrackingTimesDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SetTrackingTimesDialog.java @@ -17,7 +17,6 @@ import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.PushButton; import com.google.gwt.user.client.ui.TextBox; -import com.google.gwt.user.client.ui.ToggleButton; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.gwt.ui.client.DataEntryDialogWithBootstrap; @@ -50,7 +49,6 @@ public class SetTrackingTimesDialog extends DataEntryDialogWithBootstrap(){ - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError("Error while setting tracking times: " + caught.getMessage()); - } - - @Override - public void onSuccess(Void result) { - refreshTimes(); - getCancelButton().click(); - } - }); - } - }); - - currentPanel.add(startStopButton); - current.add(currentPanel); return current; } 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 8f95141dda1..a54f67df02d 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 @@ -1,6 +1,7 @@ package com.sap.sailing.gwt.ui.adminconsole; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -16,18 +17,21 @@ 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.Button; import com.google.gwt.user.client.ui.CaptionPanel; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.Panel; +import com.google.gwt.user.client.ui.ToggleButton; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.view.client.ListDataProvider; import com.google.gwt.view.client.SelectionChangeEvent; import com.google.gwt.view.client.SelectionChangeEvent.Handler; 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.dto.CompetitorDTO; import com.sap.sailing.domain.common.dto.FleetDTO; import com.sap.sailing.domain.common.dto.RaceColumnDTO; +import com.sap.sailing.domain.common.dto.RaceDTO; import com.sap.sailing.domain.common.racelog.tracking.RaceLogTrackingState; import com.sap.sailing.gwt.ui.client.LeaderboardsDisplayer; import com.sap.sailing.gwt.ui.client.LeaderboardsRefresher; @@ -45,8 +49,8 @@ import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.Util.Pair; import com.sap.sse.common.Util.Triple; -import com.sap.sse.common.impl.MillisecondsTimePoint; import com.sap.sse.gwt.client.ErrorReporter; +import com.sap.sse.gwt.client.async.MarkedAsyncCallback; import com.sap.sse.gwt.client.dialog.DataEntryDialog; import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback; @@ -54,7 +58,7 @@ import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback; * Allows the user to start and stop tracking of races using the RaceLog-tracking connector. */ public class SmartphoneTrackingEventManagementPanel extends AbstractLeaderboardConfigPanel implements LeaderboardsDisplayer { - private Button startTrackingButton; + private ToggleButton startStopTrackingButton; private TrackFileImportDeviceIdentifierTableWrapper deviceIdentifierTable; private CheckBox correctWindDirectionForDeclination; private CheckBox trackWind; @@ -77,6 +81,18 @@ public class SmartphoneTrackingEventManagementPanel extends AbstractLeaderboardC importPanel.add(importContent); importContent.add(importWidget); importContent.add(deviceIdentifierTable); + trackedRacesListComposite.addTrackedRaceChangeListener(new TrackedRaceChangedListener() { + + @Override + public void racesStoppedTracking(Iterable regattaAndRaceIdentifiers) { + loadAndRefreshLeaderboard(getSelectedLeaderboard().name, getSelectedRaceColumnWithFleet().getA().getName()); + } + + @Override + public void racesRemoved(Iterable regattaAndRaceIdentifiers) { + loadAndRefreshLeaderboard(getSelectedLeaderboard().name, getSelectedRaceColumnWithFleet().getA().getName()); + } + }); } private static interface ShowWithBoatClass { @@ -184,6 +200,20 @@ public class SmartphoneTrackingEventManagementPanel extends AbstractLeaderboardC return race.getA().getRaceLogTrackingInfo(race.getB()).raceLogTrackingState; } + private boolean trackerExists(RaceColumnDTOAndFleetDTOWithNameBasedEquality race) { + return race.getA().getRaceLogTrackingInfo(race.getB()).raceLogTrackerExists; + } + + private boolean isFinished(RaceColumnDTOAndFleetDTOWithNameBasedEquality race) { + RaceDTO raceDTO = race.getA().getRace(race.getB()); + + boolean raceFinished = false; + if (raceDTO != null){ + raceFinished = raceDTO.status.status.equals(TrackedRaceStatusEnum.FINISHED); + } + return raceFinished; + } + private boolean doesTrackerExist(RaceColumnDTOAndFleetDTOWithNameBasedEquality race) { return race.getA().getRaceLogTrackingInfo(race.getB()).raceLogTrackerExists; } @@ -309,15 +339,9 @@ public class SmartphoneTrackingEventManagementPanel extends AbstractLeaderboardC } else if (RaceLogTrackingEventManagementRaceImagesBarCell.ACTION_SET_TRACKING_TIMES.equals(value)) { showSetTrackingTimesDialog(getSelectedRaceColumnWithFleet().getA(), getSelectedRaceColumnWithFleet().getB());; } else if (RaceLogTrackingEventManagementRaceImagesBarCell.ACTION_START_TRACKING.equals(value)) { - TimePoint newStart = MillisecondsTimePoint.now(); - RaceLogSetTrackingTimesDTO setTrackingTimesDTO = generateRaceLogSetTrackingTimesDTOWith(newStart, null); - setTrackingTimes(setTrackingTimesDTO, raceColumnName); + startTracking(Collections.singleton(raceColumnDTOAndFleetDTO), trackWind.getValue(), correctWindDirectionForDeclination.getValue()); } else if (RaceLogTrackingEventManagementRaceImagesBarCell.ACTION_STOP_TRACKING.equals(value)) { - Pair startEndTrackingTime = getTrackingTimesFor(raceColumnDTOAndFleetDTO); - TimePoint currentStart = startEndTrackingTime.getA(); - TimePoint newEnd = MillisecondsTimePoint.now(); - RaceLogSetTrackingTimesDTO setTrackingTimesDTO = generateRaceLogSetTrackingTimesDTOWith(currentStart, newEnd); - setTrackingTimes(setTrackingTimesDTO, raceColumnName); + stopTracking(Collections.singleton(raceColumnDTOAndFleetDTO)); } } }); @@ -327,46 +351,6 @@ public class SmartphoneTrackingEventManagementPanel extends AbstractLeaderboardC racesTable.addColumn(raceActionColumn, stringMessages.actions()); racesTable.setWidth("600px"); } - - private void setTrackingTimes(RaceLogSetTrackingTimesDTO trackingTimesDTO, final String raceColumnName){ - sailingService.setTrackingTimes(trackingTimesDTO, new AsyncCallback(){ - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError("Error while setting tracking times: " + caught.getMessage()); - } - - @Override - public void onSuccess(Void result) { - loadAndRefreshLeaderboard(getSelectedLeaderboard().name, raceColumnName); - } - }); - } - - private RaceLogSetTrackingTimesDTO generateRaceLogSetTrackingTimesDTOWith(TimePoint startTime, TimePoint endTime) { - Pair startEndTrackingTime = getTrackingTimesFor(getSelectedRaceColumnWithFleet()); - TimePoint currentStart; - TimePoint currentEnd; - if (startEndTrackingTime == null){ - currentStart = null; - currentEnd = null; - } else { - currentStart = startEndTrackingTime.getA(); - currentEnd = startEndTrackingTime.getB(); - } - - RaceLogSetTrackingTimesDTO dto = new RaceLogSetTrackingTimesDTO(); - dto.leaderboardName = getSelectedLeaderboardName(); - dto.raceColumnName = getSelectedRaceColumnWithFleet().getA().getName(); - dto.fleetName = getSelectedRaceColumnWithFleet().getB().getName(); - dto.authorName = "Shore"; - dto.authorPriority = 4; - dto.logicalTimePoint = MillisecondsTimePoint.now(); - dto.newStartOfTracking = startTime; - dto.newEndOfTracking = endTime; - dto.currentStartOfTracking = currentStart; - dto.currentEndOfTracking = currentEnd; - return dto; - } @Override protected void addLeaderboardControls(Panel controlsPanel) {} @@ -375,16 +359,21 @@ public class SmartphoneTrackingEventManagementPanel extends AbstractLeaderboardC protected void addSelectedLeaderboardRacesControls(Panel racesPanel) { trackWind = new CheckBox(stringMessages.trackWind()); correctWindDirectionForDeclination = new CheckBox(stringMessages.declinationCheckbox()); - startTrackingButton = new Button(stringMessages.startTracking()); - startTrackingButton.ensureDebugId("StartTrackingButton"); - startTrackingButton.setEnabled(false); + startStopTrackingButton = new ToggleButton(stringMessages.startTracking(), stringMessages.stopTracking()); + startStopTrackingButton.ensureDebugId("StartTrackingButton"); + startStopTrackingButton.setEnabled(false); racesPanel.add(trackWind); racesPanel.add(correctWindDirectionForDeclination); - racesPanel.add(startTrackingButton); - startTrackingButton.addClickHandler(new ClickHandler() { + racesPanel.add(startStopTrackingButton); + startStopTrackingButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { - startTracking(raceColumnTableSelectionModel.getSelectedSet(), trackWind.getValue(), correctWindDirectionForDeclination.getValue()); + if (startStopTrackingButton.isDown()){ + startTracking(raceColumnTableSelectionModel.getSelectedSet(), trackWind.getValue(), correctWindDirectionForDeclination.getValue()); + } else { + stopTracking(raceColumnTableSelectionModel.getSelectedSet()); + } + refreshTrackingActionButtons(); } }); @@ -396,14 +385,72 @@ public class SmartphoneTrackingEventManagementPanel extends AbstractLeaderboardC }); } + private void stopTracking(final Set selectedSet) { + final List racesToStopTracking = new ArrayList(); + for (RaceColumnDTOAndFleetDTOWithNameBasedEquality raceColumnDTOAndFleetDTOWithNameBasedEquality : selectedSet) { + RaceDTO race = raceColumnDTOAndFleetDTOWithNameBasedEquality.getA().getRace(raceColumnDTOAndFleetDTOWithNameBasedEquality.getB()); + if (race != null && race.isTracked){ + racesToStopTracking.add(race.getRaceIdentifier()); + } + } + + sailingService.stopTrackingRaces(racesToStopTracking, new MarkedAsyncCallback( + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError("Exception trying to stop tracking races " + racesToStopTracking + ": " + caught.getMessage()); + } + + @Override + public void onSuccess(Void result) { + trackedRacesListComposite.regattaRefresher.fillRegattas(); + for (TrackedRaceChangedListener listener : trackedRacesListComposite.raceIsTrackedRaceChangeListener) { + listener.racesStoppedTracking(racesToStopTracking); + } + + for (RaceColumnDTOAndFleetDTOWithNameBasedEquality raceColumndDTOAndFleet : selectedSet) { + loadAndRefreshLeaderboard(getSelectedLeaderboard().name, raceColumndDTOAndFleet.getA().getName()); + } + } + })); + } + private void enableStartTrackingButtonIfAppropriateRacesSelected() { - boolean enable = raceColumnTableSelectionModel.getSelectedSet().size() > 0; + boolean onlyUntrackedRacesPresent = raceColumnTableSelectionModel.getSelectedSet().size() > 0; + boolean onlyTrackedRacesPresent = raceColumnTableSelectionModel.getSelectedSet().size() > 0; + boolean onlyRacesWithNonExistentTracker = raceColumnTableSelectionModel.getSelectedSet().size() > 0; + for (RaceColumnDTOAndFleetDTOWithNameBasedEquality race : raceColumnTableSelectionModel.getSelectedSet()) { - if (! getTrackingState(race).isForTracking() || doesTrackerExist(race)) { - enable = false; + if (getTrackingState(race).isForTracking() && isFinished(race)){ + onlyUntrackedRacesPresent = false; + onlyTrackedRacesPresent = false; + } + + if (! getTrackingState(race).isForTracking() || doesTrackerExist(race) || isFinished(race)) { + onlyUntrackedRacesPresent = false; + } else { + onlyTrackedRacesPresent = false; + } + + if (trackerExists(race)){ + onlyRacesWithNonExistentTracker = false; } } - startTrackingButton.setEnabled(enable); + + if ((!onlyTrackedRacesPresent && !onlyUntrackedRacesPresent)){ + startStopTrackingButton.setEnabled(false); + } + + if (onlyTrackedRacesPresent){ + startStopTrackingButton.setDown(true); + startStopTrackingButton.setEnabled(true); + } + + if (onlyUntrackedRacesPresent || onlyRacesWithNonExistentTracker){ + startStopTrackingButton.setDown(false); + startStopTrackingButton.setEnabled(true); + } + } @Override @@ -552,7 +599,7 @@ public class SmartphoneTrackingEventManagementPanel extends AbstractLeaderboardC new AsyncCallback() { @Override public void onSuccess(Void result) { - loadAndRefreshLeaderboard(leaderboard.name, raceColumn.getName()); + loadAndRefreshLeaderboard(leaderboard.name, getSelectedRaceColumnWithFleet().getA().getName()); trackedRacesListComposite.regattaRefresher.fillRegattas(); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java index 54d801f5eeb..d4a55f20d63 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java @@ -28,7 +28,7 @@ import com.sap.sse.gwt.client.shared.components.SettingsDialog; * the {@link AdminConsoleEntryPoint}. */ public class TrackedRacesListComposite extends AbstractTrackedRacesListComposite { - private final Set raceIsTrackedRaceChangeListener; + final Set raceIsTrackedRaceChangeListener; private Button btnUntrack; private Button btnRemoveRace; private Button btnSetDelayToLive; @@ -56,7 +56,7 @@ public class TrackedRacesListComposite extends AbstractTrackedRacesListComposite this.raceIsTrackedRaceChangeListener.add(listener); } - private void stopTrackingRaces(final Iterable races) { + void stopTrackingRaces(final Iterable races) { final List racesToStopTracking = new ArrayList(); for (RaceDTO race : races) { if (race.isTracked) { 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 4315efcfc0a..aa8b71cf663 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 @@ -277,7 +277,7 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS Map> getManeuvers(RegattaAndRaceIdentifier raceIdentifier, Map from, Map to) throws NoWindException; - List getLeaderboardsByRaceAndRegatta(RaceDTO race, RegattaIdentifier regattaIdentifier); + List getLeaderboardsByRaceAndRegatta(String raceName, RegattaIdentifier regattaIdentifier); List getLeaderboardGroups(boolean withGeoLocationData); 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 0babca0bcc1..55cd48667db 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 @@ -228,7 +228,7 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan void getLeaderboards(AsyncCallback> callback); - void getLeaderboardsByRaceAndRegatta(RaceDTO race, RegattaIdentifier regattaIdentifier, + void getLeaderboardsByRaceAndRegatta(String raceName, RegattaIdentifier regattaIdentifier, AsyncCallback> callback); void updateLeaderboard(String leaderboardName, String newLeaderboardName, String newLeaderboardDisplayName, 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 b989b94e92c..6f3ea2ba060 100644 --- 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 @@ -1112,10 +1112,10 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S return null; } } - + @Override public void stopTrackingRaces(Iterable regattaAndRaceIdentifiers) throws Exception { - for (RegattaAndRaceIdentifier regattaAndRaceIdentifier : regattaAndRaceIdentifiers) { + for (RegattaAndRaceIdentifier regattaAndRaceIdentifier : regattaAndRaceIdentifiers) { getService().apply(new StopTrackingRace(regattaAndRaceIdentifier)); } } @@ -2350,7 +2350,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S List results = new ArrayList(); if (regatta != null && regatta.races != null) { for (RaceDTO race : regatta.races) { - List leaderboard = getLeaderboardsByRaceAndRegatta(race, regatta.getRegattaIdentifier()); + List leaderboard = getLeaderboardsByRaceAndRegatta(race.getName(), regatta.getRegattaIdentifier()); if (leaderboard != null && !leaderboard.isEmpty()) { results.addAll(leaderboard); } @@ -2364,7 +2364,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S } @Override - public List getLeaderboardsByRaceAndRegatta(RaceDTO race, RegattaIdentifier regattaIdentifier) { + public List getLeaderboardsByRaceAndRegatta(String raceName, RegattaIdentifier regattaIdentifier) { List results = new ArrayList(); Map leaderboards = getService().getLeaderboards(); for (Leaderboard leaderboard : leaderboards.values()) { @@ -2375,7 +2375,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S TrackedRace trackedRace = raceInLeaderboard.getTrackedRace(fleet); if (trackedRace != null) { RaceDefinition trackedRaceDef = trackedRace.getRace(); - if (trackedRaceDef.getName().equals(race.getName())) { + if (trackedRaceDef.getName().equals(raceName)) { results.add(createStrippedLeaderboardDTO(leaderboard, false, false)); break; } diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/FlatGPSFixJsonDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/impl/FlatGPSFixJsonDeserializer.java similarity index 100% rename from java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/FlatGPSFixJsonDeserializer.java rename to java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/impl/FlatGPSFixJsonDeserializer.java diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/FlatGPSFixJsonSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/impl/FlatGPSFixJsonSerializer.java similarity index 100% rename from java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/FlatGPSFixJsonSerializer.java rename to java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/impl/FlatGPSFixJsonSerializer.java diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/MarkJsonSerializerWithPosition.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/impl/MarkJsonSerializerWithPosition.java similarity index 100% rename from java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/MarkJsonSerializerWithPosition.java rename to java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/impl/MarkJsonSerializerWithPosition.java diff --git a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/util/CheckinManager.java b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/util/CheckinManager.java index 09cafc2e67e..d06eeed6ee0 100644 --- a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/util/CheckinManager.java +++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/util/CheckinManager.java @@ -35,6 +35,7 @@ import com.sap.sailing.android.shared.util.UniqueDeviceUuid; import com.sap.sailing.domain.common.racelog.tracking.DeviceMappingConstants; import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.racelogtracking.impl.SmartphoneUUIDIdentifierImpl; +import com.sap.sailing.server.gateway.serialization.impl.MarkJsonSerializerWithPosition; public class CheckinManager { @@ -167,7 +168,7 @@ public class CheckinManager { mark.setId(jsonMark.getString("id")); if (jsonMark.has("position")) { if (!jsonMark.get("position").equals(null)) { - JSONObject positionJson = jsonMark.getJSONObject("position"); + JSONObject positionJson = jsonMark.getJSONObject(MarkJsonSerializerWithPosition.FIELD_POSITION); MarkPingInfo ping = new MarkPingInfo(); ping.setLatitude(positionJson.getString("latitude")); ping.setLongitude(positionJson.getString("longitude"));