Merge branch 'master' into competitor_filtering

Conflicts:
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java
This commit is contained in:
Axel Uhl committed 2013-05-16 17:19:07 +02:00
commit f4196a22cb
41 files changed
+603 -424

No files matched your search

@@ -4,7 +4,7 @@
<stringAttribute key="com.google.gdt.eclipse.suiteMainTypeProcessor.PREVIOUSLY_SET_MAIN_TYPE_NAME" value="com.google.gwt.dev.GWTShell"/>
<booleanAttribute key="com.google.gdt.eclipse.suiteWarArgumentProcessor.IS_WAR_FROM_PROJECT_PROPERTIES" value="true"/>
<listAttribute key="com.google.gwt.eclipse.core.ENTRY_POINT_MODULES">
<listEntry value="com.sap.sailing.gwt.ui.PolarSheets"/>
<listEntry value="com.sap.sailing.gwt.ui.RegattaOverview"/>
</listAttribute>
<stringAttribute key="com.google.gwt.eclipse.core.URL" value="/gwt/AdminConsole.html"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
@@ -48,7 +48,7 @@
<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/sapjvm_7"/>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.DevMode"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-war &quot;${project_loc:com.sap.sailing.gwt.ui}&quot; -noserver -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -logLevel INFO -codeServerPort 9997 -startupUrl /gwt/AdminConsole.html com.sap.sailing.gwt.ui.AdminConsole -startupUrl /gwt/LeaderboardEditing.html com.sap.sailing.gwt.ui.LeaderboardEditing -startupUrl /gwt/UserManagement.html com.sap.sailing.gwt.ui.UserManagement -startupUrl /gwt/Leaderboard.html com.sap.sailing.gwt.ui.Leaderboard -startupUrl /gwt/Spectator.html com.sap.sailing.gwt.ui.Spectator -startupUrl /gwt/RaceBoard.html com.sap.sailing.gwt.ui.RaceBoard -startupUrl /gwt/PolarSheets.html com.sap.sailing.gwt.ui.PolarSheets"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-war &quot;${project_loc:com.sap.sailing.gwt.ui}&quot; -noserver -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -logLevel INFO -codeServerPort 9997 -startupUrl /gwt/AdminConsole.html com.sap.sailing.gwt.ui.AdminConsole -startupUrl /gwt/LeaderboardEditing.html com.sap.sailing.gwt.ui.LeaderboardEditing -startupUrl /gwt/UserManagement.html com.sap.sailing.gwt.ui.UserManagement -startupUrl /gwt/Leaderboard.html com.sap.sailing.gwt.ui.Leaderboard -startupUrl /gwt/Spectator.html com.sap.sailing.gwt.ui.Spectator -startupUrl /gwt/RaceBoard.html com.sap.sailing.gwt.ui.RaceBoard -startupUrl /gwt/PolarSheets.html com.sap.sailing.gwt.ui.PolarSheets -startupUrl /gwt/RegattaOverview.html com.sap.sailing.gwt.ui.RegattaOverview"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sailing.gwt.ui"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx1024m -Xdebug -Xrunjdwp:transport=dt_socket,address=7999,server=y"/>
</launchConfiguration>
@@ -4,7 +4,7 @@
<stringAttribute key="com.google.gdt.eclipse.suiteMainTypeProcessor.PREVIOUSLY_SET_MAIN_TYPE_NAME" value="com.google.gwt.dev.GWTShell"/>
<booleanAttribute key="com.google.gdt.eclipse.suiteWarArgumentProcessor.IS_WAR_FROM_PROJECT_PROPERTIES" value="true"/>
<listAttribute key="com.google.gwt.eclipse.core.ENTRY_POINT_MODULES">
<listEntry value="com.sap.sailing.gwt.ui.PolarSheets"/>
<listEntry value="com.sap.sailing.gwt.ui.RegattaOverview"/>
</listAttribute>
<stringAttribute key="com.google.gwt.eclipse.core.URL" value="/gwt/AdminConsole.html"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
@@ -47,7 +47,7 @@
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="com.google.gwt.eclipse.core.moduleClasspathProvider"/>
<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.DevMode"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-war &quot;${project_loc:com.sap.sailing.gwt.ui}&quot; -noserver -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -logLevel INFO -codeServerPort 9997 -startupUrl /gwt/AdminConsole.html com.sap.sailing.gwt.ui.AdminConsole -startupUrl /gwt/LeaderboardEditing.html com.sap.sailing.gwt.ui.LeaderboardEditing -startupUrl /gwt/UserManagement.html com.sap.sailing.gwt.ui.UserManagement -startupUrl /gwt/Leaderboard.html com.sap.sailing.gwt.ui.Leaderboard -startupUrl /gwt/Spectator.html com.sap.sailing.gwt.ui.Spectator -startupUrl /gwt/RaceBoard.html com.sap.sailing.gwt.ui.RaceBoard -startupUrl /gwt/TvView.html com.sap.sailing.gwt.ui.TvView -startupUrl /gwt/PolarSheets.html com.sap.sailing.gwt.ui.PolarSheets -startupUrl /gwt/RegattaOverview.html com.sap.sailing.gwt.ui.PolarSheets"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-war &quot;${project_loc:com.sap.sailing.gwt.ui}&quot; -noserver -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -logLevel INFO -codeServerPort 9997 -startupUrl /gwt/AdminConsole.html com.sap.sailing.gwt.ui.AdminConsole -startupUrl /gwt/LeaderboardEditing.html com.sap.sailing.gwt.ui.LeaderboardEditing -startupUrl /gwt/UserManagement.html com.sap.sailing.gwt.ui.UserManagement -startupUrl /gwt/Leaderboard.html com.sap.sailing.gwt.ui.Leaderboard -startupUrl /gwt/Spectator.html com.sap.sailing.gwt.ui.Spectator -startupUrl /gwt/RaceBoard.html com.sap.sailing.gwt.ui.RaceBoard -startupUrl /gwt/TvView.html com.sap.sailing.gwt.ui.TvView -startupUrl /gwt/PolarSheets.html com.sap.sailing.gwt.ui.PolarSheets -startupUrl /gwt/RegattaOverview.html com.sap.sailing.gwt.ui.RegattaOverview"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sailing.gwt.ui"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx2048m -XX:MaxPermSize=512m"/>
</launchConfiguration>
@@ -1,28 +0,0 @@
package com.sap.sailing.gwt.ui.actions;
import java.util.Date;
import java.util.List;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.shared.QuickRankDTO;
public class GetQuickRankAction extends DefaultAsyncAction<List<QuickRankDTO>> {
private final SailingServiceAsync sailingService;
private final RegattaAndRaceIdentifier raceIdentifier;
private final Date date;
public GetQuickRankAction(SailingServiceAsync sailingService, RegattaAndRaceIdentifier raceIdentifier, Date date,
AsyncCallback<List<QuickRankDTO>> callback) {
super(callback);
this.sailingService = sailingService;
this.raceIdentifier = raceIdentifier;
this.date = date;
}
@Override
public void execute(AsyncActionsExecutor asyncActionsExecutor) {
sailingService.getQuickRanks(raceIdentifier, date, (AsyncCallback<List<QuickRankDTO>>) getWrapperCallback(asyncActionsExecutor));
}
}
@@ -1,26 +1,30 @@
package com.sap.sailing.gwt.ui.actions;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.shared.CompactRaceMapDataDTO;
import com.sap.sailing.gwt.ui.shared.CompetitorDTO;
import com.sap.sailing.gwt.ui.shared.RaceMapDataDTO;
public class GetRaceMapDataAction extends DefaultAsyncAction<RaceMapDataDTO> {
private final SailingServiceAsync sailingService;
private final Iterable<CompetitorDTO> allCompetitors;
private final RegattaAndRaceIdentifier raceIdentifier;
private final Map<CompetitorDTO, Date> from;
private final Map<CompetitorDTO, Date> to;
private final boolean extrapolate;
private final Date date;
public GetRaceMapDataAction(SailingServiceAsync sailingService, RegattaAndRaceIdentifier raceIdentifier, Date date,
Map<CompetitorDTO, Date> from, Map<CompetitorDTO, Date> to, boolean extrapolate,
AsyncCallback<RaceMapDataDTO> callback) {
public GetRaceMapDataAction(SailingServiceAsync sailingService, Iterable<CompetitorDTO> allCompetitors, RegattaAndRaceIdentifier raceIdentifier,
Date date, Map<CompetitorDTO, Date> from, Map<CompetitorDTO, Date> to,
boolean extrapolate, AsyncCallback<RaceMapDataDTO> callback) {
super(callback);
this.allCompetitors = allCompetitors;
this.sailingService = sailingService;
this.raceIdentifier = raceIdentifier;
this.date = date;
@@ -30,7 +34,28 @@ public class GetRaceMapDataAction extends DefaultAsyncAction<RaceMapDataDTO> {
}
@Override
public void execute(AsyncActionsExecutor asyncActionsExecutor) {
sailingService.getRaceMapData(raceIdentifier, date, from, to, extrapolate, (AsyncCallback<RaceMapDataDTO>) getWrapperCallback(asyncActionsExecutor));
public void execute(final AsyncActionsExecutor asyncActionsExecutor) {
final AsyncCallback<RaceMapDataDTO> wrapperCallback = (AsyncCallback<RaceMapDataDTO>) getWrapperCallback(asyncActionsExecutor);
AsyncCallback<CompactRaceMapDataDTO> uncompactingCallback = new AsyncCallback<CompactRaceMapDataDTO>() {
@Override
public void onFailure(Throwable caught) {
wrapperCallback.onFailure(caught);
}
@Override
public void onSuccess(CompactRaceMapDataDTO result) {
wrapperCallback.onSuccess(result.getRaceMapDataDTO(allCompetitors));
}
};
Map<String, Date> fromByCompetitorIdAsString = new HashMap<String, Date>();
for (Map.Entry<CompetitorDTO, Date> fromEntry : from.entrySet()) {
fromByCompetitorIdAsString.put(fromEntry.getKey().idAsString, fromEntry.getValue());
}
Map<String, Date> toByCompetitorIdAsString = new HashMap<String, Date>();
for (Map.Entry<CompetitorDTO, Date> toEntry : to.entrySet()) {
toByCompetitorIdAsString.put(toEntry.getKey().idAsString, toEntry.getValue());
}
sailingService.getRaceMapData(raceIdentifier, date, fromByCompetitorIdAsString, toByCompetitorIdAsString,
extrapolate, uncompactingCallback);
}
}
@@ -1,127 +0,0 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.ArrayList;
import java.util.List;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionChangeListener;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider;
import com.sap.sailing.gwt.ui.shared.CompetitorDTO;
import com.sap.sailing.gwt.ui.shared.QuickRankDTO;
/**
* Shows a lean view of a race's competitors' ranks in a list. The list shows a subset of the race's competitors because
* not at all times may the ranks for all competitors be known. The list selection is tied to a
* {@link CompetitorSelectionProvider}. Regarding selection propagation from this view to the selection provider
* there is a minor glitch: since this view may show only a subset of all available competitors, this view's selection
* may also be just a subset of the current selection. If the selection is changed through this view, other previously
* selected competitors that are not shown in this view will be deselected.
*
* @author Frank Mittag (C5163874), Axel Uhl (d043530)
*
*/
public class QuickRanksListBoxComposite extends Composite implements CompetitorSelectionChangeListener {
private final CompetitorSelectionProvider competitorSelectionProvider;
private final List<QuickRankDTO> quickRankList;
private final List<CompetitorDTO> competitorList;
private final ListBox quickRankListBox;
public QuickRanksListBoxComposite(CompetitorSelectionProvider competitorSelectionProvider) {
this.competitorSelectionProvider = competitorSelectionProvider;
competitorSelectionProvider.addCompetitorSelectionChangeListener(this);
quickRankListBox = new ListBox(competitorSelectionProvider.hasMultiSelection());
quickRankListBox.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
onLocalSelectionChanged();
}
});
quickRankListBox.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
onLocalSelectionChanged();
}
});
quickRankList = new ArrayList<QuickRankDTO>();
competitorList = new ArrayList<CompetitorDTO>();
VerticalPanel vp = new VerticalPanel();
vp.add(quickRankListBox);
// All composites must call initWidget() in their constructors.
initWidget(vp);
}
/**
* propagates changes in the local selection to the selection provider
*/
private void onLocalSelectionChanged() {
competitorSelectionProvider.setSelection(getSelectedCompetitors(), this);
}
/**
* @param quickRanks list of quick ranks, ordered by ascending rank
*/
public void fillQuickRanks(List<QuickRankDTO> quickRanks) {
quickRankList.clear();
competitorList.clear();
quickRankListBox.clear();
for (QuickRankDTO quickRank: quickRanks) {
quickRankList.add(quickRank);
competitorList.add(quickRank.competitor);
}
int index = 0;
for (QuickRankDTO quickRank : quickRankList) {
quickRankListBox.addItem(toString(quickRank));
if (competitorSelectionProvider.isSelected(quickRank.competitor)) {
quickRankListBox.setItemSelected(index, true);
}
index++;
}
}
private Iterable<CompetitorDTO> getSelectedCompetitors() {
List<CompetitorDTO> result = new ArrayList<CompetitorDTO>();
for (int i=0; i<quickRankListBox.getItemCount(); i++) {
if (quickRankListBox.isItemSelected(i)) {
result.add(quickRankList.get(i).competitor);
}
}
return result;
}
protected String toString(QuickRankDTO quickRank) {
return quickRank.rank + ". " + quickRank.competitor.name + " ("
+ quickRank.competitor.threeLetterIocCountryCode + ") in leg #" + (quickRank.legNumber + 1);
}
public ListBox getListBox() {
return quickRankListBox;
}
@Override
public void addedToSelection(CompetitorDTO competitor) {
int pos = quickRankList.indexOf(competitor);
if (pos >= 0) {
quickRankListBox.setItemSelected(pos, true);
}
}
@Override
public void removedFromSelection(CompetitorDTO competitor) {
int pos = quickRankList.indexOf(competitor);
if (pos >= 0) {
quickRankListBox.setItemSelected(pos, false);
}
}
@Override
public void competitorsListChanged(Iterable<CompetitorDTO> competitors) {
//TODO what to do here
}
}
@@ -4,11 +4,13 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.google.gwt.cell.client.AbstractCell;
import com.google.gwt.cell.client.FieldUpdater;
import com.google.gwt.cell.client.SafeHtmlCell;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.safehtml.client.SafeHtmlTemplates;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.user.cellview.client.CellTable;
@@ -27,6 +29,7 @@ import com.sap.sailing.gwt.ui.client.DataEntryDialog.DialogCallback;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.URLEncoder;
import com.sap.sailing.gwt.ui.shared.CourseAreaDTO;
import com.sap.sailing.gwt.ui.shared.EventDTO;
@@ -45,6 +48,20 @@ public class SailingEventManagementPanel extends SimplePanel {
private SingleSelectionModel<EventDTO> eventSelectionModel;
private ListDataProvider<EventDTO> eventProvider;
public static class AnchorCell extends AbstractCell<SafeHtml> {
@Override
public void render(com.google.gwt.cell.client.Cell.Context context, SafeHtml safeHtml, SafeHtmlBuilder sb) {
sb.append(safeHtml);
}
}
interface AnchorTemplates extends SafeHtmlTemplates {
@SafeHtmlTemplates.Template("<a href=\"{0}\">{1}</a>")
SafeHtml cell(String url, String displayName);
}
private static AnchorTemplates ANCHORTEMPLATE = GWT.create(AnchorTemplates.class);
private final AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class);
public SailingEventManagementPanel(final SailingServiceAsync sailingService, final ErrorReporter errorReporter,
@@ -72,10 +89,14 @@ public class SailingEventManagementPanel extends SimplePanel {
eventsPanel.add(createEventBtn);
// sailing events table
TextColumn<EventDTO> eventNameColumn = new TextColumn<EventDTO>() {
AnchorCell anchorCell = new AnchorCell();
Column<EventDTO, SafeHtml> eventNameColumn = new Column<EventDTO, SafeHtml>(anchorCell) {
@Override
public String getValue(EventDTO event) {
return event.name;
public SafeHtml getValue(EventDTO event) {
String debugParam = Window.Location.getParameter("gwt.codesvr");
String link = URLEncoder.encode("/gwt/RegattaOverview.html?event=" + event.id
+ (debugParam != null && !debugParam.isEmpty() ? "&gwt.codesvr=" + debugParam : ""));
return ANCHORTEMPLATE.cell(link, event.name);
}
};
@@ -25,6 +25,7 @@ import com.sap.sailing.domain.common.WindSource;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.common.impl.Util.Triple;
import com.sap.sailing.gwt.ui.shared.BulkScoreCorrectionDTO;
import com.sap.sailing.gwt.ui.shared.CompactRaceMapDataDTO;
import com.sap.sailing.gwt.ui.shared.CompetitorDTO;
import com.sap.sailing.gwt.ui.shared.CompetitorsRaceDataDTO;
import com.sap.sailing.gwt.ui.shared.ControlPointDTO;
@@ -35,11 +36,9 @@ import com.sap.sailing.gwt.ui.shared.GPSFixDTO;
import com.sap.sailing.gwt.ui.shared.LeaderboardDTO;
import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO;
import com.sap.sailing.gwt.ui.shared.ManeuverDTO;
import com.sap.sailing.gwt.ui.shared.QuickRankDTO;
import com.sap.sailing.gwt.ui.shared.RaceColumnInSeriesDTO;
import com.sap.sailing.gwt.ui.shared.RaceCourseDTO;
import com.sap.sailing.gwt.ui.shared.RaceDTO;
import com.sap.sailing.gwt.ui.shared.RaceMapDataDTO;
import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO;
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
import com.sap.sailing.gwt.ui.shared.RegattaOverviewEntryDTO;
@@ -101,12 +100,9 @@ public interface SailingService extends RemoteService {
WindInfoForRaceDTO getAveragedWindInfo(RegattaAndRaceIdentifier raceIdentifier, Date from, long millisecondsStepWidth,
int numberOfFixes, double latDeg, double lngDeg, Collection<String> windSources) throws NoWindException;
RaceMapDataDTO getRaceMapData(RegattaAndRaceIdentifier raceIdentifier, Date date, Map<CompetitorDTO, Date> from, Map<CompetitorDTO, Date> to,
boolean extrapolate) throws NoWindException;
CompactRaceMapDataDTO getRaceMapData(RegattaAndRaceIdentifier raceIdentifier, Date date, Map<String, Date> fromPerCompetitorIdAsString,
Map<String, Date> toPerCompetitorIdAsString, boolean extrapolate) throws NoWindException;
Map<CompetitorDTO, List<GPSFixDTO>> getBoatPositions(RegattaAndRaceIdentifier raceIdentifier, Map<CompetitorDTO, Date> from,
Map<CompetitorDTO, Date> to, boolean extrapolate) throws NoWindException;
RaceTimesInfoDTO getRaceTimesInfo(RegattaAndRaceIdentifier raceIdentifier);
List<RaceTimesInfoDTO> getRaceTimesInfos(Collection<RegattaAndRaceIdentifier> raceIdentifiers);
@@ -115,8 +111,6 @@ public interface SailingService extends RemoteService {
RaceCourseDTO getRaceCourse(RegattaAndRaceIdentifier raceIdentifier, Date date);
List<QuickRankDTO> getQuickRanks(RegattaAndRaceIdentifier raceIdentifier, Date date) throws NoWindException;
void removeWind(RegattaAndRaceIdentifier raceIdentifier, WindDTO windDTO);
public List<String> getLeaderboardNames() throws Exception;
@@ -25,6 +25,7 @@ import com.sap.sailing.domain.common.WindSource;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.common.impl.Util.Triple;
import com.sap.sailing.gwt.ui.shared.BulkScoreCorrectionDTO;
import com.sap.sailing.gwt.ui.shared.CompactRaceMapDataDTO;
import com.sap.sailing.gwt.ui.shared.CompetitorDTO;
import com.sap.sailing.gwt.ui.shared.CompetitorsRaceDataDTO;
import com.sap.sailing.gwt.ui.shared.ControlPointDTO;
@@ -36,11 +37,9 @@ import com.sap.sailing.gwt.ui.shared.LeaderboardDTO;
import com.sap.sailing.gwt.ui.shared.LeaderboardEntryDTO;
import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO;
import com.sap.sailing.gwt.ui.shared.ManeuverDTO;
import com.sap.sailing.gwt.ui.shared.QuickRankDTO;
import com.sap.sailing.gwt.ui.shared.RaceColumnInSeriesDTO;
import com.sap.sailing.gwt.ui.shared.RaceCourseDTO;
import com.sap.sailing.gwt.ui.shared.RaceDTO;
import com.sap.sailing.gwt.ui.shared.RaceMapDataDTO;
import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO;
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
import com.sap.sailing.gwt.ui.shared.RegattaOverviewEntryDTO;
@@ -155,33 +154,12 @@ public interface SailingServiceAsync {
void removeWind(RegattaAndRaceIdentifier raceIdentifier, WindDTO windDTO, AsyncCallback<Void> callback);
/**
* @param from
* for the list of competitors provided as keys of this map, requests the GPS fixes starting with the
* date provided as value
* @param to
* for the list of competitors provided as keys (expected to be equal to the set of competitors used as
* keys in the <code>from</code> parameter, requests the GPS fixes up to but excluding the date provided
* as value
* @param extrapolate
* if <code>true</code> and no position is known for <code>date</code>, the last entry returned in the
* list of GPS fixes will be obtained by extrapolating from the competitors last known position before
* <code>date</code> and the estimated speed.
* @return a map where for each competitor participating in the race the list of GPS fixes in increasing
* chronological order is provided. The last one is the last position at or before <code>date</code>.
*/
void getBoatPositions(RegattaAndRaceIdentifier raceIdentifier,
Map<CompetitorDTO, Date> from, Map<CompetitorDTO, Date> to,
boolean extrapolate, AsyncCallback<Map<CompetitorDTO, List<GPSFixDTO>>> callback);
void getRaceTimesInfo(RegattaAndRaceIdentifier raceIdentifier, AsyncCallback<RaceTimesInfoDTO> callback);
void getRaceTimesInfos(Collection<RegattaAndRaceIdentifier> raceIdentifiers, AsyncCallback<List<RaceTimesInfoDTO>> callback);
void getCoursePositions(RegattaAndRaceIdentifier raceIdentifier, Date date, AsyncCallback<CoursePositionsDTO> asyncCallback);
void getQuickRanks(RegattaAndRaceIdentifier raceIdentifier, Date date, AsyncCallback<List<QuickRankDTO>> callback);
/**
* Returns a {@link LeaderboardDTO} will information about all races, their points and competitor display names
* filled in. The column details are filled for the races whose named are provided in
@@ -333,8 +311,8 @@ public interface SailingServiceAsync {
void setWindSourcesToExclude(RegattaAndRaceIdentifier raceIdentifier, Iterable<WindSource> windSourcesToExclude,
AsyncCallback<Void> callback);
void getRaceMapData(RegattaAndRaceIdentifier raceIdentifier, Date date, Map<CompetitorDTO, Date> from,
Map<CompetitorDTO, Date> to, boolean extrapolate, AsyncCallback<RaceMapDataDTO> callback);
void getRaceMapData(RegattaAndRaceIdentifier raceIdentifier, Date date, Map<String, Date> fromPerCompetitorIdAsString,
Map<String, Date> toPerCompetitorIdAsString, boolean extrapolate, AsyncCallback<CompactRaceMapDataDTO> callback);
void getReplicaInfo(AsyncCallback<ReplicationStateDTO> callback);
@@ -52,7 +52,6 @@ import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.Tack;
import com.sap.sailing.domain.common.WindSource;
import com.sap.sailing.domain.common.WindSourceType;
import com.sap.sailing.domain.common.impl.DegreeBearingImpl;
import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.common.impl.Util.Triple;
@@ -71,11 +70,11 @@ import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.TimeListener;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.client.Timer.PlayStates;
import com.sap.sailing.gwt.ui.client.WindSourceTypeFormatter;
import com.sap.sailing.gwt.ui.client.shared.components.Component;
import com.sap.sailing.gwt.ui.client.shared.components.SettingsDialogComponent;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapHelpLinesSettings.HelpLineTypes;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapZoomSettings.ZoomTypes;
import com.sap.sailing.gwt.ui.client.WindSourceTypeFormatter;
import com.sap.sailing.gwt.ui.shared.CompetitorDTO;
import com.sap.sailing.gwt.ui.shared.CoursePositionsDTO;
import com.sap.sailing.gwt.ui.shared.GPSFixDTO;
@@ -357,60 +356,60 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe
computeFromAndTo(date, competitorsToShow);
final int requestID = ++boatPositionRequestIDCounter;
GetRaceMapDataAction getRaceMapDataAction = new GetRaceMapDataAction(sailingService, race, date,
fromAndToAndOverlap.getA(), fromAndToAndOverlap.getB(), true, new AsyncCallback<RaceMapDataDTO>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error obtaining racemap data: " + caught.getMessage(), true /*silentMode */);
}
GetRaceMapDataAction getRaceMapDataAction = new GetRaceMapDataAction(sailingService, competitorSelection.getAllCompetitors(), race,
date, fromAndToAndOverlap.getA(), fromAndToAndOverlap.getB(), true, new AsyncCallback<RaceMapDataDTO>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error obtaining racemap data: " + caught.getMessage(), true /*silentMode */);
}
@Override
public void onSuccess(RaceMapDataDTO raceMapDataDTO) {
if (map != null && raceMapDataDTO != null) {
quickRanks = raceMapDataDTO.quickRanks;
// process response only if not received out of order
if (startedProcessingRequestID < requestID) {
startedProcessingRequestID = requestID;
// Do boat specific actions
Map<CompetitorDTO, List<GPSFixDTO>> boatData = raceMapDataDTO.boatPositions;
updateFixes(boatData, fromAndToAndOverlap.getC());
showBoatsOnMap(date, getCompetitorsToShow());
showCompetitorInfoOnMap(date, competitorSelection.getSelectedCompetitors());
if (douglasMarkers != null) {
removeAllMarkDouglasPeuckerpoints();
}
if (maneuverMarkers != null) {
removeAllManeuverMarkers();
}
// Do mark specific actions
showCourseMarksOnMap(raceMapDataDTO.coursePositions);
showStartAndFinishLines(raceMapDataDTO.coursePositions);
showAdvantageLine(competitorsToShow, date);
// Rezoom the map
// TODO make this a loop across the LatLngBoundsCalculators, pulling them from a collection updated in updateSettings
if (!settings.getZoomSettings().containsZoomType(ZoomTypes.NONE)) { // Auto zoom if setting is not manual
LatLngBounds bounds = settings.getZoomSettings().getNewBounds(RaceMap.this);
zoomMapToNewBounds(bounds);
mapFirstZoomDone = true;
} else if (!mapFirstZoomDone) { // Zoom once to the marks
zoomMapToNewBounds(new CourseMarksBoundsCalculator().calculateNewBounds(RaceMap.this));
mapFirstZoomDone = true;
/*
* Reset the mapZoomedOrPannedSinceLastRaceSelection: In spite of the fact that
* the map was just zoomed to the bounds of the marks, it was not a zoom or pan
* triggered by the user. As a consequence the
* mapZoomedOrPannedSinceLastRaceSelection option has to reset again.
*/
// TODO bug 494: consider initial user-specific zoom settings
}
}
} else {
lastTimeChangeBeforeInitialization = date;
@Override
public void onSuccess(RaceMapDataDTO raceMapDataDTO) {
if (map != null && raceMapDataDTO != null) {
quickRanks = raceMapDataDTO.quickRanks;
// process response only if not received out of order
if (startedProcessingRequestID < requestID) {
startedProcessingRequestID = requestID;
// Do boat specific actions
Map<CompetitorDTO, List<GPSFixDTO>> boatData = raceMapDataDTO.boatPositions;
updateFixes(boatData, fromAndToAndOverlap.getC());
showBoatsOnMap(date, getCompetitorsToShow());
showCompetitorInfoOnMap(date, competitorSelection.getSelectedCompetitors());
if (douglasMarkers != null) {
removeAllMarkDouglasPeuckerpoints();
}
if (maneuverMarkers != null) {
removeAllManeuverMarkers();
}
// Do mark specific actions
showCourseMarksOnMap(raceMapDataDTO.coursePositions);
showStartAndFinishLines(raceMapDataDTO.coursePositions);
showAdvantageLine(competitorsToShow, date);
// Rezoom the map
// TODO make this a loop across the LatLngBoundsCalculators, pulling them from a collection updated in updateSettings
if (!settings.getZoomSettings().containsZoomType(ZoomTypes.NONE)) { // Auto zoom if setting is not manual
LatLngBounds bounds = settings.getZoomSettings().getNewBounds(RaceMap.this);
zoomMapToNewBounds(bounds);
mapFirstZoomDone = true;
} else if (!mapFirstZoomDone) { // Zoom once to the marks
zoomMapToNewBounds(new CourseMarksBoundsCalculator().calculateNewBounds(RaceMap.this));
mapFirstZoomDone = true;
/*
* Reset the mapZoomedOrPannedSinceLastRaceSelection: In spite of the fact that
* the map was just zoomed to the bounds of the marks, it was not a zoom or pan
* triggered by the user. As a consequence the
* mapZoomedOrPannedSinceLastRaceSelection option has to reset again.
*/
// TODO bug 494: consider initial user-specific zoom settings
}
}
});
} else {
lastTimeChangeBeforeInitialization = date;
}
}
});
asyncActionsExecutor.execute(getRaceMapDataAction);
// draw the wind into the map, get the combined wind
List<String> windSourceTypeNames = new ArrayList<String>();
@@ -1025,7 +1024,7 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe
private void showCompetitorInfoWindow(final CompetitorDTO competitorDTO, LatLng where) {
GPSFixDTO latestFixForCompetitor = getBoatFix(competitorDTO, timer.getTime());
//TODO find closed fixed where the mouse was (where) BUG 470
// TODO find close fix where the mouse was; see BUG 470
InfoWindowContent infoWindowContent = new InfoWindowContent(getInfoWindowContent(competitorDTO, latestFixForCompetitor));
map.getInfoWindow().open(where, infoWindowContent);
}
@@ -1102,10 +1101,9 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe
vPanel.add(createInfoWindowLabelAndValue(stringMessages.speed(),
NumberFormatterFactory.getDecimalFormat(1).format(lastFix.speedWithBearing.speedInKnots) + " "+stringMessages.knotsUnit()));
vPanel.add(createInfoWindowLabelAndValue(stringMessages.bearing(), (int) lastFix.speedWithBearing.bearingInDegrees + " "+stringMessages.degreesShort()));
if (lastFix.wind != null) {
vPanel.add(createInfoWindowLabelAndValue(stringMessages.degreesBoatToTheWind(), (int) Math.abs(
new DegreeBearingImpl(lastFix.speedWithBearing.bearingInDegrees).getDifferenceTo(
new DegreeBearingImpl(lastFix.wind.dampenedTrueWindFromDeg)).getDegrees()) + " "+stringMessages.degreesShort()));
if (lastFix.degreesBoatToTheWind != null) {
vPanel.add(createInfoWindowLabelAndValue(stringMessages.degreesBoatToTheWind(),
(int) Math.abs(lastFix.degreesBoatToTheWind) + " " + stringMessages.degreesShort()));
}
if (!selectedRaces.isEmpty()) {
RegattaAndRaceIdentifier race = selectedRaces.get(selectedRaces.size() - 1);
@@ -96,7 +96,7 @@ public class EditableLeaderboardPanel extends LeaderboardPanel {
setFieldUpdater(new FieldUpdater<LeaderboardRowDTO, String>() {
@Override
public void update(final int rowIndex, final LeaderboardRowDTO row, final String value) {
getSailingService().updateLeaderboardCarryValue(getLeaderboardName(), row.competitor.id,
getSailingService().updateLeaderboardCarryValue(getLeaderboardName(), row.competitor.idAsString,
value == null || value.length() == 0 ? null : Double.valueOf(value.trim()),
new AsyncCallback<Void>() {
@Override
@@ -211,7 +211,7 @@ public class EditableLeaderboardPanel extends LeaderboardPanel {
return new FieldUpdater<LeaderboardRowDTO, String>() {
@Override
public void update(final int rowIndex, final LeaderboardRowDTO row, final String value) {
getSailingService().updateCompetitorDisplayNameInLeaderboard(getLeaderboardName(), row.competitor.id,
getSailingService().updateCompetitorDisplayNameInLeaderboard(getLeaderboardName(), row.competitor.idAsString,
value == null || value.length() == 0 ? null : value.trim(),
new AsyncCallback<Void>() {
@Override
@@ -329,7 +329,7 @@ public class EditableLeaderboardPanel extends LeaderboardPanel {
EditableLeaderboardPanel.this.getData());
getWhiteboardOwner().whiteboardProduced(whiteboard);
getBusyIndicator().setBusy(true);
getSailingService().updateLeaderboardMaxPointsReason(getLeaderboardName(), row.competitor.id,
getSailingService().updateLeaderboardMaxPointsReason(getLeaderboardName(), row.competitor.idAsString,
raceColumnName, value == null || value.trim().length() == 0 ? null : MaxPointsReason.valueOf(value.trim()),
getLeaderboardDisplayDate(), new AsyncCallback<Triple<Double, Double, Boolean>>() {
@Override
@@ -425,7 +425,7 @@ public class EditableLeaderboardPanel extends LeaderboardPanel {
EditableLeaderboardPanel.this.getData());
getWhiteboardOwner().whiteboardProduced(whiteboard);
getBusyIndicator().setBusy(true);
getSailingService().updateLeaderboardScoreCorrection(getLeaderboardName(), row.competitor.id, raceColumnName,
getSailingService().updateLeaderboardScoreCorrection(getLeaderboardName(), row.competitor.idAsString, raceColumnName,
value == null || value.trim().length() == 0 ? null : Double.valueOf(value.trim()), getLeaderboardDisplayDate(),
new AsyncCallback<Triple<Double, Double, Boolean>>() {
@Override
@@ -503,7 +503,7 @@ public class EditableLeaderboardPanel extends LeaderboardPanel {
@Override
public void ok(final Pair<MaxPointsReason, Double> editedObject) {
getBusyIndicator().setBusy(true);
getSailingService().updateLeaderboardScoreCorrection(getLeaderboardName(), row.competitor.id, raceColumnName,
getSailingService().updateLeaderboardScoreCorrection(getLeaderboardName(), row.competitor.idAsString, raceColumnName,
editedObject.getB(), getLeaderboardDisplayDate(),
new AsyncCallback<Triple<Double, Double, Boolean>>() {
@Override
@@ -517,7 +517,7 @@ public class EditableLeaderboardPanel extends LeaderboardPanel {
@Override
public void onSuccess(Triple<Double, Double, Boolean> newNetAndTotalPointsAndIsCorrected) {
getSailingService().updateLeaderboardMaxPointsReason(getLeaderboardName(), row.competitor.id, raceColumnName,
getSailingService().updateLeaderboardMaxPointsReason(getLeaderboardName(), row.competitor.idAsString, raceColumnName,
editedObject.getA(), getLeaderboardDisplayDate(),
new AsyncCallback<Triple<Double, Double, Boolean>>() {
@Override
@@ -653,7 +653,7 @@ public class EditableLeaderboardPanel extends LeaderboardPanel {
unsuppressButtonColumn.setFieldUpdater(new FieldUpdater<CompetitorDTO, String>() {
@Override
public void update(int index, final CompetitorDTO object, String value) {
getSailingService().suppressCompetitorInLeaderboard(getLeaderboardName(), object.id,
getSailingService().suppressCompetitorInLeaderboard(getLeaderboardName(), object.idAsString,
/* suppressed */ false, new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
@@ -787,7 +787,7 @@ public class EditableLeaderboardPanel extends LeaderboardPanel {
return new FieldUpdater<LeaderboardRowDTO, String>() {
@Override
public void update(int index, final LeaderboardRowDTO row, String value) {
getSailingService().suppressCompetitorInLeaderboard(getLeaderboardName(), row.competitor.id,
getSailingService().suppressCompetitorInLeaderboard(getLeaderboardName(), row.competitor.idAsString,
/* suppressed */ true,
new AsyncCallback<Void>() {
@Override
@@ -170,6 +170,7 @@ import com.sap.sailing.geocoding.ReverseGeocoder;
import com.sap.sailing.gwt.ui.client.SailingService;
import com.sap.sailing.gwt.ui.shared.BoatClassDTO;
import com.sap.sailing.gwt.ui.shared.BulkScoreCorrectionDTO;
import com.sap.sailing.gwt.ui.shared.CompactRaceMapDataDTO;
import com.sap.sailing.gwt.ui.shared.CompetitorDTO;
import com.sap.sailing.gwt.ui.shared.CompetitorRaceDataDTO;
import com.sap.sailing.gwt.ui.shared.CompetitorsRaceDataDTO;
@@ -199,7 +200,6 @@ import com.sap.sailing.gwt.ui.shared.RaceColumnInSeriesDTO;
import com.sap.sailing.gwt.ui.shared.RaceCourseDTO;
import com.sap.sailing.gwt.ui.shared.RaceDTO;
import com.sap.sailing.gwt.ui.shared.RaceInfoDTO;
import com.sap.sailing.gwt.ui.shared.RaceMapDataDTO;
import com.sap.sailing.gwt.ui.shared.RaceStatusDTO;
import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO;
import com.sap.sailing.gwt.ui.shared.RaceWithCompetitorsDTO;
@@ -1682,33 +1682,43 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
}
@Override
public RaceMapDataDTO getRaceMapData(RegattaAndRaceIdentifier raceIdentifier, Date date,
Map<CompetitorDTO, Date> from, Map<CompetitorDTO, Date> to,
public CompactRaceMapDataDTO getRaceMapData(RegattaAndRaceIdentifier raceIdentifier, Date date,
Map<String, Date> fromPerCompetitorIdAsString, Map<String, Date> toPerCompetitorIdAsString,
boolean extrapolate) throws NoWindException {
RaceMapDataDTO raceMapDataDTO = new RaceMapDataDTO();
raceMapDataDTO.boatPositions = getBoatPositions(raceIdentifier, from, to, extrapolate);
raceMapDataDTO.coursePositions = getCoursePositions(raceIdentifier, date);
raceMapDataDTO.quickRanks = getQuickRanks(raceIdentifier, date);
return raceMapDataDTO;
return new CompactRaceMapDataDTO(getBoatPositions(raceIdentifier, fromPerCompetitorIdAsString,
toPerCompetitorIdAsString, extrapolate), getCoursePositions(raceIdentifier, date), getQuickRanks(
raceIdentifier, date));
}
@Override
public Map<CompetitorDTO, List<GPSFixDTO>> getBoatPositions(RegattaAndRaceIdentifier raceIdentifier,
Map<CompetitorDTO, Date> from, Map<CompetitorDTO, Date> to,
/**
* @param from
* for the list of competitors provided as keys of this map, requests the GPS fixes starting with the
* date provided as value
* @param to
* for the list of competitors provided as keys (expected to be equal to the set of competitors used as
* keys in the <code>from</code> parameter, requests the GPS fixes up to but excluding the date provided
* as value
* @param extrapolate
* if <code>true</code> and no position is known for <code>date</code>, the last entry returned in the
* list of GPS fixes will be obtained by extrapolating from the competitors last known position before
* <code>date</code> and the estimated speed.
* @return a map where for each competitor participating in the race the list of GPS fixes in increasing
* chronological order is provided. The last one is the last position at or before <code>date</code>.
*/
private Map<CompetitorDTO, List<GPSFixDTO>> getBoatPositions(RegattaAndRaceIdentifier raceIdentifier,
Map<String, Date> fromPerCompetitorIdAsString, Map<String, Date> toPerCompetitorIdAsString,
boolean extrapolate) throws NoWindException {
Map<CompetitorDTO, List<GPSFixDTO>> result = new HashMap<CompetitorDTO, List<GPSFixDTO>>();
TrackedRace trackedRace = getExistingTrackedRace(raceIdentifier);
if (trackedRace != null) {
for (Competitor competitor : trackedRace.getRace().getCompetitors()) {
CompetitorDTO competitorDTO = convertToCompetitorDTO(competitor);
if (from.containsKey(competitorDTO)) {
if (fromPerCompetitorIdAsString.containsKey(competitor.getId().toString())) {
CompetitorDTO competitorDTO = convertToCompetitorDTO(competitor);
List<GPSFixDTO> fixesForCompetitor = new ArrayList<GPSFixDTO>();
result.put(competitorDTO, fixesForCompetitor);
GPSFixTrack<Competitor, GPSFixMoving> track = trackedRace.getTrack(competitor);
TimePoint fromTimePoint = new MillisecondsTimePoint(from.get(competitorDTO));
TimePoint toTimePointExcluding = new MillisecondsTimePoint(to.get(competitorDTO));
TimePoint fromTimePoint = new MillisecondsTimePoint(fromPerCompetitorIdAsString.get(competitorDTO.idAsString));
TimePoint toTimePointExcluding = new MillisecondsTimePoint(toPerCompetitorIdAsString.get(competitorDTO.idAsString));
// copy the fixes into a list while holding the monitor; then release the monitor to avoid deadlocks
// during wind estimations required for tack determination
List<GPSFixMoving> fixes = new ArrayList<GPSFixMoving>();
@@ -1765,7 +1775,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
Wind wind2 = trackedRace.getWind(position, toTimePointExcluding);
WindDTO windDTO2 = createWindDTOFromAlreadyAveraged(wind2, trackedRace.getOrCreateWindTrack(windSource), toTimePointExcluding);
GPSFixDTO extrapolated = new GPSFixDTO(
to.get(competitorDTO),
toPerCompetitorIdAsString.get(competitorDTO.idAsString),
position==null?null:new PositionDTO(position.getLatDeg(), position.getLngDeg()),
speedWithBearing==null?null:createSpeedWithBearingDTO(speedWithBearing), windDTO2,
tack2, legType2, /* extrapolated */ true);
@@ -2050,8 +2060,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
return startMarkPositions;
}
@Override
public List<QuickRankDTO> getQuickRanks(RegattaAndRaceIdentifier raceIdentifier, Date date) throws NoWindException {
private List<QuickRankDTO> getQuickRanks(RegattaAndRaceIdentifier raceIdentifier, Date date) throws NoWindException {
List<QuickRankDTO> result = new ArrayList<QuickRankDTO>();
if (date != null) {
TimePoint dateAsTimePoint = new MillisecondsTimePoint(date);
@@ -2766,7 +2775,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
@Override
public CompetitorRaceDataDTO call() throws NoWindException {
Competitor competitor = getCompetitorById(trackedRace.getRace().getCompetitors(),
competitorDTO.id);
competitorDTO.idAsString);
ArrayList<Triple<String, Date, Double>> markPassingsData = new ArrayList<Triple<String, Date, Double>>();
ArrayList<Pair<Date, Double>> raceData = new ArrayList<Pair<Date, Double>>();
// Filling the mark passings
@@ -8,7 +8,7 @@ import com.sap.sailing.domain.common.MaxPointsReason;
/**
* Captures a collection of score corrections to apply to a leaderboard. The leaderboard is identified by name,
* and so are the race columns. The competitors are identified by their {@link CompetitorDTO#id ID}.
* and so are the race columns. The competitors are identified by their {@link CompetitorDTO#idAsString ID}.
*
* @author Axel Uhl (D043530)
*
@@ -27,19 +27,19 @@ public class BulkScoreCorrectionDTO implements IsSerializable {
}
public void addScoreUpdate(CompetitorDTO competitor, RaceColumnDTO raceColumn, double newScore) {
Map<String, Double> map = scoreUpdatesForRaceColumnByCompetitorIdAsString.get(competitor.id);
Map<String, Double> map = scoreUpdatesForRaceColumnByCompetitorIdAsString.get(competitor.idAsString);
if (map == null) {
map = new HashMap<String, Double>();
scoreUpdatesForRaceColumnByCompetitorIdAsString.put(competitor.id, map);
scoreUpdatesForRaceColumnByCompetitorIdAsString.put(competitor.idAsString, map);
}
map.put(raceColumn.name, newScore);
}
public void addMaxPointsReasonUpdate(CompetitorDTO competitor, RaceColumnDTO raceColumn, MaxPointsReason newReason) {
Map<String, MaxPointsReason> map = maxPointsUpdatesForRaceColumnByCompetitorIdAsString.get(competitor.id);
Map<String, MaxPointsReason> map = maxPointsUpdatesForRaceColumnByCompetitorIdAsString.get(competitor.idAsString);
if (map == null) {
map = new HashMap<String, MaxPointsReason>();
maxPointsUpdatesForRaceColumnByCompetitorIdAsString.put(competitor.id, map);
maxPointsUpdatesForRaceColumnByCompetitorIdAsString.put(competitor.idAsString, map);
}
map.put(raceColumn.name, newReason);
}
@@ -0,0 +1,37 @@
package com.sap.sailing.gwt.ui.shared;
import com.google.gwt.user.client.rpc.IsSerializable;
/**
* Holds the same data as a {@link QuickRanksDTO} object, only that the {@link CompetitorDTO} is replaced by the
* string representation of the competitor's ID.
*
* @author Axel Uhl (d043530)
*
*/
public class CompactQuickRankDTO implements IsSerializable {
private String competitorIdAsString;
private int rank;
private int legNumber;
CompactQuickRankDTO() {}
public CompactQuickRankDTO(String competitorIdAsString, int rank, int legNumber) {
super();
this.competitorIdAsString = competitorIdAsString;
this.rank = rank;
this.legNumber = legNumber;
}
public String getCompetitorIdAsString() {
return competitorIdAsString;
}
public int getRank() {
return rank;
}
public int getLegNumber() {
return legNumber;
}
}
@@ -0,0 +1,61 @@
package com.sap.sailing.gwt.ui.shared;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.gwt.user.client.rpc.IsSerializable;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
/**
* A compact representation of a {@link RaceMapDataDTO} that represents competitors by their ID only instead of a
* complete {@link CompetitorDTO} object. This way, a caller of the
* {@link SailingServiceAsync#getRaceMapData(com.sap.sailing.domain.common.RegattaAndRaceIdentifier, java.util.Date, Map, Map, boolean, com.google.gwt.user.client.rpc.AsyncCallback)}
* method that has to provide the IDs of all competitors already will already know all those {@link CompetitorDTO}
* objects already. There is no need to serialize the {@link CompetitorDTO}s either way.
*
* @author Axel Uhl (d043530)
*
*/
public class CompactRaceMapDataDTO implements IsSerializable {
private Map<String, List<GPSFixDTO>> boatPositionsByCompetitorIdAsString;
private CoursePositionsDTO coursePositions;
private List<CompactQuickRankDTO> quickRanks;
CompactRaceMapDataDTO() {}
public CompactRaceMapDataDTO(Map<CompetitorDTO, List<GPSFixDTO>> boatPositions, CoursePositionsDTO coursePositions,
List<QuickRankDTO> quickRanks) {
this.boatPositionsByCompetitorIdAsString = new HashMap<String, List<GPSFixDTO>>();
for (Map.Entry<CompetitorDTO, List<GPSFixDTO>> e : boatPositions.entrySet()) {
this.boatPositionsByCompetitorIdAsString.put(e.getKey().idAsString, e.getValue());
}
this.quickRanks = new ArrayList<CompactQuickRankDTO>(quickRanks.size());
for (QuickRankDTO quickRank : quickRanks) {
this.quickRanks.add(new CompactQuickRankDTO(quickRank.competitor.idAsString, quickRank.rank, quickRank.legNumber));
}
this.coursePositions = coursePositions;
}
public RaceMapDataDTO getRaceMapDataDTO(Iterable<CompetitorDTO> competitors) {
Map<String, CompetitorDTO> competitorsByIdAsString = new HashMap<String, CompetitorDTO>();
for (CompetitorDTO competitor : competitors) {
competitorsByIdAsString.put(competitor.idAsString, competitor);
}
RaceMapDataDTO result = new RaceMapDataDTO();
result.quickRanks = new ArrayList<QuickRankDTO>(this.quickRanks.size());
for (CompactQuickRankDTO compactQuickRank : this.quickRanks) {
final CompetitorDTO competitorDTO = competitorsByIdAsString.get(compactQuickRank.getCompetitorIdAsString());
if (competitorDTO != null) {
result.quickRanks.add(new QuickRankDTO(competitorDTO, compactQuickRank.getRank(), compactQuickRank.getLegNumber()));
}
}
result.coursePositions = coursePositions;
result.boatPositions = new HashMap<CompetitorDTO, List<GPSFixDTO>>();
for (Map.Entry<String, List<GPSFixDTO>> e : boatPositionsByCompetitorIdAsString.entrySet()) {
result.boatPositions.put(competitorsByIdAsString.get(e.getKey()), e.getValue());
}
return result;
}
}
@@ -7,19 +7,19 @@ public class CompetitorDTO extends NamedDTO implements IsSerializable {
public String threeLetterIocCountryCode;
public String countryName;
public String sailID;
public String id;
public String idAsString;
public BoatClassDTO boatClass;
CompetitorDTO() {}
public CompetitorDTO(String name, String twoLetterIsoCountryCode, String threeLetterIocCountryCode,
String countryName, String sailID, String id, BoatClassDTO boatClass) {
String countryName, String sailID, String idAsString, BoatClassDTO boatClass) {
super(name);
this.twoLetterIsoCountryCode = twoLetterIsoCountryCode;
this.threeLetterIocCountryCode = threeLetterIocCountryCode;
this.countryName = countryName;
this.sailID = sailID;
this.id = id;
this.idAsString = idAsString;
this.boatClass = boatClass;
}
@@ -27,7 +27,7 @@ public class CompetitorDTO extends NamedDTO implements IsSerializable {
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * id.hashCode();
result = prime * idAsString.hashCode();
return result;
}
@@ -40,10 +40,10 @@ public class CompetitorDTO extends NamedDTO implements IsSerializable {
if (getClass() != obj.getClass())
return false;
CompetitorDTO other = (CompetitorDTO) obj;
if (id == null) {
if (other.id != null)
if (idAsString == null) {
if (other.idAsString != null)
return false;
} else if (!id.equals(other.id))
} else if (!idAsString.equals(other.idAsString))
return false;
return true;
}
@@ -5,13 +5,13 @@ import java.util.Date;
import com.google.gwt.user.client.rpc.IsSerializable;
import com.sap.sailing.domain.common.LegType;
import com.sap.sailing.domain.common.Tack;
import com.sap.sailing.domain.common.impl.DegreeBearingImpl;
public class GPSFixDTO implements IsSerializable {
public Date timepoint;
public PositionDTO position;
public SpeedWithBearingDTO speedWithBearing;
public WindDTO wind;
/**
* tells if this fix was computed by extrapolation instead of having been captured by a device directly
* or having been interpolated between captured fixes
@@ -31,6 +31,11 @@ public class GPSFixDTO implements IsSerializable {
*/
public LegType legType;
/**
* degrees between boat's course over ground and the dampened true wind direction (from)
*/
public Double degreesBoatToTheWind;
public GPSFixDTO() {}
public GPSFixDTO(Date timepoint, PositionDTO position, SpeedWithBearingDTO speedWithBearing, WindDTO wind,
@@ -42,6 +47,9 @@ public class GPSFixDTO implements IsSerializable {
this.tack = tack;
this.legType = legType;
this.extrapolated = extrapolated;
this.wind = wind;
if (speedWithBearing != null && wind != null) {
this.degreesBoatToTheWind = new DegreeBearingImpl(speedWithBearing.bearingInDegrees).getDifferenceTo(
new DegreeBearingImpl(wind.dampenedTrueWindFromDeg)).getDegrees();
}
}
}
@@ -9,5 +9,4 @@ public class RaceMapDataDTO implements IsSerializable {
public Map<CompetitorDTO, List<GPSFixDTO>> boatPositions;
public CoursePositionsDTO coursePositions;
public List<QuickRankDTO> quickRanks;
public BoatClassDTO boatClass;
}
@@ -13,7 +13,7 @@ import org.junit.Test;
import com.sap.sailing.domain.base.EventBase;
import com.sap.sailing.domain.base.Venue;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.EventDataJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.EventJsonSerializer;
public class EventDataJsonSerializerTest {
@@ -22,7 +22,7 @@ public class EventDataJsonSerializerTest {
protected final String expectedPublicationUrl = "cd";
protected JsonSerializer<Venue> venueSerializer;
protected EventDataJsonSerializer serializer;
protected EventJsonSerializer serializer;
protected EventBase event;
// see https://groups.google.com/forum/?fromgroups=#!topic/mockito/iMumB0_bpdo
@@ -37,7 +37,7 @@ public class EventDataJsonSerializerTest {
// ... and the serializer itself.
venueSerializer = mock(JsonSerializer.class);
serializer = new EventDataJsonSerializer(venueSerializer);
serializer = new EventJsonSerializer(venueSerializer);
}
@Test
@@ -46,13 +46,13 @@ public class EventDataJsonSerializerTest {
assertEquals(
expectedId,
UUID.fromString(result.get(EventDataJsonSerializer.FIELD_ID).toString()));
UUID.fromString(result.get(EventJsonSerializer.FIELD_ID).toString()));
assertEquals(
expectedName,
result.get(EventDataJsonSerializer.FIELD_NAME));
result.get(EventJsonSerializer.FIELD_NAME));
assertEquals(
expectedPublicationUrl,
result.get(EventDataJsonSerializer.FIELD_PUBLICATION_URL));
result.get(EventJsonSerializer.FIELD_PUBLICATION_URL));
}
@Test
@@ -68,7 +68,7 @@ public class EventDataJsonSerializerTest {
assertEquals(
expectedVenue,
result.get(EventDataJsonSerializer.FIELD_VENUE));
result.get(EventJsonSerializer.FIELD_VENUE));
}
}
@@ -39,7 +39,9 @@ import com.sap.sailing.server.gateway.serialization.coursedata.impl.CourseBaseJs
import com.sap.sailing.server.gateway.serialization.coursedata.impl.GateJsonSerializer;
import com.sap.sailing.server.gateway.serialization.coursedata.impl.MarkJsonSerializer;
import com.sap.sailing.server.gateway.serialization.coursedata.impl.WaypointJsonSerializer;
import com.sap.sailing.server.gateway.serialization.racegroup.impl.CompetitorJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.CompetitorJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.PersonJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.TeamJsonSerializer;
import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogCourseDesignChangedEventSerializer;
public class RaceLogCourseDesignChangedEventSerializerTest {
@@ -52,7 +54,7 @@ public class RaceLogCourseDesignChangedEventSerializerTest {
@Before
public void setUp() {
SharedDomainFactory factory = DomainFactory.INSTANCE;
serializer = new RaceLogCourseDesignChangedEventSerializer(new CompetitorJsonSerializer(),
serializer = new RaceLogCourseDesignChangedEventSerializer(new CompetitorJsonSerializer(new TeamJsonSerializer(new PersonJsonSerializer())),
new CourseBaseJsonSerializer(new WaypointJsonSerializer(
new ControlPointJsonSerializer(
new MarkJsonSerializer(),
@@ -1,13 +1,14 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Serialization
Bundle-Name: Gateway Serialization
Bundle-SymbolicName: com.sap.sailing.server.gateway.serialization
Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: org.json.simple
Require-Bundle: com.sap.sailing.domain.common;bundle-version="1.0.0",
com.sap.sailing.domain.shared.android;bundle-version="1.0.0"
com.sap.sailing.domain.shared.android;bundle-version="1.0.0",
com.sap.sailing.domain;bundle-version="1.0.0"
Export-Package: com.sap.sailing.server.gateway.deserialization,
com.sap.sailing.server.gateway.deserialization.coursedata.impl,
com.sap.sailing.server.gateway.deserialization.impl,
@@ -8,7 +8,7 @@ import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.SharedDomainFactory;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.serialization.racegroup.impl.CompetitorJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.CompetitorJsonSerializer;
public class CompetitorDeserializer implements JsonDeserializer<Competitor> {
@@ -9,10 +9,9 @@ public class BoatClassJsonSerializer implements JsonSerializer<BoatClass> {
public static final String FIELD_NAME = "name";
@Override
public JSONObject serialize(BoatClass object) {
public JSONObject serialize(BoatClass boatClass) {
JSONObject result = new JSONObject();
result.put(FIELD_NAME, object.getName());
result.put(FIELD_NAME, boatClass.getName());
return result;
}
}
@@ -12,10 +12,10 @@ public class ColorJsonSerializer implements JsonSerializer<Color> {
public static final String FIELD_BLUE = "b";
@Override
public JSONObject serialize(Color object) {
public JSONObject serialize(Color color) {
JSONObject result = new JSONObject();
Triple<Integer, Integer, Integer> rgb = object.getAsRGB();
Triple<Integer, Integer, Integer> rgb = color.getAsRGB();
result.put(FIELD_RED, rgb.getA());
result.put(FIELD_GREEN, rgb.getB());
result.put(FIELD_BLUE, rgb.getC());
@@ -0,0 +1,46 @@
package com.sap.sailing.server.gateway.serialization.impl;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Team;
import com.sap.sailing.domain.common.CountryCode;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
public class CompetitorJsonSerializer implements JsonSerializer<Competitor> {
public static final String FIELD_ID = "id";
public static final String FIELD_NAME = "name";
public static final String FIELD_SAILID = "sailID";
public static final String FIELD_NATIONALITY = "nationality";
public static final String FIELD_NATIONALITY_ISO2 = "nationalityISO2";
public static final String FIELD_NATIONALITY_ISO3 = "nationalityISO3";
public static final String FIELD_TEAM = "team";
private final JsonSerializer<Team> teamJsonSerializer;
public CompetitorJsonSerializer() {
this(null);
}
public CompetitorJsonSerializer(JsonSerializer<Team> teamJsonSerializer) {
this.teamJsonSerializer = teamJsonSerializer;
}
@Override
public JSONObject serialize(Competitor competitor) {
JSONObject result = new JSONObject();
result.put(FIELD_ID, competitor.getId().toString());
result.put(FIELD_NAME, competitor.getName());
result.put(FIELD_SAILID, competitor.getBoat()==null?"":competitor.getBoat().getSailID());
result.put(FIELD_NATIONALITY, competitor.getTeam().getNationality().getThreeLetterIOCAcronym());
CountryCode countryCode = competitor.getTeam().getNationality().getCountryCode();
result.put(FIELD_NATIONALITY_ISO2, countryCode == null ? "" : countryCode.getTwoLetterISOCode());
result.put(FIELD_NATIONALITY_ISO3, countryCode == null ? "" : countryCode.getThreeLetterISOCode());
if(teamJsonSerializer != null) {
result.put(FIELD_TEAM, teamJsonSerializer.serialize(competitor.getTeam()));
}
return result;
}
}
@@ -19,5 +19,4 @@ public class CourseAreaJsonSerializer implements JsonSerializer<CourseArea> {
return result;
}
}
@@ -6,7 +6,7 @@ import com.sap.sailing.domain.base.EventBase;
import com.sap.sailing.domain.base.Venue;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
public class EventDataJsonSerializer implements JsonSerializer<EventBase> {
public class EventJsonSerializer implements JsonSerializer<EventBase> {
public static final String FIELD_ID = "id";
public static final String FIELD_NAME = "name";
public static final String FIELD_PUBLICATION_URL = "publicationUrl";
@@ -14,18 +14,18 @@ public class EventDataJsonSerializer implements JsonSerializer<EventBase> {
private final JsonSerializer<Venue> venueSerializer;
public EventDataJsonSerializer(JsonSerializer<Venue> venueSerializer)
public EventJsonSerializer(JsonSerializer<Venue> venueSerializer)
{
this.venueSerializer = venueSerializer;
}
public JSONObject serialize(EventBase object) {
public JSONObject serialize(EventBase event) {
JSONObject result = new JSONObject();
result.put(FIELD_ID, object.getId().toString());
result.put(FIELD_NAME, object.getName());
result.put(FIELD_PUBLICATION_URL, object.getPublicationUrl());
result.put(FIELD_VENUE, venueSerializer.serialize(object.getVenue()));
result.put(FIELD_ID, event.getId().toString());
result.put(FIELD_NAME, event.getName());
result.put(FIELD_PUBLICATION_URL, event.getPublicationUrl());
result.put(FIELD_VENUE, venueSerializer.serialize(event.getVenue()));
return result;
}
@@ -1,4 +1,4 @@
package com.sap.sailing.server.gateway.serialization.racegroup.impl;
package com.sap.sailing.server.gateway.serialization.impl;
import org.json.simple.JSONObject;
@@ -0,0 +1,21 @@
package com.sap.sailing.server.gateway.serialization.impl;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Person;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
public class PersonJsonSerializer implements JsonSerializer<Person> {
public static final String FIELD_NAME = "name";
public static final String FIELD_DESCRIPTION = "description";
@Override
public JSONObject serialize(Person person) {
JSONObject result = new JSONObject();
result.put(FIELD_NAME, person.getName());
result.put(FIELD_DESCRIPTION, person.getDescription());
return result;
}
}
@@ -0,0 +1,56 @@
package com.sap.sailing.server.gateway.serialization.impl;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.Series;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
public class RegattaJsonSerializer implements JsonSerializer<Regatta> {
public static final String FIELD_NAME = "name";
public static final String FIELD_BOATCLASS = "boatclass";
public static final String FIELD_SCORINGSYSTEM = "scoringSystem";
public static final String FIELD_SERIES = "series";
public static final String FIELD_COMPETITORS = "competitors";
public static final String FIELD_TRACKED_RACES = "trackedRaces";
private final JsonSerializer<Series> seriesSerializer;
private final JsonSerializer<Competitor> competitorSerializer;
public RegattaJsonSerializer() {
this(null, null);
}
public RegattaJsonSerializer(JsonSerializer<Series> seriesSerializer, JsonSerializer<Competitor> competitorSerializer) {
this.seriesSerializer = seriesSerializer;
this.competitorSerializer = competitorSerializer;
}
public JSONObject serialize(Regatta regatta) {
JSONObject result = new JSONObject();
result.put(FIELD_NAME, regatta.getName());
result.put(FIELD_SCORINGSYSTEM, regatta.getScoringScheme().getType().name());
result.put(FIELD_BOATCLASS, regatta.getBoatClass() != null ? regatta.getBoatClass().getName(): null);
if(seriesSerializer != null) {
JSONArray seriesJson = new JSONArray();
for (Series series : regatta.getSeries()) {
seriesJson.add(seriesSerializer.serialize(series));
}
result.put(FIELD_SERIES, seriesJson);
}
if(competitorSerializer != null) {
JSONArray competitorsJson = new JSONArray();
for (Competitor competitor: regatta.getCompetitors()) {
competitorsJson.add(competitorSerializer.serialize(competitor));
}
result.put(FIELD_COMPETITORS, competitorsJson);
}
return result;
}
}
@@ -0,0 +1,41 @@
package com.sap.sailing.server.gateway.serialization.impl;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.base.Series;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
public class SeriesJsonSerializer implements JsonSerializer<Series> {
public static final String FIELD_NAME = "name";
public static final String FIELD_FLEETS = "fleets";
public static final String FIELD_RACES = "races";
private final JsonSerializer<Fleet> fleetSerializer;
public SeriesJsonSerializer(JsonSerializer<Fleet> fleetSerializer) {
this.fleetSerializer = fleetSerializer;
}
public JSONObject serialize(Series series) {
JSONObject result = new JSONObject();
result.put(FIELD_NAME, series.getName());
JSONArray fleetsJson = new JSONArray();
for (Fleet fleet : series.getFleets()) {
fleetsJson.add(fleetSerializer.serialize(fleet));
}
result.put(FIELD_FLEETS, fleetsJson);
JSONArray racesJson = new JSONArray();
for(RaceColumn raceColumn: series.getRaceColumns()) {
racesJson.add(raceColumn.getName());
}
result.put(FIELD_RACES, racesJson);
return result;
}
}
@@ -0,0 +1,33 @@
package com.sap.sailing.server.gateway.serialization.impl;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Person;
import com.sap.sailing.domain.base.Team;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
public class TeamJsonSerializer implements JsonSerializer<Team> {
public static final String FIELD_NAME = "name";
public static final String FIELD_SAILORS = "sailors";
private final JsonSerializer<Person> personJsonSerializer;
public TeamJsonSerializer(JsonSerializer<Person> personJsonSerializer) {
this.personJsonSerializer = personJsonSerializer;
}
@Override
public JSONObject serialize(Team team) {
JSONObject result = new JSONObject();
result.put(FIELD_NAME, team.getName());
JSONArray jsonSailors = new JSONArray();
for (Person sailor : team.getSailors()) {
jsonSailors.add(personJsonSerializer.serialize(sailor));
}
result.put(FIELD_SAILORS, jsonSailors);
return result;
}
}
@@ -0,0 +1,21 @@
package com.sap.sailing.server.gateway.serialization.impl;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
public class TrackedRaceJsonSerializer implements JsonSerializer<TrackedRace> {
public static final String FIELD_NAME = "name";
public static final String FIELD_START_TIME = "startTime";
@Override
public JSONObject serialize(TrackedRace trackedRace) {
JSONObject result = new JSONObject();
result.put("name", trackedRace.getRace().getName());
TimePoint startTime = trackedRace.getStartOfRace();
result.put(FIELD_START_TIME, startTime == null ? Long.MAX_VALUE : startTime.asMillis());
return result;
}
}
@@ -7,26 +7,23 @@ import com.sap.sailing.domain.base.CourseArea;
import com.sap.sailing.domain.base.Venue;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
public class VenueJsonSerializer implements JsonSerializer<Venue> {
public static final String FIELD_NAME = "name";
public static final String FIELD_COURSE_AREAS = "courseAreas";
private final JsonSerializer<CourseArea> areaSerializer;
public VenueJsonSerializer(JsonSerializer<CourseArea> areaSerializer)
{
public VenueJsonSerializer(JsonSerializer<CourseArea> areaSerializer) {
this.areaSerializer = areaSerializer;
}
@Override
public JSONObject serialize(Venue object) {
public JSONObject serialize(Venue venue) {
JSONObject result = new JSONObject();
result.put(FIELD_NAME, object.getName());
result.put(FIELD_NAME, venue.getName());
JSONArray areas = new JSONArray();
for (CourseArea area : object.getCourseAreas())
{
for (CourseArea area : venue.getCourseAreas()) {
areas.add(areaSerializer.serialize(area));
}
result.put(FIELD_COURSE_AREAS, areas);
@@ -1,20 +0,0 @@
package com.sap.sailing.server.gateway.serialization.racegroup.impl;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
public class CompetitorJsonSerializer implements JsonSerializer<Competitor> {
public static final String FIELD_ID = "id";
public static final String FIELD_NAME = "name";
@Override
public JSONObject serialize(Competitor object) {
JSONObject result = new JSONObject();
result.put(FIELD_ID, object.getId().toString());
result.put(FIELD_NAME, object.getName());
return result;
}
}
@@ -96,6 +96,14 @@
<servlet-name>RegattasJsonGetServlet</servlet-name>
<url-pattern>/regattas</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>RegattaJsonGetServlet</servlet-name>
<servlet-class>com.sap.sailing.server.gateway.impl.RegattaJsonGetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RegattaJsonGetServlet</servlet-name>
<url-pattern>/regatta</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>LeaderboardsJsonGetServlet</servlet-name>
@@ -12,7 +12,7 @@ import com.sap.sailing.domain.base.EventBase;
import com.sap.sailing.server.gateway.AbstractJsonHttpServlet;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.CourseAreaJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.EventDataJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.EventJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.VenueJsonSerializer;
public class EventsJsonGetServlet extends AbstractJsonHttpServlet {
@@ -20,13 +20,12 @@ public class EventsJsonGetServlet extends AbstractJsonHttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
JsonSerializer<EventBase> eventSerializer = new EventDataJsonSerializer(new VenueJsonSerializer(new CourseAreaJsonSerializer()));
JsonSerializer<EventBase> eventSerializer = new EventJsonSerializer(new VenueJsonSerializer(new CourseAreaJsonSerializer()));
JSONArray result = new JSONArray();
for (EventBase event : getService().getAllEvents()) {
result.add(eventSerializer.serialize(event));
}
setJsonResponseHeader(response);
result.writeJSONString(response.getWriter());
response.setContentType("application/json");
}
}
@@ -0,0 +1,49 @@
package com.sap.sailing.server.gateway.impl;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.common.RegattaName;
import com.sap.sailing.server.gateway.AbstractJsonHttpServlet;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.ColorJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.CompetitorJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.FleetJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.PersonJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.RegattaJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.SeriesJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.TeamJsonSerializer;
public class RegattaJsonGetServlet extends AbstractJsonHttpServlet {
private static final long serialVersionUID = -5280787192024697254L;
private static final String PARAM_NAME_REGATTANAME = "name";
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String regattaName = request.getParameter(PARAM_NAME_REGATTANAME);
if (regattaName == null) {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Need to specify a regatta name using the "+
PARAM_NAME_REGATTANAME + " parameter");
} else {
Regatta regatta = getService().getRegatta(new RegattaName(regattaName));
if (regatta == null) {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Regatta " + regattaName + " not found");
} else {
SeriesJsonSerializer seriesJsonSerializer = new SeriesJsonSerializer(new FleetJsonSerializer(new ColorJsonSerializer()));
CompetitorJsonSerializer competitorJsonSerializer = new CompetitorJsonSerializer(new TeamJsonSerializer(new PersonJsonSerializer()));
JsonSerializer<Regatta> regattaSerializer = new RegattaJsonSerializer(seriesJsonSerializer, competitorJsonSerializer);
JSONObject serializedRegatta = regattaSerializer.serialize(regatta);
setJsonResponseHeader(response);
serializedRegatta.writeJSONString(response.getWriter());
}
}
}
}
@@ -7,75 +7,23 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Leg;
import com.sap.sailing.domain.base.Person;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.common.CountryCode;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.server.gateway.AbstractJsonHttpServlet;
import com.sap.sailing.server.gateway.serialization.impl.RegattaJsonSerializer;
public class RegattasJsonGetServlet extends AbstractJsonHttpServlet {
private static final long serialVersionUID = 1333207389294903999L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
JSONArray regattaList = new JSONArray();
RegattaJsonSerializer regattaJsonSerializer = new RegattaJsonSerializer();
JSONArray regattasJson = new JSONArray();
for (Regatta regatta : getService().getAllRegattas()) {
JSONObject jsonRegatta = new JSONObject();
jsonRegatta.put("name", regatta.getName());
if (regatta.getBoatClass() != null) {
jsonRegatta.put("boatclass", regatta.getBoatClass().getName());
}
JSONArray jsonCompetitors = new JSONArray();
for (Competitor competitor : regatta.getCompetitors()) {
JSONObject jsonCompetitor = new JSONObject();
jsonCompetitor.put("name", competitor.getName());
jsonCompetitor.put("sailID", competitor.getBoat()==null?"":competitor.getBoat().getSailID());
jsonCompetitor.put("nationality", competitor.getTeam().getNationality().getThreeLetterIOCAcronym());
CountryCode countryCode = competitor.getTeam().getNationality().getCountryCode();
jsonCompetitor.put("nationalityISO2", countryCode == null ? "" : countryCode.getTwoLetterISOCode());
jsonCompetitor.put("nationalityISO3", countryCode == null ? "" : countryCode.getThreeLetterISOCode());
JSONArray jsonTeam = new JSONArray();
for (Person sailor : competitor.getTeam().getSailors()) {
JSONObject jsonSailor = new JSONObject();
jsonSailor.put("name", sailor.getName());
jsonSailor.put("description", sailor.getDescription()==null?"":sailor.getDescription());
jsonTeam.add(jsonSailor);
}
jsonCompetitor.put("team", jsonTeam);
jsonCompetitors.add(jsonCompetitor);
}
jsonRegatta.put("competitors", jsonCompetitors);
JSONArray jsonRaces = new JSONArray();
for (RaceDefinition race : regatta.getAllRaces()) {
// don't wait for the arrival of a tracked race; just ignore it if it's not currently being tracked
TrackedRace trackedRace = getService().getOrCreateTrackedRegatta(regatta).getExistingTrackedRace(race);
if (trackedRace != null) {
JSONObject jsonRace = new JSONObject();
jsonRace.put("name", race.getName());
jsonRace.put("boatclass", race.getBoatClass() == null ? "" : race.getBoatClass().getName());
TimePoint start = trackedRace.getStartOfRace();
jsonRace.put("start", start == null ? Long.MAX_VALUE : start.asMillis());
JSONArray jsonLegs = new JSONArray();
for (Leg leg : race.getCourse().getLegs()) {
JSONObject jsonLeg = new JSONObject();
jsonLeg.put("start", leg.getFrom().getName());
jsonLeg.put("end", leg.getTo().getName());
jsonLegs.add(jsonLeg);
}
jsonRace.put("legs", jsonLegs);
jsonRaces.add(jsonRace);
}
}
jsonRegatta.put("races", jsonRaces);
regattaList.add(jsonRegatta);
regattasJson.add(regattaJsonSerializer.serialize(regatta));
}
setJsonResponseHeader(resp);
regattaList.writeJSONString(resp.getWriter());
regattasJson.writeJSONString(resp.getWriter());
}
}
@@ -15,7 +15,9 @@ 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.racegroup.impl.CompetitorJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.CompetitorJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.PersonJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.TeamJsonSerializer;
public class CompetitorsJsonExportServlet extends AbstractJsonHttpServlet {
private static final long serialVersionUID = 4510175441769759252L;
@@ -73,7 +75,7 @@ public class CompetitorsJsonExportServlet extends AbstractJsonHttpServlet {
JSONArray result = new JSONArray();
if (trackedRace != null) {
CompetitorJsonSerializer serializer = new CompetitorJsonSerializer();
CompetitorJsonSerializer serializer = new CompetitorJsonSerializer(new TeamJsonSerializer(new PersonJsonSerializer()));
for (Competitor competitor : raceColumn.getRaceDefinition(fleet).getCompetitors()) {
result.add(serializer.serialize(competitor));
@@ -17,9 +17,11 @@ import com.sap.sailing.server.gateway.AbstractJsonHttpServlet;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.BoatClassJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.ColorJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.CompetitorJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.CourseAreaJsonSerializer;
import com.sap.sailing.server.gateway.serialization.racegroup.impl.CompetitorJsonSerializer;
import com.sap.sailing.server.gateway.serialization.racegroup.impl.FleetJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.FleetJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.PersonJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.TeamJsonSerializer;
import com.sap.sailing.server.gateway.serialization.racegroup.impl.RaceCellJsonSerializer;
import com.sap.sailing.server.gateway.serialization.racegroup.impl.RaceGroupJsonSerializer;
import com.sap.sailing.server.gateway.serialization.racegroup.impl.RaceRowJsonSerializer;
@@ -86,7 +88,7 @@ public class RaceGroupJsonExportServlet extends AbstractJsonHttpServlet {
}
private static JsonSerializer<RaceLog> createRaceLogSerializer() {
return new RaceLogSerializer(RaceLogEventSerializer.create(new CompetitorJsonSerializer()));
return new RaceLogSerializer(RaceLogEventSerializer.create(new CompetitorJsonSerializer(new TeamJsonSerializer(new PersonJsonSerializer()))));
}
}
@@ -57,7 +57,7 @@ public class CsvParserImpl implements CsvParser {
// G-PL;SEGELNR;STEUERMANN/-FRAU/CREW;CLUB;CLUB-ID;1.Wf;1.Wf;2.Wf;2.Wf;3.Wf;3.Wf;4.Wf;4.Wf;5.Wf;5.Wf;6.Wf;6.Wf;7.Wf;7.Wf;G-PKTE;G-PL;
// 1;GER 951;Zachariassen, Gerd/Winter Hagen/Zachariassen, Cornelia;NRV/NRV/NRV;HA002/HA002/HA002;1;1,00;3;3,00;4;4,00;8;8,00;[11];[11,00];1;1,00;1;1,00;18,00;1;
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "Cp1252"));
String line = br.readLine();
int startIndexForRacePoints = -1;
int endIndexForRacePoints = -1;