Merge branch 'race-identifiers' into gwt

This commit is contained in:
Axel Uhl committed 2011-12-01 12:43:42 +01:00
commit bfa7204edc
18 files changed
+444 -281

No files matched your search

@@ -1,22 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="com.google.gwt.eclipse.core.launch.gwtJUnit">
<stringAttribute key="com.google.gwt.eclipse.core.LOG_LEVEL" value="INFO"/>
<booleanAttribute key="com.google.gwt.eclipse.core.NOT_HEADLESS" value="false"/>
<stringAttribute key="com.google.gwt.eclipse.core.OUT_DIR" value="www-test"/>
<booleanAttribute key="com.google.gwt.eclipse.core.STANDARDS_MODE" value="false"/>
<stringAttribute key="com.google.gwt.eclipse.core.STYLE" value="OBFUSCATED"/>
<stringAttribute key="com.google.gwt.eclipse.core.WEB_MODE" value="false"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/GwtTestCaseColumnToggling.java"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="1"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/>
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="com.google.gwt.eclipse.core.moduleClasspathProvider"/>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.sap.sailing.gwt.ui.test.GwtTestCaseColumnToggling"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sailing.gwt.ui.test"/>
</launchConfiguration>
@@ -10,6 +10,7 @@ import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.sap.sailing.gwt.ui.client.ExpandableSortableColumn;
import com.sap.sailing.gwt.ui.client.StringConstants;
import com.sap.sailing.gwt.ui.shared.EventNameAndRaceName;
import com.sap.sailing.gwt.ui.shared.LeaderboardDAO;
import com.sap.sailing.gwt.ui.shared.LeaderboardRowDAO;
import com.sap.sailing.gwt.ui.shared.Pair;
@@ -133,8 +134,8 @@ public class GwtTestCaseColumnToggling extends GWTTestCase {
}
private void linkTrackedRace(){
service.connectTrackedRaceToLeaderboardColumn(LEADERBOARD_NAME, COLUMN1_NAME, EVENT_NAME, TRACKED_RACE, new AsyncCallback<Void>() {
service.connectTrackedRaceToLeaderboardColumn(LEADERBOARD_NAME, COLUMN1_NAME, new EventNameAndRaceName(EVENT_NAME, TRACKED_RACE),
new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
fail("Failed to link race.");
@@ -23,6 +23,7 @@ import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.sap.sailing.gwt.ui.client.DataEntryDialog.Validator;
import com.sap.sailing.gwt.ui.shared.EventDAO;
import com.sap.sailing.gwt.ui.shared.EventNameAndRaceName;
import com.sap.sailing.gwt.ui.shared.LeaderboardDAO;
import com.sap.sailing.gwt.ui.shared.Pair;
import com.sap.sailing.gwt.ui.shared.RaceDAO;
@@ -747,7 +748,7 @@ public class LeaderboardConfigPanel extends FormPanel implements EventDisplayer,
private void linkTrackedRaceForRaceColumn(final Triple<EventDAO, RegattaDAO, RaceDAO> selectedRace) {
sailingService.connectTrackedRaceToLeaderboardColumn(getSelectedLeaderboardName(), getSelectedRaceColumnName(),
selectedRace.getA().name, selectedRace.getC().name, new AsyncCallback<Void>() {
new EventNameAndRaceName(selectedRace.getA().name, selectedRace.getC().name), new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable t) {
errorReporter.reportError("Error trying to link tracked race " + selectedRace.getC().name
@@ -53,6 +53,7 @@ import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.gwt.ui.shared.CompetitorDAO;
import com.sap.sailing.gwt.ui.shared.EventDAO;
import com.sap.sailing.gwt.ui.shared.EventNameAndRaceName;
import com.sap.sailing.gwt.ui.shared.GPSFixDAO;
import com.sap.sailing.gwt.ui.shared.ManeuverDAO;
import com.sap.sailing.gwt.ui.shared.MarkDAO;
@@ -367,7 +368,7 @@ public class RaceMapPanel extends FormPanel implements EventDisplayer, TimeListe
RaceDAO race = selection.get(selection.size() - 1).getC();
if (event != null && race != null) {
final Triple<Map<CompetitorDAO, Date>, Map<CompetitorDAO, Date>, Map<CompetitorDAO, Boolean>> fromAndToAndOverlap = computeFromAndTo(date);
sailingService.getBoatPositions(event.name, race.name, fromAndToAndOverlap.getA(),
sailingService.getBoatPositions(new EventNameAndRaceName(event.name, race.name), fromAndToAndOverlap.getA(),
fromAndToAndOverlap.getB(), true, new AsyncCallback<Map<CompetitorDAO, List<GPSFixDAO>>>() {
@Override
public void onFailure(Throwable caught) {
@@ -387,7 +388,7 @@ public class RaceMapPanel extends FormPanel implements EventDisplayer, TimeListe
}
}
});
sailingService.getMarkPositions(event.name, race.name, date, new AsyncCallback<List<MarkDAO>>() {
sailingService.getMarkPositions(new EventNameAndRaceName(event.name, race.name), date, new AsyncCallback<List<MarkDAO>>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error trying to obtain mark positions: " + caught.getMessage());
@@ -398,7 +399,7 @@ public class RaceMapPanel extends FormPanel implements EventDisplayer, TimeListe
showMarksOnMap(result);
}
});
sailingService.getQuickRanks(event.name, race.name, date, new AsyncCallback<List<QuickRankDAO>>() {
sailingService.getQuickRanks(new EventNameAndRaceName(event.name, race.name), date, new AsyncCallback<List<QuickRankDAO>>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error obtaining quick rankings: " + caught.getMessage());
@@ -832,7 +833,7 @@ public class RaceMapPanel extends FormPanel implements EventDisplayer, TimeListe
}
});
*/
sailingService.getManeuvers(event.name, race.name, from, to,
sailingService.getManeuvers(new EventNameAndRaceName(event.name, race.name), from, to,
new AsyncCallback<Map<CompetitorDAO, List<ManeuverDAO>>>() {
@Override
public void onFailure(Throwable caught) {
@@ -8,7 +8,9 @@ import java.util.Map;
import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
import com.sap.sailing.gwt.ui.shared.CompetitorDAO;
import com.sap.sailing.gwt.ui.shared.EventAndRaceIdentifier;
import com.sap.sailing.gwt.ui.shared.EventDAO;
import com.sap.sailing.gwt.ui.shared.EventIdentifier;
import com.sap.sailing.gwt.ui.shared.GPSFixDAO;
import com.sap.sailing.gwt.ui.shared.LeaderboardDAO;
import com.sap.sailing.gwt.ui.shared.LeaderboardEntryDAO;
@@ -16,6 +18,7 @@ import com.sap.sailing.gwt.ui.shared.ManeuverDAO;
import com.sap.sailing.gwt.ui.shared.MarkDAO;
import com.sap.sailing.gwt.ui.shared.Pair;
import com.sap.sailing.gwt.ui.shared.QuickRankDAO;
import com.sap.sailing.gwt.ui.shared.RaceIdentifier;
import com.sap.sailing.gwt.ui.shared.SwissTimingConfigurationDAO;
import com.sap.sailing.gwt.ui.shared.SwissTimingRaceRecordDAO;
import com.sap.sailing.gwt.ui.shared.TracTracConfigurationDAO;
@@ -39,28 +42,28 @@ public interface SailingService extends RemoteService {
void storeTracTracConfiguration(String name, String jsonURL, String liveDataURI, String storedDataURI) throws Exception;
void stopTrackingEvent(String eventName) throws Exception;
void stopTrackingEvent(EventIdentifier eventIdentifier) throws Exception;
void stopTrackingRace(String eventName, String raceName) throws Exception;
void stopTrackingRace(EventAndRaceIdentifier eventAndRaceIdentifier) throws Exception;
WindInfoForRaceDAO getWindInfo(String eventName, String raceName, Date from, Date to,
WindInfoForRaceDAO getWindInfo(RaceIdentifier raceIdentifier, Date from, Date to,
boolean includeTrackBasedWindEstimation);
void setWind(String eventName, String raceName, WindDAO wind);
void setWind(RaceIdentifier raceIdentifier, WindDAO wind);
Map<CompetitorDAO, List<GPSFixDAO>> getBoatPositions(String eventName, String raceName,
Map<CompetitorDAO, Date> from, Map<CompetitorDAO, Date> to, boolean extrapolate);
Map<CompetitorDAO, List<GPSFixDAO>> getBoatPositions(RaceIdentifier raceIdentifier, Map<CompetitorDAO, Date> from,
Map<CompetitorDAO, Date> to, boolean extrapolate);
List<MarkDAO> getMarkPositions(String eventName, String raceName, Date date);
List<MarkDAO> getMarkPositions(RaceIdentifier raceIdentifier, Date date);
List<QuickRankDAO> getQuickRanks(String eventName, String raceName, Date date) throws Exception;
List<QuickRankDAO> getQuickRanks(RaceIdentifier raceIdentifier, Date date) throws Exception;
WindInfoForRaceDAO getWindInfo(String eventName, String raceName, Date from, long millisecondsStepWidth,
WindInfoForRaceDAO getWindInfo(RaceIdentifier raceIdentifier, Date from, long millisecondsStepWidth,
int numberOfFixes, double latDeg, double lngDeg, boolean includeTrackBasedWindEstimation) throws Exception;
void setWindSource(String eventName, String raceName, String windSourceName);
void setWindSource(RaceIdentifier raceIdentifier, String windSourceName);
void removeWind(String eventName, String raceName, WindDAO windDAO);
void removeWind(RaceIdentifier raceIdentifier, WindDAO windDAO);
public List<String> getLeaderboardNames() throws Exception;
@@ -84,7 +87,7 @@ public interface SailingService extends RemoteService {
void moveLeaderboardColumnDown(String leaderboardName, String columnName);
void connectTrackedRaceToLeaderboardColumn(String leaderboardName, String raceColumnName,
String eventName, String raceName);
RaceIdentifier raceIdentifier);
void disconnectLeaderboardColumnFromTrackedRace(String leaderboardName, String raceColumnName);
@@ -122,9 +125,9 @@ public interface SailingService extends RemoteService {
String[] getCountryCodes();
Map<CompetitorDAO, List<GPSFixDAO>> getDouglasPoints(String eventName, String raceName,
Map<CompetitorDAO, List<GPSFixDAO>> getDouglasPoints(RaceIdentifier raceIdentifier,
Map<CompetitorDAO, Date> from, Map<CompetitorDAO, Date> to, double meters);
Map<CompetitorDAO, List<ManeuverDAO>> getManeuvers(String eventName, String raceName,
Map<CompetitorDAO, List<ManeuverDAO>> getManeuvers(RaceIdentifier raceIdentifier,
Map<CompetitorDAO, Date> from, Map<CompetitorDAO, Date> to) throws Exception;
}
@@ -8,8 +8,8 @@ import java.util.Map;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.sap.sailing.domain.base.Course;
import com.sap.sailing.domain.leaderboard.RaceInLeaderboard;
import com.sap.sailing.domain.tracking.WindSource;
import com.sap.sailing.gwt.ui.shared.CompetitorDAO;
import com.sap.sailing.gwt.ui.shared.EventAndRaceIdentifier;
import com.sap.sailing.gwt.ui.shared.EventDAO;
import com.sap.sailing.gwt.ui.shared.GPSFixDAO;
import com.sap.sailing.gwt.ui.shared.LeaderboardDAO;
@@ -18,6 +18,8 @@ import com.sap.sailing.gwt.ui.shared.ManeuverDAO;
import com.sap.sailing.gwt.ui.shared.MarkDAO;
import com.sap.sailing.gwt.ui.shared.Pair;
import com.sap.sailing.gwt.ui.shared.QuickRankDAO;
import com.sap.sailing.gwt.ui.shared.EventIdentifier;
import com.sap.sailing.gwt.ui.shared.RaceIdentifier;
import com.sap.sailing.gwt.ui.shared.SwissTimingConfigurationDAO;
import com.sap.sailing.gwt.ui.shared.SwissTimingRaceRecordDAO;
import com.sap.sailing.gwt.ui.shared.TracTracConfigurationDAO;
@@ -50,36 +52,20 @@ public interface SailingServiceAsync {
void storeTracTracConfiguration(String name, String jsonURL, String liveDataURI, String storedDataURI,
AsyncCallback<Void> callback);
void stopTrackingEvent(String eventName, AsyncCallback<Void> callback);
void stopTrackingEvent(EventIdentifier eventIdentifier, AsyncCallback<Void> callback);
void stopTrackingRace(String eventName, String raceName, AsyncCallback<Void> asyncCallback);
void stopTrackingRace(EventAndRaceIdentifier raceIdentifier, AsyncCallback<Void> asyncCallback);
/**
* Obtains wind data for an event/race based on the wind data as recorded in the currently
* selected wind track for the race, with raw and dampened numbers, for the time stamps as
* provided by the recording. The interval for which to retrieve wind data must be specified
* using <code>from</code> and <code>to</code>.
*
* @param includeTrackBasedWindEstimation if <code>true</code>, for each time point for which an
* {@link WindSource#EXPEDITION} estimation exists for the event/race requested, a wind estimation
* based on the GPS tracks will be performed and included in the result. In this case, the
* result will contain a so far non-existing wind source name "ESTIMATION".
*/
void getWindInfo(String eventName, String raceName, Date from, Date to,
boolean includeTrackBasedWindEstimation, AsyncCallback<WindInfoForRaceDAO> callback);
void getWindInfo(RaceIdentifier raceIdentifier, Date from, Date to, boolean includeTrackBasedWindEstimation,
AsyncCallback<WindInfoForRaceDAO> callback);
/**
* Obtains wind information starting at <code>from</code> and stepping in intervals as specified by
* <code>millisecondsStepWidth</code>, delivering <code>numberOfFixes</code> fixes. Those don't have to
* correspond exactly with when wind measurements were taken; instead, the selected race's selected wind
* source is interpolated to estimate the wind for the time/position requested.
*/
void getWindInfo(String eventName, String raceName, Date from, long millisecondsStepWidth, int numberOfFixes,
double latDeg, double lngDeg, boolean includeTrackBasedWindEstimation, AsyncCallback<WindInfoForRaceDAO> callback);
void getWindInfo(RaceIdentifier raceIdentifier, Date from, long millisecondsStepWidth, int numberOfFixes,
double latDeg, double lngDeg, boolean includeTrackBasedWindEstimation,
AsyncCallback<WindInfoForRaceDAO> callback);
void setWind(String eventName, String raceName, WindDAO wind, AsyncCallback<Void> callback);
void setWind(RaceIdentifier raceIdentifier, WindDAO wind, AsyncCallback<Void> callback);
void removeWind(String eventName, String raceName, WindDAO wind, AsyncCallback<Void> callback);
void removeWind(RaceIdentifier raceIdentifier, WindDAO windDAO, AsyncCallback<Void> callback);
/**
* @param from
@@ -96,15 +82,15 @@ public interface SailingServiceAsync {
* @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(String eventName, String raceName,
void getBoatPositions(RaceIdentifier raceIdentifier,
Map<CompetitorDAO, Date> from, Map<CompetitorDAO, Date> to,
boolean extrapolate, AsyncCallback<Map<CompetitorDAO, List<GPSFixDAO>>> callback);
void getMarkPositions(String eventName, String raceName, Date date, AsyncCallback<List<MarkDAO>> asyncCallback);
void getMarkPositions(RaceIdentifier raceIdentifier, Date date, AsyncCallback<List<MarkDAO>> asyncCallback);
void getQuickRanks(String eventName, String raceName, Date date, AsyncCallback<List<QuickRankDAO>> callback);
void getQuickRanks(RaceIdentifier raceIdentifier, Date date, AsyncCallback<List<QuickRankDAO>> callback);
void setWindSource(String eventName, String raceName, String windSourceName, AsyncCallback<Void> callback);
void setWindSource(RaceIdentifier raceIdentifier, String windSourceName, AsyncCallback<Void> callback);
/**
* @param namesOfRacesForWhichToLoadLegDetails
@@ -133,8 +119,8 @@ public interface SailingServiceAsync {
void removeLeaderboardColumn(String leaderboardName, String columnName, AsyncCallback<Void> callback);
void connectTrackedRaceToLeaderboardColumn(String selectedLeaderboardName, String selectedRaceColumnName,
String name, String name2, AsyncCallback<Void> asyncCallback);
void connectTrackedRaceToLeaderboardColumn(String leaderboardName, String raceColumnName,
RaceIdentifier raceIdentifier, AsyncCallback<Void> asyncCallback);
void getEventAndRaceNameOfTrackedRaceConnectedToLeaderboardColumn(String leaderboardName, String raceColumnName,
AsyncCallback<Pair<String, String>> callback);
@@ -185,17 +171,9 @@ public interface SailingServiceAsync {
void getCountryCodes(AsyncCallback<String[]> callback);
/**
* Approximates pieces of GPS tracks using a Douglas-Peucker algorithm and returns the approximation as a
* sequence of {@link GPSFixDAO}s for each competitors for which approximation was requested.
*/
void getDouglasPoints(String eventName, String raceName, Map<CompetitorDAO, Date> from,
Map<CompetitorDAO, Date> to, double meters, AsyncCallback<Map<CompetitorDAO, List<GPSFixDAO>>> callback);
void getDouglasPoints(RaceIdentifier raceIdentifier, Map<CompetitorDAO, Date> from, Map<CompetitorDAO, Date> to,
double meters, AsyncCallback<Map<CompetitorDAO, List<GPSFixDAO>>> callback);
/**
* Approximates pieces of GPS tracks using a Douglas-Peucker algorithm and returns the approximation as a
* sequence of {@link GPSFixDAO}s for each competitors for which approximation was requested.
*/
void getManeuvers(String eventName, String raceName, Map<CompetitorDAO, Date> from,
Map<CompetitorDAO, Date> to, AsyncCallback<Map<CompetitorDAO, List<ManeuverDAO>>> callback);
void getManeuvers(RaceIdentifier raceIdentifier, Map<CompetitorDAO, Date> from, Map<CompetitorDAO, Date> to,
AsyncCallback<Map<CompetitorDAO, List<ManeuverDAO>>> callback);
}
@@ -9,6 +9,7 @@ import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.sap.sailing.gwt.ui.shared.EventDAO;
import com.sap.sailing.gwt.ui.shared.EventNameAndRaceName;
import com.sap.sailing.gwt.ui.shared.PositionDAO;
import com.sap.sailing.gwt.ui.shared.RaceDAO;
import com.sap.sailing.gwt.ui.shared.RegattaDAO;
@@ -68,7 +69,7 @@ public class SmallWindHistoryPanel extends FormPanel implements TimeListener, Ra
if (date != null) {
Date from = new Date(date.getTime() - windIndicators.length * millisecondStepsPerLabel);
if (event != null && race != null) {
sailingService.getWindInfo(event.name, race.name, from, millisecondStepsPerLabel,
sailingService.getWindInfo(new EventNameAndRaceName(event.name, race.name), from, millisecondStepsPerLabel,
windIndicators.length, position.latDeg, position.lngDeg, /* includeTrackBasedWindEstimation */ true,
new AsyncCallback<WindInfoForRaceDAO>() {
@Override
@@ -26,6 +26,7 @@ import com.google.gwt.view.client.SelectionChangeEvent.Handler;
import com.google.gwt.view.client.SelectionModel;
import com.google.gwt.view.client.SingleSelectionModel;
import com.sap.sailing.gwt.ui.shared.EventDAO;
import com.sap.sailing.gwt.ui.shared.EventNameAndRaceName;
import com.sap.sailing.gwt.ui.shared.RaceDAO;
import com.sap.sailing.gwt.ui.shared.RegattaDAO;
import com.sap.sailing.gwt.ui.shared.Triple;
@@ -257,7 +258,7 @@ public class TrackedEventsComposite extends FormPanel implements EventDisplayer,
}
private void stopTrackingRace(final EventDAO event, final RaceDAO race) {
sailingService.stopTrackingRace(event.name, race.name, new AsyncCallback<Void>() {
sailingService.stopTrackingRace(new EventNameAndRaceName(event.name, race.name), new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Exception trying to stop tracking race " + race.name + "in event "+event.name+": "
@@ -37,6 +37,7 @@ import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.view.client.ListDataProvider;
import com.sap.sailing.gwt.ui.shared.EventDAO;
import com.sap.sailing.gwt.ui.shared.EventNameAndRaceName;
import com.sap.sailing.gwt.ui.shared.RaceDAO;
import com.sap.sailing.gwt.ui.shared.RegattaDAO;
import com.sap.sailing.gwt.ui.shared.Triple;
@@ -84,7 +85,7 @@ public class WindPanel extends FormPanel implements EventDisplayer, RaceSelectio
public void execute(final WindDAO wind) {
List<Triple<EventDAO, RegattaDAO, RaceDAO>> eventAndRaces = getSelectedEventAndRace();
final Triple<EventDAO, RegattaDAO, RaceDAO> eventAndRace = eventAndRaces.get(eventAndRaces.size()-1);
sailingService.removeWind(eventAndRace.getA().name, eventAndRace.getC().name, wind, new AsyncCallback<Void>() {
sailingService.removeWind(new EventNameAndRaceName(eventAndRace.getA().name, eventAndRace.getC().name), wind, new AsyncCallback<Void>() {
@Override
public void onSuccess(Void result) {
// remove row from underlying list:
@@ -183,7 +184,7 @@ public class WindPanel extends FormPanel implements EventDisplayer, RaceSelectio
@Override
public void showWind(final EventDAO event, final RaceDAO race) {
Date now = new Date();
sailingService.getWindInfo(event.name, race.name,
sailingService.getWindInfo(new EventNameAndRaceName(event.name, race.name),
// TODO what about the time interval?
new Date(now.getTime()-60000 /* one minute */), new Date(/* toAsMilliseconds */),
showEstimatedWindBox.getValue(), new AsyncCallback<WindInfoForRaceDAO>() {
@@ -349,7 +350,7 @@ public class WindPanel extends FormPanel implements EventDisplayer, RaceSelectio
if (selection != null && !selection.isEmpty()) {
final Triple<EventDAO, RegattaDAO, RaceDAO> selectedRace = selection.get(0);
final String windSourceName = windSourceSelection.getItemText(windSourceSelection.getSelectedIndex());
sailingService.setWindSource(selectedRace.getA().name, selectedRace.getC().name,
sailingService.setWindSource(new EventNameAndRaceName(selectedRace.getA().name, selectedRace.getC().name),
windSourceName, new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
@@ -11,6 +11,7 @@ import com.google.gwt.user.client.ui.FormPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
import com.sap.sailing.gwt.ui.shared.EventDAO;
import com.sap.sailing.gwt.ui.shared.EventNameAndRaceName;
import com.sap.sailing.gwt.ui.shared.PositionDAO;
import com.sap.sailing.gwt.ui.shared.RaceDAO;
import com.sap.sailing.gwt.ui.shared.RegattaDAO;
@@ -53,7 +54,7 @@ public class WindSettingPanel extends FormPanel {
List<Triple<EventDAO, RegattaDAO, RaceDAO>> eventAndRaces = raceSelectionProvider.getSelectedEventAndRace();
// TODO can we be sure of single selection?
final Triple<EventDAO, RegattaDAO, RaceDAO> eventAndRace = eventAndRaces.get(eventAndRaces.size()-1);
sailingService.setWind(eventAndRace.getA().name, eventAndRace.getC().name, wind, new AsyncCallback<Void>() {
sailingService.setWind(new EventNameAndRaceName(eventAndRace.getA().name, eventAndRace.getC().name), wind, new AsyncCallback<Void>() {
@Override
public void onSuccess(Void result) {
windShower.showWind(eventAndRace.getA(), eventAndRace.getC());
@@ -55,6 +55,7 @@ import com.sap.sailing.domain.persistence.MongoWindStoreFactory;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingConfiguration;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingFactory;
import com.sap.sailing.domain.swisstimingadapter.persistence.SwissTimingAdapterPersistence;
import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.domain.tracking.GPSFix;
import com.sap.sailing.domain.tracking.GPSFixMoving;
import com.sap.sailing.domain.tracking.GPSFixTrack;
@@ -74,10 +75,15 @@ import com.sap.sailing.domain.tractracadapter.TracTracConfiguration;
import com.sap.sailing.gwt.ui.client.SailingService;
import com.sap.sailing.gwt.ui.shared.BoatClassDAO;
import com.sap.sailing.gwt.ui.shared.CompetitorDAO;
import com.sap.sailing.gwt.ui.shared.EventAndRaceIdentifier;
import com.sap.sailing.gwt.ui.shared.EventDAO;
import com.sap.sailing.gwt.ui.shared.EventFetcher;
import com.sap.sailing.gwt.ui.shared.EventIdentifier;
import com.sap.sailing.gwt.ui.shared.EventNameAndRaceName;
import com.sap.sailing.gwt.ui.shared.GPSFixDAO;
import com.sap.sailing.gwt.ui.shared.LeaderboardDAO;
import com.sap.sailing.gwt.ui.shared.LeaderboardEntryDAO;
import com.sap.sailing.gwt.ui.shared.LeaderboardNameAndRaceColumnName;
import com.sap.sailing.gwt.ui.shared.LeaderboardRowDAO;
import com.sap.sailing.gwt.ui.shared.LegEntryDAO;
import com.sap.sailing.gwt.ui.shared.ManeuverDAO;
@@ -86,6 +92,8 @@ import com.sap.sailing.gwt.ui.shared.Pair;
import com.sap.sailing.gwt.ui.shared.PositionDAO;
import com.sap.sailing.gwt.ui.shared.QuickRankDAO;
import com.sap.sailing.gwt.ui.shared.RaceDAO;
import com.sap.sailing.gwt.ui.shared.RaceFetcher;
import com.sap.sailing.gwt.ui.shared.RaceIdentifier;
import com.sap.sailing.gwt.ui.shared.RegattaDAO;
import com.sap.sailing.gwt.ui.shared.SpeedWithBearingDAO;
import com.sap.sailing.gwt.ui.shared.SwissTimingConfigurationDAO;
@@ -101,7 +109,7 @@ import com.sap.sailing.util.CountryCode;
/**
* The server side implementation of the RPC service.
*/
public class SailingServiceImpl extends RemoteServiceServlet implements SailingService {
public class SailingServiceImpl extends RemoteServiceServlet implements SailingService, RaceFetcher, EventFetcher {
private static final Logger logger = Logger.getLogger(SailingServiceImpl.class.getName());
private static final long serialVersionUID = 9031688830194537489L;
@@ -423,8 +431,11 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
}
@Override
public void stopTrackingEvent(String eventName) throws Exception {
getService().stopTracking(getService().getEventByName(eventName));
public void stopTrackingEvent(EventIdentifier eventIdentifier) throws Exception {
Event event = getEvent(eventIdentifier);
if (event != null) {
getService().stopTracking(event);
}
}
private RaceDefinition getRaceByName(Event event, String raceName) {
@@ -439,11 +450,13 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
}
@Override
public void stopTrackingRace(String eventName, String raceName) throws Exception {
Event event = getService().getEventByName(eventName);
RaceDefinition r = getRaceByName(event, raceName);
if (r != null) {
getService().stopTracking(event, r);
public void stopTrackingRace(EventAndRaceIdentifier eventAndRaceIdentifier) throws Exception {
Event event = getEvent(eventAndRaceIdentifier);
if (event != null) {
RaceDefinition r = getRace(eventAndRaceIdentifier);
if (r != null) {
getService().stopTracking(event, r);
}
}
}
@@ -465,21 +478,10 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
}
}
private TrackedRace getTrackedRace(String eventName, String raceName) {
TrackedRace result = null;
Event event = getService().getEventByName(eventName);
if (event != null) {
RaceDefinition race = getRaceByName(event, raceName);
if (race != null) {
result = getService().getOrCreateTrackedEvent(event).getExistingTrackedRace(race);
}
}
return result;
}
@Override
public WindInfoForRaceDAO getWindInfo(String eventName, String raceName, Date fromDate, Date toDate, boolean includeTrackBasedWindEstimation) {
public WindInfoForRaceDAO getWindInfo(RaceIdentifier raceIdentifier, Date fromDate, Date toDate, boolean includeTrackBasedWindEstimation) {
WindInfoForRaceDAO result = null;
TrackedRace trackedRace = getTrackedRace(eventName, raceName);
TrackedRace trackedRace = getTrackedRace(raceIdentifier);
if (trackedRace != null) {
MillisecondsTimePoint now = MillisecondsTimePoint.now();
result = new WindInfoForRaceDAO();
@@ -580,121 +582,108 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
}
@Override
public WindInfoForRaceDAO getWindInfo(String eventName, String raceName, Date from, long millisecondsStepWidth,
public WindInfoForRaceDAO getWindInfo(RaceIdentifier raceIdentifier, Date from, long millisecondsStepWidth,
int numberOfFixes, double latDeg, double lngDeg, boolean includeTrackBasedWindEstimation)
throws NoWindException {
Position position = new DegreePosition(latDeg, lngDeg);
WindInfoForRaceDAO result = null;
Event event = getService().getEventByName(eventName);
if (event != null) {
RaceDefinition race = getRaceByName(event, raceName);
if (race != null) {
TrackedRace trackedRace = getService().getOrCreateTrackedEvent(event)
.getExistingTrackedRace(race);
if (trackedRace != null) {
WindTrack estimatedTrack = null;
result = new WindInfoForRaceDAO();
WindSource windSource = trackedRace.getWindSource();
result.selectedWindSourceName = windSource.name();
TimePoint fromTimePoint = new MillisecondsTimePoint(from);
Map<String, WindTrackInfoDAO> windTrackInfoDAOs = new HashMap<String, WindTrackInfoDAO>();
result.windTrackInfoByWindSourceName = windTrackInfoDAOs;
WindTrackInfoDAO windTrackInfoDAO = new WindTrackInfoDAO();
windTrackInfoDAO.windFixes = new ArrayList<WindDAO>();
WindTrack windTrack = trackedRace.getWindTrack(windSource);
if (includeTrackBasedWindEstimation && windSource == WindSource.EXPEDITION) {
estimatedTrack = new WindTrackImpl(windTrack.getMillisecondsOverWhichToAverageWind());
}
windTrackInfoDAOs.put(windSource.name(), windTrackInfoDAO);
windTrackInfoDAO.dampeningIntervalInMilliseconds = windTrack
.getMillisecondsOverWhichToAverageWind();
TimePoint timePoint = fromTimePoint;
for (int i=0; i<numberOfFixes; i++) {
Wind wind = windTrack.getEstimatedWind(position, timePoint);
if (wind != null) {
WindDAO windDAO = createWindDAO(wind, windTrack);
windTrackInfoDAO.windFixes.add(windDAO);
}
if (includeTrackBasedWindEstimation && windSource == WindSource.EXPEDITION && wind != null) {
try {
Wind estimatedWindDirection = trackedRace.getEstimatedWindDirection(wind.getPosition(),
wind.getTimePoint());
estimatedTrack.add(estimatedWindDirection);
} catch (NoWindException e) {
// no show-stopper; it would just mean that the wind estimation isn't complete which we
// can tolerate
e.printStackTrace();
}
}
timePoint = new MillisecondsTimePoint(timePoint.asMillis() + millisecondsStepWidth);
}
if (includeTrackBasedWindEstimation && estimatedTrack != null) {
WindTrackInfoDAO windEstimations = createWindTrackInfoDAO(estimatedTrack);
windTrackInfoDAOs.put("ESTIMATION", windEstimations);
TrackedRace trackedRace = getExistingTrackedRace(raceIdentifier);
if (trackedRace != null) {
WindTrack estimatedTrack = null;
result = new WindInfoForRaceDAO();
WindSource windSource = trackedRace.getWindSource();
result.selectedWindSourceName = windSource.name();
TimePoint fromTimePoint = new MillisecondsTimePoint(from);
Map<String, WindTrackInfoDAO> windTrackInfoDAOs = new HashMap<String, WindTrackInfoDAO>();
result.windTrackInfoByWindSourceName = windTrackInfoDAOs;
WindTrackInfoDAO windTrackInfoDAO = new WindTrackInfoDAO();
windTrackInfoDAO.windFixes = new ArrayList<WindDAO>();
WindTrack windTrack = trackedRace.getWindTrack(windSource);
if (includeTrackBasedWindEstimation && windSource == WindSource.EXPEDITION) {
estimatedTrack = new WindTrackImpl(windTrack.getMillisecondsOverWhichToAverageWind());
}
windTrackInfoDAOs.put(windSource.name(), windTrackInfoDAO);
windTrackInfoDAO.dampeningIntervalInMilliseconds = windTrack.getMillisecondsOverWhichToAverageWind();
TimePoint timePoint = fromTimePoint;
for (int i = 0; i < numberOfFixes; i++) {
Wind wind = windTrack.getEstimatedWind(position, timePoint);
if (wind != null) {
WindDAO windDAO = createWindDAO(wind, windTrack);
windTrackInfoDAO.windFixes.add(windDAO);
}
if (includeTrackBasedWindEstimation && windSource == WindSource.EXPEDITION && wind != null) {
try {
Wind estimatedWindDirection = trackedRace.getEstimatedWindDirection(wind.getPosition(),
wind.getTimePoint());
estimatedTrack.add(estimatedWindDirection);
} catch (NoWindException e) {
// no show-stopper; it would just mean that the wind estimation isn't complete which we
// can tolerate
e.printStackTrace();
}
}
timePoint = new MillisecondsTimePoint(timePoint.asMillis() + millisecondsStepWidth);
}
if (includeTrackBasedWindEstimation && estimatedTrack != null) {
WindTrackInfoDAO windEstimations = createWindTrackInfoDAO(estimatedTrack);
windTrackInfoDAOs.put("ESTIMATION", windEstimations);
}
}
return result;
}
@Override
public void setWind(String eventName, String raceName, WindDAO windDAO) {
Event event = getService().getEventByName(eventName);
RaceDefinition race = getRaceByName(event, raceName);
Position p = null;
if (windDAO.position != null) {
p = new DegreePosition(windDAO.position.latDeg, windDAO.position.lngDeg);
}
TimePoint at = null;
if (windDAO.timepoint != null) {
at = new MillisecondsTimePoint(windDAO.timepoint);
}
SpeedWithBearing speedWithBearing = null;
Speed speed = null;
if (windDAO.trueWindSpeedInKnots != null) {
speed = new KnotSpeedImpl(windDAO.trueWindSpeedInKnots);
} else if (windDAO.trueWindSpeedInMetersPerSecond != null) {
speed = new KilometersPerHourSpeedImpl(windDAO.trueWindSpeedInMetersPerSecond * 3600. / 1000.);
} else if (windDAO.dampenedTrueWindSpeedInKnots != null) {
speed = new KnotSpeedImpl(windDAO.dampenedTrueWindSpeedInKnots);
} else if (windDAO.dampenedTrueWindSpeedInMetersPerSecond != null) {
speed = new KilometersPerHourSpeedImpl(windDAO.dampenedTrueWindSpeedInMetersPerSecond * 3600. / 1000.);
}
if (speed != null) {
if (windDAO.trueWindBearingDeg != null) {
speedWithBearing = new KnotSpeedWithBearingImpl(speed.getKnots(), new DegreeBearingImpl(windDAO.trueWindBearingDeg));
} else if (windDAO.trueWindFromDeg != null) {
speedWithBearing = new KnotSpeedWithBearingImpl(speed.getKnots(), new DegreeBearingImpl(windDAO.trueWindFromDeg).reverse());
public void setWind(RaceIdentifier raceIdentifier, WindDAO windDAO) {
DynamicTrackedRace trackedRace = (DynamicTrackedRace) getTrackedRace(raceIdentifier);
if (trackedRace != null) {
Position p = null;
if (windDAO.position != null) {
p = new DegreePosition(windDAO.position.latDeg, windDAO.position.lngDeg);
}
TimePoint at = null;
if (windDAO.timepoint != null) {
at = new MillisecondsTimePoint(windDAO.timepoint);
}
SpeedWithBearing speedWithBearing = null;
Speed speed = null;
if (windDAO.trueWindSpeedInKnots != null) {
speed = new KnotSpeedImpl(windDAO.trueWindSpeedInKnots);
} else if (windDAO.trueWindSpeedInMetersPerSecond != null) {
speed = new KilometersPerHourSpeedImpl(windDAO.trueWindSpeedInMetersPerSecond * 3600. / 1000.);
} else if (windDAO.dampenedTrueWindSpeedInKnots != null) {
speed = new KnotSpeedImpl(windDAO.dampenedTrueWindSpeedInKnots);
} else if (windDAO.dampenedTrueWindSpeedInMetersPerSecond != null) {
speed = new KilometersPerHourSpeedImpl(windDAO.dampenedTrueWindSpeedInMetersPerSecond * 3600. / 1000.);
}
if (speed != null) {
if (windDAO.trueWindBearingDeg != null) {
speedWithBearing = new KnotSpeedWithBearingImpl(speed.getKnots(), new DegreeBearingImpl(
windDAO.trueWindBearingDeg));
} else if (windDAO.trueWindFromDeg != null) {
speedWithBearing = new KnotSpeedWithBearingImpl(speed.getKnots(), new DegreeBearingImpl(
windDAO.trueWindFromDeg).reverse());
}
}
Wind wind = new WindImpl(p, at, speedWithBearing);
trackedRace.recordWind(wind, WindSource.WEB);
}
Wind wind = new WindImpl(p, at, speedWithBearing);
getService().getOrCreateTrackedEvent(event).getTrackedRace(race).recordWind(wind, WindSource.WEB);
}
@Override
public void setWindSource(String eventName, String raceName, String windSourceName) {
Event event = getService().getEventByName(eventName);
if (event != null) {
RaceDefinition race = getRaceByName(event, raceName);
if (race != null) {
TrackedRace trackedRace = getService().getOrCreateTrackedEvent(event).getTrackedRace(race);
if (trackedRace != null) {
trackedRace.setWindSource(WindSource.valueOf(windSourceName));
}
}
public void setWindSource(RaceIdentifier raceIdentifier, String windSourceName) {
TrackedRace trackedRace = getTrackedRace(raceIdentifier);
if (trackedRace != null) {
trackedRace.setWindSource(WindSource.valueOf(windSourceName));
}
}
@Override
public Map<CompetitorDAO, List<GPSFixDAO>> getBoatPositions(String eventName, String raceName,
public Map<CompetitorDAO, List<GPSFixDAO>> getBoatPositions(RaceIdentifier raceIdentifier,
Map<CompetitorDAO, Date> from, Map<CompetitorDAO, Date> to,
boolean extrapolate) {
Map<CompetitorDAO, List<GPSFixDAO>> result = new HashMap<CompetitorDAO, List<GPSFixDAO>>();
Event event = getService().getEventByName(eventName);
if (event != null) {
RaceDefinition race = getRaceByName(event, raceName);
TrackedRace trackedRace = getService().getOrCreateTrackedEvent(event).getTrackedRace(race);
TrackedRace trackedRace = getTrackedRace(raceIdentifier);
if (trackedRace != null) {
for (Competitor competitor : trackedRace.getRace().getCompetitors()) {
CompetitorDAO competitorDAO = getCompetitorDAO(competitor);
if (from.containsKey(competitorDAO)) {
@@ -710,7 +699,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
GPSFixMoving fix = fixIter.next();
while (fix != null && fix.getTimePoint().compareTo(toTimePointExcluding) < 0) {
Tack tack = trackedRace.getTack(competitor, fix.getTimePoint());
GPSFixDAO fixDAO = createGPSFixDAO(fix, fix.getSpeed(), tack, /* extrapolate */ false);
GPSFixDAO fixDAO = createGPSFixDAO(fix, fix.getSpeed(), tack, /* extrapolate */false);
fixesForCompetitor.add(fixDAO);
if (fixIter.hasNext()) {
fix = fixIter.next();
@@ -751,14 +740,12 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
}
@Override
public List<MarkDAO> getMarkPositions(String eventName, String raceName, Date date) {
public List<MarkDAO> getMarkPositions(RaceIdentifier raceIdentifier, Date date) {
List<MarkDAO> result = new ArrayList<MarkDAO>();
if (date != null) {
Event event = getService().getEventByName(eventName);
if (event != null) {
RaceDefinition race = getRaceByName(event, raceName);
TimePoint dateAsTimePoint = new MillisecondsTimePoint(date);
TrackedRace trackedRace = getService().getOrCreateTrackedEvent(event).getTrackedRace(race);
TimePoint dateAsTimePoint = new MillisecondsTimePoint(date);
TrackedRace trackedRace = getTrackedRace(raceIdentifier);
if (trackedRace != null) {
Set<Buoy> buoys = new HashSet<Buoy>();
for (Waypoint waypoint : trackedRace.getRace().getCourse().getWaypoints()) {
for (Buoy b : waypoint.getBuoys()) {
@@ -780,14 +767,13 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
}
@Override
public List<QuickRankDAO> getQuickRanks(String eventName, String raceName, Date date) throws Exception {
Event event = getService().getEventByName(eventName);
public List<QuickRankDAO> getQuickRanks(RaceIdentifier raceIdentifier, Date date) throws NoWindException {
List<QuickRankDAO> result = new ArrayList<QuickRankDAO>();
if (date != null && event != null) {
RaceDefinition race = getRaceByName(event, raceName);
if (race != null) {
TimePoint dateAsTimePoint = new MillisecondsTimePoint(date);
TrackedRace trackedRace = getService().getOrCreateTrackedEvent(event).getTrackedRace(race);
if (date != null) {
TimePoint dateAsTimePoint = new MillisecondsTimePoint(date);
TrackedRace trackedRace = getTrackedRace(raceIdentifier);
if (trackedRace != null) {
RaceDefinition race = trackedRace.getRace();
for (Competitor competitor : race.getCompetitors()) {
int rank = trackedRace.getRank(competitor, dateAsTimePoint);
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(competitor, dateAsTimePoint);
@@ -809,37 +795,40 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
}
@Override
public void removeWind(String eventName, String raceName, WindDAO windDAO) {
Event event = getService().getEventByName(eventName);
RaceDefinition race = getRaceByName(event, raceName);
Position p = null;
if (windDAO.position != null) {
p = new DegreePosition(windDAO.position.latDeg, windDAO.position.lngDeg);
}
TimePoint at = null;
if (windDAO.timepoint != null) {
at = new MillisecondsTimePoint(windDAO.timepoint);
}
SpeedWithBearing speedWithBearing = null;
Speed speed = null;
if (windDAO.trueWindSpeedInKnots != null) {
speed = new KnotSpeedImpl(windDAO.trueWindSpeedInKnots);
} else if (windDAO.trueWindSpeedInMetersPerSecond != null) {
speed = new KilometersPerHourSpeedImpl(windDAO.trueWindSpeedInMetersPerSecond * 3600. / 1000.);
} else if (windDAO.dampenedTrueWindSpeedInKnots != null) {
speed = new KnotSpeedImpl(windDAO.dampenedTrueWindSpeedInKnots);
} else if (windDAO.dampenedTrueWindSpeedInMetersPerSecond != null) {
speed = new KilometersPerHourSpeedImpl(windDAO.dampenedTrueWindSpeedInMetersPerSecond * 3600. / 1000.);
}
if (speed != null) {
if (windDAO.trueWindBearingDeg != null) {
speedWithBearing = new KnotSpeedWithBearingImpl(speed.getKnots(), new DegreeBearingImpl(windDAO.trueWindBearingDeg));
} else if (windDAO.trueWindFromDeg != null) {
speedWithBearing = new KnotSpeedWithBearingImpl(speed.getKnots(), new DegreeBearingImpl(windDAO.trueWindFromDeg).reverse());
public void removeWind(RaceIdentifier raceIdentifier, WindDAO windDAO) {
TrackedRace trackedRace = getTrackedRace(raceIdentifier);
if (trackedRace != null) {
Position p = null;
if (windDAO.position != null) {
p = new DegreePosition(windDAO.position.latDeg, windDAO.position.lngDeg);
}
TimePoint at = null;
if (windDAO.timepoint != null) {
at = new MillisecondsTimePoint(windDAO.timepoint);
}
SpeedWithBearing speedWithBearing = null;
Speed speed = null;
if (windDAO.trueWindSpeedInKnots != null) {
speed = new KnotSpeedImpl(windDAO.trueWindSpeedInKnots);
} else if (windDAO.trueWindSpeedInMetersPerSecond != null) {
speed = new KilometersPerHourSpeedImpl(windDAO.trueWindSpeedInMetersPerSecond * 3600. / 1000.);
} else if (windDAO.dampenedTrueWindSpeedInKnots != null) {
speed = new KnotSpeedImpl(windDAO.dampenedTrueWindSpeedInKnots);
} else if (windDAO.dampenedTrueWindSpeedInMetersPerSecond != null) {
speed = new KilometersPerHourSpeedImpl(windDAO.dampenedTrueWindSpeedInMetersPerSecond * 3600. / 1000.);
}
if (speed != null) {
if (windDAO.trueWindBearingDeg != null) {
speedWithBearing = new KnotSpeedWithBearingImpl(speed.getKnots(), new DegreeBearingImpl(
windDAO.trueWindBearingDeg));
} else if (windDAO.trueWindFromDeg != null) {
speedWithBearing = new KnotSpeedWithBearingImpl(speed.getKnots(), new DegreeBearingImpl(
windDAO.trueWindFromDeg).reverse());
}
}
Wind wind = new WindImpl(p, at, speedWithBearing);
trackedRace.removeWind(wind, WindSource.WEB);
}
Wind wind = new WindImpl(p, at, speedWithBearing);
getService().getOrCreateTrackedEvent(event).getTrackedRace(race).removeWind(wind, WindSource.WEB);
}
protected RacingEventService getService() {
@@ -905,9 +894,8 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
}
@Override
public void connectTrackedRaceToLeaderboardColumn(String leaderboardName, String raceColumnName, String eventName,
String raceName) {
TrackedRace trackedRace = getTrackedRace(eventName, raceName);
public void connectTrackedRaceToLeaderboardColumn(String leaderboardName, String raceColumnName, RaceIdentifier raceIdentifier) {
TrackedRace trackedRace = getTrackedRace(raceIdentifier);
if (trackedRace != null) {
Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName);
if (leaderboard != null) {
@@ -1140,49 +1128,52 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
}
@Override
public Map<CompetitorDAO, List<GPSFixDAO>> getDouglasPoints(String eventName, String raceName,
public Map<CompetitorDAO, List<GPSFixDAO>> getDouglasPoints(RaceIdentifier raceIdentifier,
Map<CompetitorDAO, Date> from, Map<CompetitorDAO, Date> to,
double meters) {
Map<CompetitorDAO, List<GPSFixDAO>> result = new HashMap<CompetitorDAO, List<GPSFixDAO>>();
TrackedRace trackedRace = getTrackedRace(eventName, raceName);
MeterDistance maxDistance = new MeterDistance(meters);
for (Competitor competitor : trackedRace.getRace().getCompetitors()) {
CompetitorDAO competitorDAO = getCompetitorDAO(competitor);
if (from.containsKey(competitorDAO)) {
// get Track of competitor
GPSFixTrack<Competitor, GPSFixMoving> gpsFixTrack = trackedRace.getTrack(competitor);
// Distance for DouglasPeucker
TimePoint timePointFrom = new MillisecondsTimePoint(from.get(competitorDAO));
TimePoint timePointTo = new MillisecondsTimePoint(to.get(competitorDAO));
List<GPSFixMoving> gpsFixApproximation = trackedRace.approximate(competitor, maxDistance, timePointFrom, timePointTo);
List<GPSFixDAO> gpsFixDouglasList = new ArrayList<GPSFixDAO>();
for (int i = 0; i < gpsFixApproximation.size(); i++) {
GPSFix fix = gpsFixApproximation.get(i);
SpeedWithBearing speedWithBearing;
if (i<gpsFixApproximation.size()-1) {
GPSFix next = gpsFixApproximation.get(i+1);
Bearing bearing = fix.getPosition().getBearingGreatCircle(next.getPosition());
Speed speed = fix.getPosition().getDistance(next.getPosition()).inTime(
next.getTimePoint().asMillis()-fix.getTimePoint().asMillis());
speedWithBearing = new KnotSpeedWithBearingImpl(speed.getKnots(), bearing);
} else {
speedWithBearing = gpsFixTrack.getEstimatedSpeed(fix.getTimePoint());
TrackedRace trackedRace = getTrackedRace(raceIdentifier);
if (trackedRace != null) {
MeterDistance maxDistance = new MeterDistance(meters);
for (Competitor competitor : trackedRace.getRace().getCompetitors()) {
CompetitorDAO competitorDAO = getCompetitorDAO(competitor);
if (from.containsKey(competitorDAO)) {
// get Track of competitor
GPSFixTrack<Competitor, GPSFixMoving> gpsFixTrack = trackedRace.getTrack(competitor);
// Distance for DouglasPeucker
TimePoint timePointFrom = new MillisecondsTimePoint(from.get(competitorDAO));
TimePoint timePointTo = new MillisecondsTimePoint(to.get(competitorDAO));
List<GPSFixMoving> gpsFixApproximation = trackedRace.approximate(competitor, maxDistance,
timePointFrom, timePointTo);
List<GPSFixDAO> gpsFixDouglasList = new ArrayList<GPSFixDAO>();
for (int i = 0; i < gpsFixApproximation.size(); i++) {
GPSFix fix = gpsFixApproximation.get(i);
SpeedWithBearing speedWithBearing;
if (i < gpsFixApproximation.size() - 1) {
GPSFix next = gpsFixApproximation.get(i + 1);
Bearing bearing = fix.getPosition().getBearingGreatCircle(next.getPosition());
Speed speed = fix.getPosition().getDistance(next.getPosition())
.inTime(next.getTimePoint().asMillis() - fix.getTimePoint().asMillis());
speedWithBearing = new KnotSpeedWithBearingImpl(speed.getKnots(), bearing);
} else {
speedWithBearing = gpsFixTrack.getEstimatedSpeed(fix.getTimePoint());
}
Tack tack = trackedRace.getTack(competitor, fix.getTimePoint());
GPSFixDAO fixDAO = createGPSFixDAO(fix, speedWithBearing, tack, /* extrapolated */false);
gpsFixDouglasList.add(fixDAO);
}
Tack tack = trackedRace.getTack(competitor, fix.getTimePoint());
GPSFixDAO fixDAO = createGPSFixDAO(fix, speedWithBearing, tack, /* extrapolated */ false);
gpsFixDouglasList.add(fixDAO);
result.put(competitorDAO, gpsFixDouglasList);
}
result.put(competitorDAO, gpsFixDouglasList);
}
}
return result;
}
@Override
public Map<CompetitorDAO, List<ManeuverDAO>> getManeuvers(String eventName, String raceName,
public Map<CompetitorDAO, List<ManeuverDAO>> getManeuvers(RaceIdentifier raceIdentifier,
Map<CompetitorDAO, Date> from, Map<CompetitorDAO, Date> to) throws NoWindException {
Map<CompetitorDAO, List<ManeuverDAO>> result = new HashMap<CompetitorDAO, List<ManeuverDAO>>();
TrackedRace trackedRace = getTrackedRace(eventName, raceName);
TrackedRace trackedRace = getTrackedRace(raceIdentifier);
for (Competitor competitor : trackedRace.getRace().getCompetitors()) {
CompetitorDAO competitorDAO = getCompetitorDAO(competitor);
if (from.containsKey(competitorDAO)) {
@@ -1209,4 +1200,82 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
}
return result;
}
@Override
public RaceDefinition getRace(EventNameAndRaceName eventNameAndRaceName) {
Event event = getService().getEventByName(eventNameAndRaceName.getEventName());
RaceDefinition race = getRaceByName(event, eventNameAndRaceName.getRaceName());
return race;
}
@Override
public TrackedRace getTrackedRace(EventNameAndRaceName eventNameAndRaceName) {
Event event = getService().getEventByName(eventNameAndRaceName.getEventName());
RaceDefinition race = getRaceByName(event, eventNameAndRaceName.getRaceName());
TrackedRace trackedRace = getService().getOrCreateTrackedEvent(event).getTrackedRace(race);
return trackedRace;
}
@Override
public RaceDefinition getRace(LeaderboardNameAndRaceColumnName leaderboardNameAndRaceColumnName) {
RaceDefinition result = null;
Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardNameAndRaceColumnName.getLeaderboardName());
if (leaderboard != null) {
RaceInLeaderboard raceColumn = leaderboard.getRaceColumnByName(leaderboardNameAndRaceColumnName
.getRaceColumnName());
if (raceColumn != null && raceColumn.getTrackedRace() != null) {
result = raceColumn.getTrackedRace().getRace();
}
}
return result;
}
@Override
public TrackedRace getTrackedRace(LeaderboardNameAndRaceColumnName leaderboardNameAndRaceColumnName) {
TrackedRace result = null;
Leaderboard leaderboard = getService().getLeaderboardByName(
leaderboardNameAndRaceColumnName.getLeaderboardName());
if (leaderboard != null) {
RaceInLeaderboard raceColumn = leaderboard.getRaceColumnByName(leaderboardNameAndRaceColumnName
.getRaceColumnName());
if (raceColumn != null) {
result = raceColumn.getTrackedRace();
}
}
return result;
}
@Override
public TrackedRace getExistingTrackedRace(LeaderboardNameAndRaceColumnName leaderboardNameAndRaceColumnName) {
return getTrackedRace(leaderboardNameAndRaceColumnName);
}
@Override
public TrackedRace getExistingTrackedRace(EventNameAndRaceName eventNameAndRaceName) {
Event event = getService().getEventByName(eventNameAndRaceName.getEventName());
RaceDefinition race = getRaceByName(event, eventNameAndRaceName.getRaceName());
TrackedRace trackedRace = getService().getOrCreateTrackedEvent(event).getExistingTrackedRace(race);
return trackedRace;
}
@Override
public Event getEvent(EventNameAndRaceName eventIdentifier) {
return getService().getEventByName(eventIdentifier.getEventName());
}
private RaceDefinition getRace(RaceIdentifier raceIdentifier) {
return (RaceDefinition) raceIdentifier.getRace(this);
}
private TrackedRace getTrackedRace(RaceIdentifier raceIdentifier) {
return (TrackedRace) raceIdentifier.getTrackedRace(this);
}
private TrackedRace getExistingTrackedRace(RaceIdentifier raceIdentifier) {
return (TrackedRace) raceIdentifier.getExistingTrackedRace(this);
}
private Event getEvent(EventIdentifier eventIdentifier) {
return (Event) eventIdentifier.getEvent(this);
}
}
@@ -0,0 +1,4 @@
package com.sap.sailing.gwt.ui.shared;
public interface EventAndRaceIdentifier extends EventIdentifier, RaceIdentifier {
}
@@ -0,0 +1,9 @@
package com.sap.sailing.gwt.ui.shared;
public interface EventFetcher {
/**
* Not to be executed on the client; when executed on the server, returns an object of type <code>Event</code>
*/
Object getEvent(EventNameAndRaceName eventIdentifier);
}
@@ -0,0 +1,5 @@
package com.sap.sailing.gwt.ui.shared;
public interface EventIdentifier {
Object getEvent(EventFetcher eventFetcher);
}
@@ -0,0 +1,37 @@
package com.sap.sailing.gwt.ui.shared;
public class EventNameAndRaceName implements EventAndRaceIdentifier {
private String eventName;
private String raceName;
EventNameAndRaceName() {}
public EventNameAndRaceName(String eventName, String raceName) {
super();
this.eventName = eventName;
this.raceName = raceName;
}
public String getEventName() {
return eventName;
}
public String getRaceName() {
return raceName;
}
@Override
public Object getRace(RaceFetcher raceFetcher) {
return raceFetcher.getRace(this);
}
@Override
public Object getTrackedRace(RaceFetcher raceFetcher) {
return raceFetcher.getTrackedRace(this);
}
@Override
public Object getExistingTrackedRace(RaceFetcher raceFetcher) {
return raceFetcher.getExistingTrackedRace(this);
}
@Override
public Object getEvent(EventFetcher eventFetcher) {
return eventFetcher.getEvent(this);
}
}
@@ -0,0 +1,35 @@
package com.sap.sailing.gwt.ui.shared;
public class LeaderboardNameAndRaceColumnName implements RaceIdentifier {
private String leaderboardName;
private String raceColumnName;
LeaderboardNameAndRaceColumnName() {}
public LeaderboardNameAndRaceColumnName(String leaderboardName, String raceColumnName) {
super();
this.leaderboardName = leaderboardName;
this.raceColumnName = raceColumnName;
}
public String getLeaderboardName() {
return leaderboardName;
}
public String getRaceColumnName() {
return raceColumnName;
}
@Override
public Object getRace(RaceFetcher raceFetcher) {
return raceFetcher.getRace(this);
}
@Override
public Object getTrackedRace(RaceFetcher raceFetcher) {
return raceFetcher.getTrackedRace(this);
}
@Override
public Object getExistingTrackedRace(RaceFetcher raceFetcher) {
return raceFetcher.getExistingTrackedRace(this);
}
}
@@ -0,0 +1,21 @@
package com.sap.sailing.gwt.ui.shared;
public interface RaceFetcher {
/**
* Not for execution on the client; on the server, returns a <code>RaceDefinition</code> object.
*/
Object getRace(EventNameAndRaceName eventNameAndRaceName);
/**
* Not for execution on the client; on the server, returns a <code>TrackedRace</code> object.
*/
Object getTrackedRace(EventNameAndRaceName eventNameAndRaceName);
Object getRace(LeaderboardNameAndRaceColumnName leaderboardNameAndRaceColumnName);
Object getTrackedRace(LeaderboardNameAndRaceColumnName leaderboardNameAndRaceColumnName);
Object getExistingTrackedRace(LeaderboardNameAndRaceColumnName leaderboardNameAndRaceColumnName);
Object getExistingTrackedRace(EventNameAndRaceName eventNameAndRaceName);
}
@@ -0,0 +1,17 @@
package com.sap.sailing.gwt.ui.shared;
import com.google.gwt.user.client.rpc.IsSerializable;
public interface RaceIdentifier extends IsSerializable {
Object getRace(RaceFetcher raceFetcher);
/**
* Blocks and waits if the tracked race for this race identifier doesn't exist yet.
*/
Object getTrackedRace(RaceFetcher raceFetcher);
/**
* Immediately returns <code>null</code> if the tracked race for this race identifier doesn't exist yet.
*/
Object getExistingTrackedRace(RaceFetcher sailingServiceImpl);
}