mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-13 15:50:59 +00:00
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:
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 "${project_loc:com.sap.sailing.gwt.ui}" -noserver -remoteUI "${gwt_remote_ui_server_port}:${unique_id}" -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 "${project_loc:com.sap.sailing.gwt.ui}" -noserver -remoteUI "${gwt_remote_ui_server_port}:${unique_id}" -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 "${project_loc:com.sap.sailing.gwt.ui}" -noserver -remoteUI "${gwt_remote_ui_server_port}:${unique_id}" -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 "${project_loc:com.sap.sailing.gwt.ui}" -noserver -remoteUI "${gwt_remote_ui_server_port}:${unique_id}" -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>
|
||||
-28
@@ -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));
|
||||
}
|
||||
}
|
||||
+30
-5
@@ -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);
|
||||
}
|
||||
}
|
||||
-127
@@ -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
|
||||
}
|
||||
|
||||
}
|
||||
+24
-3
@@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
+3
-9
@@ -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;
|
||||
|
||||
+3
-25
@@ -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);
|
||||
|
||||
|
||||
+56
-58
@@ -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);
|
||||
|
||||
+8
-8
@@ -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
|
||||
|
||||
+30
-21
@@ -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
|
||||
|
||||
+5
-5
@@ -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);
|
||||
}
|
||||
|
||||
Executable
+37
@@ -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;
|
||||
}
|
||||
}
|
||||
Executable
+61
@@ -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
-7
@@ -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;
|
||||
}
|
||||
|
||||
+11
-3
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
-1
@@ -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;
|
||||
}
|
||||
+7
-7
@@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
+4
-2
@@ -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,
|
||||
|
||||
+1
-1
@@ -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> {
|
||||
|
||||
|
||||
+2
-3
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
+2
-2
@@ -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());
|
||||
|
||||
+46
@@ -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;
|
||||
}
|
||||
}
|
||||
-1
@@ -19,5 +19,4 @@ public class CourseAreaJsonSerializer implements JsonSerializer<CourseArea> {
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
+7
-7
@@ -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
-1
@@ -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;
|
||||
|
||||
+21
@@ -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;
|
||||
}
|
||||
}
|
||||
+56
@@ -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;
|
||||
}
|
||||
}
|
||||
+41
@@ -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;
|
||||
}
|
||||
}
|
||||
+33
@@ -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;
|
||||
}
|
||||
}
|
||||
+21
@@ -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;
|
||||
}
|
||||
}
|
||||
+4
-7
@@ -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);
|
||||
|
||||
-20
@@ -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>
|
||||
|
||||
+2
-3
@@ -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");
|
||||
}
|
||||
}
|
||||
+49
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+6
-58
@@ -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());
|
||||
}
|
||||
}
|
||||
+4
-2
@@ -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));
|
||||
|
||||
+5
-3
@@ -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()))));
|
||||
}
|
||||
|
||||
}
|
||||
+1
-1
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user