diff --git a/doc/SAPSailingAnalyticsArchitecture_Short.pptx b/doc/SAPSailingAnalyticsArchitecture_Short.pptx index d9f02347a86..ea6fd1d58c0 100755 Binary files a/doc/SAPSailingAnalyticsArchitecture_Short.pptx and b/doc/SAPSailingAnalyticsArchitecture_Short.pptx differ diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/TracTracRaceTrackerImpl.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/TracTracRaceTrackerImpl.java index 4a33d888938..df0e5304f36 100755 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/TracTracRaceTrackerImpl.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/TracTracRaceTrackerImpl.java @@ -581,7 +581,8 @@ public class TracTracRaceTrackerImpl extends AbstractRaceTrackerImpl implements } private void updateStatusOfTrackedRace(DynamicTrackedRace trackedRace) { - if (lastStatus != null) { + // can't update a race status once it has been set to FINISHED + if (lastStatus != null && trackedRace.getStatus() != null && trackedRace.getStatus().getStatus() != TrackedRaceStatusEnum.FINISHED) { trackedRace.setStatus(lastStatus); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java index 006198351e1..eb6dd5128f7 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java @@ -164,8 +164,8 @@ public class SwissTimingEventManagementPanel extends AbstractEventManagementPane TextColumn raceStateColumn = new TextColumn() { @Override public String getValue(SwissTimingRaceRecordDTO object) { - String result = object.hasCourse ? "C" : ""; - result += object.hasStartlist ? "S" : ""; + String result = object.hasCourse ? "C✓ " : ""; + result += object.hasStartlist ? "S✓" : ""; return result; } }; @@ -180,36 +180,49 @@ public class SwissTimingEventManagementPanel extends AbstractEventManagementPane HorizontalPanel racesSplitPanel = new HorizontalPanel(); mainPanel.add(racesSplitPanel); - CaptionPanel racesCaptionPanel = new CaptionPanel(stringConstants.trackableRaces()); - racesSplitPanel.add(racesCaptionPanel); - racesCaptionPanel.setWidth("50%"); + CaptionPanel trackableRacesCaptionPanel = new CaptionPanel(stringConstants.trackableRaces()); + racesSplitPanel.add(trackableRacesCaptionPanel); + trackableRacesCaptionPanel.setWidth("50%"); CaptionPanel trackedRacesCaptionPanel = new CaptionPanel(stringConstants.trackedRaces()); racesSplitPanel.add(trackedRacesCaptionPanel); trackedRacesCaptionPanel.setWidth("50%"); - VerticalPanel racesPanel = new VerticalPanel(); - racesCaptionPanel.setContentWidget(racesPanel); - racesCaptionPanel.setStyleName("bold"); + VerticalPanel trackableRacesPanel = new VerticalPanel(); + trackableRacesCaptionPanel.setContentWidget(trackableRacesPanel); + trackableRacesCaptionPanel.setStyleName("bold"); VerticalPanel trackedRacesPanel = new VerticalPanel(); trackedRacesPanel.setWidth("100%"); trackedRacesCaptionPanel.setContentWidget(trackedRacesPanel); trackedRacesCaptionPanel.setStyleName("bold"); - // text box for filtering the cell table - HorizontalPanel filterPanel = new HorizontalPanel(); - filterPanel.setSpacing(5); - racesPanel.add(filterPanel); - - // Regatta + // Regatta selection HorizontalPanel regattaPanel = new HorizontalPanel(); regattaPanel.setSpacing(5); Label regattaForTrackingLabel = new Label(stringMessages.regattaUsedForTheTrackedRace()); regattaForTrackingLabel.setWordWrap(false); regattaPanel.add(regattaForTrackingLabel); regattaPanel.add(getAvailableRegattasListBox()); - racesPanel.add(regattaPanel); + trackableRacesPanel.add(regattaPanel); + + Label lblTrackSettings = new Label(stringConstants.trackSettings()); + trackableRacesPanel.add(lblTrackSettings); + + final CheckBox trackWindCheckbox = new CheckBox(stringConstants.trackWind()); + trackWindCheckbox.setWordWrap(false); + trackWindCheckbox.setValue(true); + trackableRacesPanel.add(trackWindCheckbox); + + final CheckBox declinationCheckbox = new CheckBox(stringConstants.declinationCheckbox()); + declinationCheckbox.setWordWrap(false); + declinationCheckbox.setValue(true); + trackableRacesPanel.add(declinationCheckbox); + + // text box for filtering the cell table + HorizontalPanel filterPanel = new HorizontalPanel(); + filterPanel.setSpacing(5); + trackableRacesPanel.add(filterPanel); Label lblFilterEvents = new Label(stringConstants.filterRacesByName() + ":"); filterPanel.add(lblFilterEvents); @@ -222,15 +235,8 @@ public class SwissTimingEventManagementPanel extends AbstractEventManagementPane fillRaceListFromAvailableRacesApplyingFilter(SwissTimingEventManagementPanel.this.filterEventsTextbox.getText()); } }); - filterPanel.add(filterEventsTextbox); - HorizontalPanel racesHorizontalPanel = new HorizontalPanel(); - racesPanel.add(racesHorizontalPanel); - - VerticalPanel trackPanel = new VerticalPanel(); - trackPanel.setStyleName("paddedPanel"); - raceNameColumn.setSortable(true); raceStartTimeColumn.setSortable(true); @@ -244,30 +250,17 @@ public class SwissTimingEventManagementPanel extends AbstractEventManagementPane raceTable.setWidth("300px"); raceTable.setSelectionModel(new MultiSelectionModel() {}); - racesHorizontalPanel.add(raceTable); - racesHorizontalPanel.add(trackPanel); + trackableRacesPanel.add(raceTable); raceList = new ListDataProvider(); raceList.addDataDisplay(raceTable); Handler columnSortHandler = getRaceTableColumnSortHandler(raceList.getList(), raceNameColumn, raceStartTimeColumn); raceTable.addColumnSortHandler(columnSortHandler); - - Label lblTrackSettings = new Label(stringConstants.trackSettings()); - trackPanel.add(lblTrackSettings); - - final CheckBox trackWindCheckbox = new CheckBox(stringConstants.trackWind()); - trackWindCheckbox.setWordWrap(false); - trackWindCheckbox.setValue(true); - trackPanel.add(trackWindCheckbox); - - final CheckBox declinationCheckbox = new CheckBox(stringConstants.declinationCheckbox()); - declinationCheckbox.setWordWrap(false); - declinationCheckbox.setValue(true); - trackPanel.add(declinationCheckbox); + trackedRacesPanel.add(trackedRacesListComposite); HorizontalPanel racesButtonPanel = new HorizontalPanel(); - racesPanel.add(racesButtonPanel); + trackableRacesPanel.add(racesButtonPanel); Button btnTrack = new Button(stringConstants.startTracking()); racesButtonPanel.add(btnTrack); @@ -278,7 +271,6 @@ public class SwissTimingEventManagementPanel extends AbstractEventManagementPane trackSelectedRaces(trackWindCheckbox.getValue(), declinationCheckbox.getValue()); } }); - } private ListHandler getRaceTableColumnSortHandler(List raceRecords, 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 eb501438f8b..cca7fe5ce2a 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 @@ -1256,13 +1256,18 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S GPSFixMoving fix = fixIter.next(); while (fix != null && (fix.getTimePoint().compareTo(toTimePointExcluding) < 0 || (fix.getTimePoint().equals(toTimePointExcluding) && toTimePointExcluding.equals(fromTimePoint)))) { - Tack tack = trackedRace.getTack(competitor, fix.getTimePoint()); + Tack tack; + try { + tack = trackedRace.getTack(competitor, fix.getTimePoint()); + } catch (NoWindException nwe) { + tack = null; + } TrackedLegOfCompetitor trackedLegOfCompetitor = trackedRace.getTrackedLeg(competitor, fix.getTimePoint()); LegType legType = trackedLegOfCompetitor == null ? null : trackedRace.getTrackedLeg( trackedLegOfCompetitor.getLeg()).getLegType(fix.getTimePoint()); Wind wind = trackedRace.getWind(fix.getPosition(),toTimePointExcluding); - WindDTO windDTO = createWindDTOFromAlreadyAveraged(wind, toTimePointExcluding); + WindDTO windDTO = wind == null ? null : createWindDTOFromAlreadyAveraged(wind, toTimePointExcluding); GPSFixDTO fixDTO = createGPSFixDTO(fix, fix.getSpeed(), windDTO, tack, legType, /* extrapolate */ false); fixesForCompetitor.add(fixDTO); @@ -1272,13 +1277,18 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S // check if fix was at date and if extrapolation is requested if (!fix.getTimePoint().equals(toTimePointExcluding) && extrapolate) { Position position = track.getEstimatedPosition(toTimePointExcluding, extrapolate); - Tack tack2 = trackedRace.getTack(competitor, toTimePointExcluding); + Tack tack2; + try { + tack2 = trackedRace.getTack(competitor, toTimePointExcluding); + } catch (NoWindException nwe) { + tack2 = null; + } LegType legType2 = trackedLegOfCompetitor == null ? null : trackedRace .getTrackedLeg(trackedLegOfCompetitor.getLeg()).getLegType( fix.getTimePoint()); SpeedWithBearing speedWithBearing = track.getEstimatedSpeed(toTimePointExcluding); Wind wind2 = trackedRace.getWind(position, toTimePointExcluding); - WindDTO windDTO2 = createWindDTOFromAlreadyAveraged(wind2, toTimePointExcluding); + WindDTO windDTO2 = wind2 == null ? null : createWindDTOFromAlreadyAveraged(wind2, toTimePointExcluding); GPSFixDTO extrapolated = new GPSFixDTO( toPerCompetitorIdAsString.get(competitorDTO.getIdAsString()), position==null?null:new PositionDTO(position.getLatDeg(), position.getLngDeg()), diff --git a/java/com.sap.sailing.server.gateway/webservices/api/v1/leaderboardGetDoc.html b/java/com.sap.sailing.server.gateway/webservices/api/v1/leaderboardGetDoc.html index 2d07d614f05..aac2459e435 100644 --- a/java/com.sap.sailing.server.gateway/webservices/api/v1/leaderboardGetDoc.html +++ b/java/com.sap.sailing.server.gateway/webservices/api/v1/leaderboardGetDoc.html @@ -29,7 +29,11 @@ Optional parameters: - None + resultState [Live = Default, Preliminary, Final] + + +   + maxCompetitorsCount [1000 = Default] Request method: diff --git a/java/com.sap.sailing.server.gateway/webservices/api/v1/raceCompetitorPositionsGetDoc.html b/java/com.sap.sailing.server.gateway/webservices/api/v1/raceCompetitorPositionsGetDoc.html index fc50bc5474d..10d6ea90eb2 100644 --- a/java/com.sap.sailing.server.gateway/webservices/api/v1/raceCompetitorPositionsGetDoc.html +++ b/java/com.sap.sailing.server.gateway/webservices/api/v1/raceCompetitorPositionsGetDoc.html @@ -29,7 +29,12 @@ Optional parameters: - None + +
from
+
fromasmillis
+
to
+
toasmillis
+ Request method: diff --git a/java/com.sap.sailing.server.gateway/webservices/api/v1/raceMarkPositionsGetDoc.html b/java/com.sap.sailing.server.gateway/webservices/api/v1/raceMarkPositionsGetDoc.html index 234508699ec..b1adbbc6a87 100644 --- a/java/com.sap.sailing.server.gateway/webservices/api/v1/raceMarkPositionsGetDoc.html +++ b/java/com.sap.sailing.server.gateway/webservices/api/v1/raceMarkPositionsGetDoc.html @@ -29,7 +29,12 @@ Optional parameters: - None + +
from
+
fromasmillis
+
to
+
toasmillis
+ Request method: diff --git a/java/com.sap.sailing.server.gateway/webservices/api/v1/raceWindGetDoc.html b/java/com.sap.sailing.server.gateway/webservices/api/v1/raceWindGetDoc.html index 73816238002..19cdfdd995c 100644 --- a/java/com.sap.sailing.server.gateway/webservices/api/v1/raceWindGetDoc.html +++ b/java/com.sap.sailing.server.gateway/webservices/api/v1/raceWindGetDoc.html @@ -33,7 +33,7 @@ Optional parameters: -
windsource
+
windsource [COMBINED = Default, WEB, EXPEDITION, TRACK_BASED_ESTIMATION, COURSE_BASED, RACECOMMITTEE]
fromtime
fromtimeasmillis
totime
diff --git a/java/target/start b/java/target/start index 6c5ff424cae..ef8deac70b6 100755 --- a/java/target/start +++ b/java/target/start @@ -55,7 +55,7 @@ REPLICATION_PARAMETERS="-Dreplication.start=$REPLICATE_ON_START -Dreplicate.mast if [[ $PARAM == "" ]]; then nohup $JAVA_BINARY -D$SERVER_NAME $ADDITIONAL_JAVA_ARGS -Dcom.sap.sailing.server.name=$SERVER_NAME $APP_PARAMETERS $REPLICATION_PARAMETERS -Djava.io.tmpdir=`pwd`/tmp -Dfile.encoding=cp1252 -Djetty.home=$scriptdir/configuration/jetty -Djava.util.logging.config.file=$scriptdir/configuration/logging.properties -Djava.library.path=$LIB_DIR -Xmx$MEMORY -jar plugins/org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar -console $TELNET_PORT -configuration ./ -clean 2>/dev/null >/dev/null & echo "Starting server..." - sleep 2 + sleep 10 TELNET_ACTIVE=`netstat -tlnp 2>/dev/null | grep ":$TELNET_PORT"` if [[ $TELNET_PORT == "" ]] || [[ $TELNET_ACTIVE == "" ]]; then