From 6273a3a9ddff16ceffcc3d46e95102570d0f5e2e Mon Sep 17 00:00:00 2001 From: Lukas Niemeier Date: Thu, 2 May 2013 10:37:44 +0800 Subject: [PATCH 1/2] # trying to readd persisted events to a race log (if already connected) --- .../sending/EventPersistenceManager.java | 31 +++++++++++++++++++ .../services/sending/EventSendingService.java | 11 ++++--- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventPersistenceManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventPersistenceManager.java index b039b732fc9..3ff3b5e351d 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventPersistenceManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventPersistenceManager.java @@ -8,13 +8,23 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.List; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; + import android.content.Context; import android.content.Intent; import android.os.Bundle; +import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.racecommittee.app.AppConstants; +import com.sap.sailing.racecommittee.app.data.DataManager; +import com.sap.sailing.racecommittee.app.data.DataStore; +import com.sap.sailing.racecommittee.app.domain.impl.DomainFactoryImpl; import com.sap.sailing.racecommittee.app.logging.ExLog; import com.sap.sailing.racecommittee.app.utils.FileHandlerUtils; +import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; +import com.sap.sailing.server.gateway.deserialization.racelog.impl.RaceLogEventDeserializer; public class EventPersistenceManager { @@ -106,6 +116,8 @@ public class EventPersistenceManager { String url = lineParts[2]; String raceId = lineParts[0]; String serializedEvent = lineParts[1]; + + addEventToLog(raceId, serializedEvent); Intent eventIntent = EventSendingService.createEventIntent(context, url, raceId, serializedEvent); if (eventIntent != null) { @@ -117,6 +129,25 @@ public class EventPersistenceManager { return delayedIntents; } + private void addEventToLog(String raceId, String serializedEvent) { + ExLog.i(TAG, String.format("Trying to readd event to race log of race %s.", raceId)); + DataStore store = DataManager.create(this.context).getDataStore(); + if (!store.hasRace(raceId)) { + ExLog.w(TAG, String.format("There is no race %s.", raceId)); + return; + } + try { + RaceLogEventDeserializer deserializer = RaceLogEventDeserializer.create(DomainFactoryImpl.INSTANCE); + RaceLogEvent event = deserializer.deserialize((JSONObject) new JSONParser().parse(serializedEvent)); + store.getRace(raceId).getRaceLog().add(event); + ExLog.i(TAG, String.format("Event readded.")); + } catch (JsonDeserializationException e) { + ExLog.w(TAG, String.format("Error readding event to race log: %s", e.toString())); + } catch (ParseException e) { + ExLog.w(TAG, String.format("Error readding event to race log: %s", e.toString())); + } + } + /** * @return * @throws FileNotFoundException diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java index 66787267f42..4899b17423f 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java @@ -42,7 +42,10 @@ public class EventSendingService extends Service implements EventSendingListener private EventPersistenceManager persistenceManager; private boolean isHandlerSet; - private EventSendingServiceLogger serviceLogger; + private EventSendingServiceLogger serviceLogger = new EventSendingServiceLogger() { + @Override public void onEventSentSuccessful() { } + @Override public void onEventSentFailed() { } + }; public interface EventSendingServiceLogger { public void onEventSentSuccessful(); @@ -219,9 +222,9 @@ public class EventSendingService extends Service implements EventSendingListener */ private boolean isConnected() { NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo(); - if (activeNetwork == null) + if (activeNetwork == null) { return false; - boolean isConnected = activeNetwork.isConnected(); - return isConnected; + } + return activeNetwork.isConnected(); } } From 8c8cb56435ed05284c383baaaa637e5cb4e7199c Mon Sep 17 00:00:00 2001 From: Lukas Niemeier Date: Fri, 3 May 2013 00:04:39 +0800 Subject: [PATCH 2/2] # filter in RegattaOverview now shows last event first # filter in RegattaOverview now shows all active races and up to 2 additional (e.g. aborted) # unexpected results when showing different course areas / fleets --- .../sailing/gwt/ui/client/StringMessages.java | 2 + .../gwt/ui/client/StringMessages.properties | 2 + .../ui/client/StringMessages_de.properties | 2 + .../regattaoverview/RegattaOverviewPanel.java | 14 ++ .../RegattaOverviewTableComposite.java | 202 ++++++++++++------ .../gwt/ui/server/SailingServiceImpl.java | 9 +- .../sailing/gwt/ui/shared/RaceInfoDTO.java | 1 + 7 files changed, 170 insertions(+), 62 deletions(-) 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 a44758c8228..51934ea01b7 100755 --- 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 @@ -554,4 +554,6 @@ public interface StringMessages extends Messages { String distanceToStarboardEndOfStartlineWhenPassingStart(); String distanceToStarboardEndOfStartlineWhenPassingStartTooltip(); String waypoints(); + String disableRaceFilter(); + String enableRaceFilter(); } 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 cb19da9a406..30bab75c9f0 100755 --- 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 @@ -557,3 +557,5 @@ noWindFixesAvailable=No Wind-Fixes available. distanceToStarboardEndOfStartlineWhenPassingStart=Dist. Stb-Side of Line when Starting distanceToStarboardEndOfStartlineWhenPassingStartTooltip=Distance to starboard side of start line or to the single start mark when the competitor passed the start waypoints=Waypoints +disableRaceFilter=Disable filter +enableRaceFilter=Enable filter \ 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 719e44135ab..a1e923960d3 100755 --- 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 @@ -553,3 +553,5 @@ noWindFixesAvailable=Kein Wind-Fixes vorhanden. distanceToStarboardEndOfStartlineWhenPassingStart=Dist. Stb.-Seite d. Linie beim Starten distanceToStarboardEndOfStartlineWhenPassingStartTooltip=Abstand von der Steuerbord-Seite der Startlinie bzw. Abstand zur einzelnen Starttonne als der Teilnehmer den Start passiert hat waypoints=Wegpunkte +disableRaceFilter=Deaktiviere Filter +enableRaceFilter=Aktiviere Filter \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/regattaoverview/RegattaOverviewPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/regattaoverview/RegattaOverviewPanel.java index 1e8980e7f1f..7ec77d52626 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/regattaoverview/RegattaOverviewPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/regattaoverview/RegattaOverviewPanel.java @@ -49,6 +49,7 @@ public class RegattaOverviewPanel extends SimplePanel implements RegattaOverview private final Label eventNameLabel; private final Label venueNameLabel; private final Label timeLabel; + private final Button filterButton; private final Button refreshNowButton; private final Button startStopUpdatingButton; @@ -103,6 +104,16 @@ public class RegattaOverviewPanel extends SimplePanel implements RegattaOverview grid.getColumnFormatter().getElement(1).getStyle().setPaddingTop(2.0, Unit.EM); grid.getColumnFormatter().getElement(1).getStyle().setPaddingLeft(20.0, Unit.PX); + this.filterButton = new Button(stringMessages.disableRaceFilter()); + filterButton.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + boolean isFilterActive = regattaOverviewTableComposite.switchFilter(); + filterButton.setText(isFilterActive ? + stringMessages.disableRaceFilter() : stringMessages.enableRaceFilter()); + } + }); this.refreshNowButton = new Button(stringMessages.refreshNow()); refreshNowButton.addClickHandler(new ClickHandler() { @@ -129,6 +140,8 @@ public class RegattaOverviewPanel extends SimplePanel implements RegattaOverview } }); + + this.refreshNowButton.getElement().getStyle().setMarginLeft(20.0, Unit.PX); this.startStopUpdatingButton.getElement().getStyle().setMarginLeft(20.0, Unit.PX); this.serverUpdateTimer = new Timer(PlayModes.Live, serverUpdateRate); @@ -192,6 +205,7 @@ public class RegattaOverviewPanel extends SimplePanel implements RegattaOverview refreshStartStopClockPanel.setStyleName(STYLE_REFRESH_STOP_TIME); refreshStartStopClockPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE); + refreshStartStopClockPanel.add(filterButton); refreshStartStopClockPanel.add(refreshNowButton); refreshStartStopClockPanel.add(startStopUpdatingButton); refreshStartStopClockPanel.add(timeLabel); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/regattaoverview/RegattaOverviewTableComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/regattaoverview/RegattaOverviewTableComposite.java index 46c76a463b3..700936c87ea 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/regattaoverview/RegattaOverviewTableComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/regattaoverview/RegattaOverviewTableComposite.java @@ -2,6 +2,7 @@ package com.sap.sailing.gwt.ui.regattaoverview; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.List; @@ -34,6 +35,9 @@ import com.sap.sailing.gwt.ui.shared.RegattaOverviewEntryDTO; public class RegattaOverviewTableComposite extends Composite { + private List allEntries; + private boolean isFilterActive; + private final SelectionModel raceSelectionModel; private final CellTable regattaOverviewTable; private ListDataProvider regattaOverviewDataProvider; @@ -51,13 +55,16 @@ public class RegattaOverviewTableComposite extends Composite { private static RegattaOverviewTableResources tableRes = GWT.create(RegattaOverviewTableResources.class); public RegattaOverviewTableComposite(final SailingServiceAsync sailingService, ErrorReporter errorReporter, - final StringMessages stringMessages, final String eventIdAsString, final RegattaOverviewRaceSelectionProvider raceSelectionProvider) { + final StringMessages stringMessages, final String eventIdAsString, + final RegattaOverviewRaceSelectionProvider raceSelectionProvider) { this.sailingService = sailingService; this.stringMessages = stringMessages; this.eventIdAsString = eventIdAsString; this.raceSelectionProvider = raceSelectionProvider; this.flagImageResolver = new FlagImageResolver(); + this.isFilterActive = true; + mainPanel = new SimplePanel(); panel = new VerticalPanel(); mainPanel.setWidget(panel); @@ -65,7 +72,7 @@ public class RegattaOverviewTableComposite extends Composite { regattaOverviewDataProvider = new ListDataProvider(); regattaOverviewTable = createRegattaTable(); - + raceSelectionModel = new SingleSelectionModel(); raceSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() { @@ -73,15 +80,15 @@ public class RegattaOverviewTableComposite extends Composite { public void onSelectionChange(SelectionChangeEvent event) { showSelectedRaces(); } - + }); - + regattaOverviewTable.setSelectionModel(raceSelectionModel); - + panel.add(regattaOverviewTable); initWidget(mainPanel); - + loadAndUpdateEventLog(); } @@ -101,44 +108,107 @@ public class RegattaOverviewTableComposite extends Composite { loadAndUpdateEventLog(); } - protected void loadAndUpdateEventLog() { - sailingService.getRegattaOverviewEntriesForEvent(eventIdAsString, new MarkedAsyncCallback>() { + public boolean switchFilter() { + this.isFilterActive = !isFilterActive; + updateTable(allEntries); + return isFilterActive; + } + private void updateTable(List newEntries) { + allEntries = newEntries; + regattaOverviewDataProvider.getList().clear(); + regattaOverviewDataProvider.getList().addAll(filterAndSort(allEntries)); + // now sort again according to selected criterion + ColumnSortEvent.fire(regattaOverviewTable, regattaOverviewTable.getColumnSortList()); + } + + private Collection filterAndSort(List raceList) { + List reversedUnfilterted = new ArrayList(raceList); + + Collections.sort(reversedUnfilterted, new Comparator() { @Override - protected void handleFailure(Throwable cause) { - - } - - @Override - protected void handleSuccess(List result) { - regattaOverviewDataProvider.getList().clear(); - regattaOverviewDataProvider.getList().addAll(filter(result)); - // now sort again according to selected criterion - ColumnSortEvent.fire(regattaOverviewTable, regattaOverviewTable.getColumnSortList()); - } - - private Collection filter(List unfilteredRaceList) { - List filterResult = new ArrayList(); - for (RegattaOverviewEntryDTO entry : unfilteredRaceList) { - if (entry.raceInfo.lastStatus != RaceLogRaceStatus.UNKNOWN - && entry.raceInfo.lastStatus != RaceLogRaceStatus.UNSCHEDULED - && entry.raceInfo.lastStatus != RaceLogRaceStatus.FINISHED) { - filterResult.add(entry); - } + public int compare(RegattaOverviewEntryDTO left, RegattaOverviewEntryDTO right) { + int result = left.courseAreaName.compareTo(right.courseAreaName); + if (result == 0) { + if (left.regattaName != null && right.regattaName != null) { + result = left.regattaName.compareTo(right.regattaName); + } + if (result == 0) { + result = left.raceInfo.fleet.compareTo(right.raceInfo.fleet); + if (result == 0) { + result = right.raceInfo.raceName.compareTo(left.raceInfo.raceName); } - return filterResult; + } + } + return result; } }); + + // And now we are going to filter + if (!isFilterActive) { + return reversedUnfilterted; + } + + List filtered = new ArrayList(); + int maxAddtionalRacesCount = 2; + for (RegattaOverviewEntryDTO entry : reversedUnfilterted) { + RaceLogRaceStatus status = entry.raceInfo.lastStatus; + if (status != null && isRaceActive(status)) { + filtered.add(entry); + continue; + } + + if (maxAddtionalRacesCount == 0) { + continue; + } + + if (entry.raceInfo.hasEvents) { + maxAddtionalRacesCount--; + filtered.add(entry); + } + } + + // Add the "next race" to the list of races + // TODO: Should be done for each course area, for each regatta, for each fleet... + if (filtered.size() > 0 && filtered.size() != reversedUnfilterted.size()) { + RegattaOverviewEntryDTO topMostEntry = filtered.get(0); + int topMostIndex = reversedUnfilterted.indexOf(topMostEntry); + if (topMostIndex >= 1) { + filtered.add(0, reversedUnfilterted.get(topMostIndex - 1)); + } + } + return filtered; + } + + private boolean isRaceActive(RaceLogRaceStatus status) { + return status.equals(RaceLogRaceStatus.SCHEDULED) || status.equals(RaceLogRaceStatus.STARTPHASE) + || status.equals(RaceLogRaceStatus.RUNNING) || status.equals(RaceLogRaceStatus.FINISHING); + } + + protected void loadAndUpdateEventLog() { + sailingService.getRegattaOverviewEntriesForEvent(eventIdAsString, + new MarkedAsyncCallback>() { + + @Override + protected void handleFailure(Throwable cause) { + + } + + @Override + protected void handleSuccess(List result) { + updateTable(result); + } + }); } private CellTable createRegattaTable() { CellTable table = new CellTable(/* pageSize */10000, tableRes); regattaOverviewDataProvider.addDataDisplay(table); table.setWidth("100%"); - + ListHandler regattaOverviewListHandler = new ListHandler( regattaOverviewDataProvider.getList()); - + TextColumn courseAreaColumn = new TextColumn() { @Override public String getValue(RegattaOverviewEntryDTO entryDTO) { @@ -152,9 +222,9 @@ public class RegattaOverviewTableComposite extends Composite { public int compare(RegattaOverviewEntryDTO left, RegattaOverviewEntryDTO right) { return left.courseAreaName.compareTo(right.courseAreaName); } - + }); - + TextColumn regattaNameColumn = new TextColumn() { @Override public String getValue(RegattaOverviewEntryDTO entryDTO) { @@ -168,9 +238,9 @@ public class RegattaOverviewTableComposite extends Composite { public int compare(RegattaOverviewEntryDTO left, RegattaOverviewEntryDTO right) { return left.regattaName.compareTo(right.regattaName); } - + }); - + TextColumn fleetNameColumn = new TextColumn() { @Override public String getValue(RegattaOverviewEntryDTO entryDTO) { @@ -184,7 +254,7 @@ public class RegattaOverviewTableComposite extends Composite { public int compare(RegattaOverviewEntryDTO left, RegattaOverviewEntryDTO right) { return left.raceInfo.fleet.compareTo(right.raceInfo.fleet); } - + }); TextColumn raceNameColumn = new TextColumn() { @@ -198,9 +268,9 @@ public class RegattaOverviewTableComposite extends Composite { @Override public int compare(RegattaOverviewEntryDTO left, RegattaOverviewEntryDTO right) { - return left.raceInfo.raceName.compareTo(right.raceInfo.raceName); + return right.raceInfo.raceName.compareTo(left.raceInfo.raceName); } - + }); TextColumn raceStartTimeColumn = new TextColumn() { @@ -233,9 +303,9 @@ public class RegattaOverviewTableComposite extends Composite { } return result; } - + }); - + TextColumn raceStatusColumn = new TextColumn() { @Override public String getValue(RegattaOverviewEntryDTO entryDTO) { @@ -249,54 +319,62 @@ public class RegattaOverviewTableComposite extends Composite { public int compare(RegattaOverviewEntryDTO left, RegattaOverviewEntryDTO right) { return left.raceInfo.lastStatus.compareTo(right.raceInfo.lastStatus); } - + }); - Column lastUpperFlagColumn = new Column(new ImageResourceCell()) { + Column lastUpperFlagColumn = new Column( + new ImageResourceCell()) { @Override public ImageResource getValue(RegattaOverviewEntryDTO entryDTO) { return flagImageResolver.resolveFlagToImage(entryDTO.raceInfo.lastUpperFlag); } }; - - Column lastLowerFlagColumn = new Column(new ImageResourceCell()) { + + Column lastLowerFlagColumn = new Column( + new ImageResourceCell()) { @Override public ImageResource getValue(RegattaOverviewEntryDTO entryDTO) { return flagImageResolver.resolveFlagToImage(entryDTO.raceInfo.lastLowerFlag); } }; - - Column lastFlagDirectionColumn = new Column(new ImageResourceCell()) { + + Column lastFlagDirectionColumn = new Column( + new ImageResourceCell()) { @Override public ImageResource getValue(RegattaOverviewEntryDTO entryDTO) { - if(entryDTO.raceInfo.lastUpperFlag != null) + if (entryDTO.raceInfo.lastUpperFlag != null) return flagImageResolver.resolveFlagDirectionToImage(entryDTO.raceInfo.displayed); else return null; } }; - + TextColumn raceAddditionalInformationColumn = new TextColumn() { @Override public String getValue(RegattaOverviewEntryDTO entryDTO) { StringBuffer additionalInformation = new StringBuffer(); - if(entryDTO.raceInfo.pathfinderId!=null){ - additionalInformation.append("Pathfinder: "+entryDTO.raceInfo.pathfinderId); + if (entryDTO.raceInfo.hasEvents && !isRaceActive(entryDTO.raceInfo.lastStatus)) { + additionalInformation.append("Race has been aborted before. "); } - if(entryDTO.raceInfo.pathfinderId!=null && entryDTO.raceInfo.gateLineOpeningTime!=null){ + if (entryDTO.raceInfo.pathfinderId != null) { + additionalInformation.append("Pathfinder: " + entryDTO.raceInfo.pathfinderId); + } + if (entryDTO.raceInfo.pathfinderId != null && entryDTO.raceInfo.gateLineOpeningTime != null) { additionalInformation.append(" / "); } - if(entryDTO.raceInfo.gateLineOpeningTime!=null){ - additionalInformation.append("GateLineOpeningTime: "+(entryDTO.raceInfo.gateLineOpeningTime/(60*1000))+" minutes"); + if (entryDTO.raceInfo.gateLineOpeningTime != null) { + additionalInformation.append("GateLineOpeningTime: " + + (entryDTO.raceInfo.gateLineOpeningTime / (60 * 1000)) + " minutes"); } - + return additionalInformation.toString(); } }; - table.addColumn(courseAreaColumn, stringMessages.courseArea()); - table.addColumn(regattaNameColumn, stringMessages.boatClass()); // For sailors the boat class also contains additional infos such as woman/man, e.g. Laser Radial Woman or Laser Radial Men + table.addColumn(regattaNameColumn, stringMessages.boatClass()); // For sailors the boat class also contains + // additional infos such as woman/man, e.g. + // Laser Radial Woman or Laser Radial Men table.addColumn(fleetNameColumn, stringMessages.fleet()); table.addColumn(raceNameColumn, stringMessages.race()); table.addColumn(raceStartTimeColumn, stringMessages.startTime()); @@ -309,21 +387,23 @@ public class RegattaOverviewTableComposite extends Composite { return table; } - + public List getAllRaces() { - return regattaOverviewDataProvider.getList(); + return allEntries; } private void showSelectedRaces() { List selectedRaces = getSelectedRaces(); RegattaOverviewTableComposite.this.raceSelectionProvider.setSelection(selectedRaces); } - + private String getStatusText(RaceInfoDTO raceInfo) { String statusText = ""; - if (raceInfo.lastStatus.equals(RaceLogRaceStatus.RUNNING) && raceInfo.lastUpperFlag.equals(Flags.XRAY) && raceInfo.displayed) { + if (raceInfo.lastStatus.equals(RaceLogRaceStatus.RUNNING) && raceInfo.lastUpperFlag.equals(Flags.XRAY) + && raceInfo.displayed) { statusText = "Race is running (had early starters)"; - } else if (raceInfo.lastStatus.equals(RaceLogRaceStatus.RUNNING) && raceInfo.lastUpperFlag.equals(Flags.XRAY) && !raceInfo.displayed) { + } else if (raceInfo.lastStatus.equals(RaceLogRaceStatus.RUNNING) && raceInfo.lastUpperFlag.equals(Flags.XRAY) + && !raceInfo.displayed) { statusText = "Race is running"; } else if (raceInfo.lastStatus.equals(RaceLogRaceStatus.RUNNING)) { statusText = "Race is running"; 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 737238ee96e..2bb9addaaa7 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 @@ -1145,8 +1145,15 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S RaceInfoDTO raceInfoDTO = new RaceInfoDTO(); RaceLog raceLog = raceColumn.getRaceLog(fleet); if (raceLog != null) { - PassAwareRaceLog passAwareRaceLog = PassAwareRaceLogImpl.copy(raceLog); + + try { + passAwareRaceLog.lockForRead(); + raceInfoDTO.hasEvents = !Util.isEmpty(passAwareRaceLog.getRawFixes()); + } finally { + passAwareRaceLog.unlockAfterRead(); + } + StartTimeFinder startTimeFinder = new StartTimeFinder(passAwareRaceLog); if(startTimeFinder.getStartTime()!=null){ raceInfoDTO.startTime = startTimeFinder.getStartTime().asDate(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceInfoDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceInfoDTO.java index b32ecb6e1d8..8f5d2b70cd4 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceInfoDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceInfoDTO.java @@ -10,6 +10,7 @@ import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; public class RaceInfoDTO implements IsSerializable { public String raceName; public String fleet; + public boolean hasEvents; public Date startTime; public RaceLogRaceStatus lastStatus; public Flags lastUpperFlag;