added manual wind capturing facility

This commit is contained in:
Axel Uhl committed 2011-07-07 17:48:35 +02:00
1 parent b635cd4fa4
commit da821709f6
40 files changed
+665 -46560

No files matched your search

@@ -13,8 +13,8 @@ public class WindImpl extends KnotSpeedWithBearingImpl implements Wind {
private final TimePoint timepoint;
private final Bearing from;
public WindImpl(Position p, TimePoint at, SpeedWithBearing avgWindSpeed) {
super(avgWindSpeed.getKnots(), avgWindSpeed.getBearing());
public WindImpl(Position p, TimePoint at, SpeedWithBearing windSpeedWithBearing) {
super(windSpeedWithBearing.getKnots(), windSpeedWithBearing.getBearing());
this.position = p;
this.timepoint = at;
double fromDeg = getBearing().getDegrees() + 180;
@@ -19,6 +19,8 @@ public class ExpeditionWindTrackerFactory implements WindTrackerFactory, BundleA
private static Logger logger = Logger.getLogger(ExpeditionWindTrackerFactory.class.getName());
private static WindTrackerFactory defaultInstance;
private static BundleContext defaultBundleContext;
private static final String EXPEDITION_UDP_PORT_PROPERTY_NAME = "expedition.udp.port";
/**
@@ -44,6 +46,10 @@ public class ExpeditionWindTrackerFactory implements WindTrackerFactory, BundleA
}
return defaultInstance;
}
public static BundleContext getBundleContext() {
return defaultBundleContext;
}
@Override
public synchronized WindTracker createWindTracker(DynamicTrackedEvent trackedEvent, RaceDefinition race,
@@ -91,14 +97,12 @@ public class ExpeditionWindTrackerFactory implements WindTrackerFactory, BundleA
@Override
public void start(BundleContext context) throws Exception {
// TODO Auto-generated method stub
defaultBundleContext = context;
defaultInstance = this;
}
@Override
public void stop(BundleContext context) throws Exception {
// TODO Auto-generated method stub
}
}
@@ -1,4 +1,4 @@
#Mon Jul 04 23:21:28 CEST 2011
#Thu Jul 07 14:21:00 CEST 2011
eclipse.preferences.version=1
filesCopiedToWebInfLib=gwt-servlet.jar
gwtCompileSettings=PGd3dC1jb21waWxlLXNldHRpbmdzPjxsb2ctbGV2ZWw+SU5GTzwvbG9nLWxldmVsPjxvdXRwdXQtc3R5bGU+T0JGVVNDQVRFRDwvb3V0cHV0LXN0eWxlPjxleHRyYS1hcmdzPjwhW0NEQVRBW11dPjwvZXh0cmEtYXJncz48dm0tYXJncz48IVtDREFUQVstWG14NTEybV1dPjwvdm0tYXJncz48ZW50cnktcG9pbnQtbW9kdWxlPmNvbS5zYXAuc2FpbGluZy5nd3QudWkuQWRtaW5Db25zb2xlPC9lbnRyeS1wb2ludC1tb2R1bGU+PGVudHJ5LXBvaW50LW1vZHVsZT5jb20uc2FwLnNhaWxpbmcuZ3d0LnVpLmNvbV9zYXBfc2FpbGluZ19nd3RfdWk8L2VudHJ5LXBvaW50LW1vZHVsZT48L2d3dC1jb21waWxlLXNldHRpbmdzPg\=\=
gwtCompileSettings=PGd3dC1jb21waWxlLXNldHRpbmdzPjxsb2ctbGV2ZWw+SU5GTzwvbG9nLWxldmVsPjxvdXRwdXQtc3R5bGU+T0JGVVNDQVRFRDwvb3V0cHV0LXN0eWxlPjxleHRyYS1hcmdzPjwhW0NEQVRBWy1sb2NhbFdvcmtlcnMgNF1dPjwvZXh0cmEtYXJncz48dm0tYXJncz48IVtDREFUQVstWG14NTEybV1dPjwvdm0tYXJncz48ZW50cnktcG9pbnQtbW9kdWxlPmNvbS5zYXAuc2FpbGluZy5nd3QudWkuQWRtaW5Db25zb2xlPC9lbnRyeS1wb2ludC1tb2R1bGU+PGVudHJ5LXBvaW50LW1vZHVsZT5jb20uc2FwLnNhaWxpbmcuZ3d0LnVpLmNvbV9zYXBfc2FpbGluZ19nd3RfdWk8L2VudHJ5LXBvaW50LW1vZHVsZT48L2d3dC1jb21waWxlLXNldHRpbmdzPg\=\=
@@ -1,9 +1,14 @@
package com.sap.sailing.gwt.ui.client;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.google.gwt.core.client.EntryPoint;
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.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.HTML;
@@ -11,8 +16,9 @@ import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.sap.sailing.gwt.ui.shared.EventDAO;
public class AdminConsole implements EntryPoint, ErrorReporter {
public class AdminConsole implements EntryPoint, ErrorReporter, EventRefresher {
/**
* Create a remote service proxy to talk to the server-side sailing service.
*/
@@ -20,6 +26,7 @@ public class AdminConsole implements EntryPoint, ErrorReporter {
private DialogBox errorDialogBox;
private HTML serverResponseLabel;
private Button dialogCloseButton;
private Set<EventDisplayer> eventDisplayers;
/**
* The message displayed to the user when the server cannot be reached or
@@ -33,18 +40,21 @@ public class AdminConsole implements EntryPoint, ErrorReporter {
public void onModuleLoad() {
StringConstants stringConstants = GWT.create(StringConstants.class);
RootPanel rootPanel = RootPanel.get();
rootPanel.setSize("100%", "100%");
rootPanel.setSize("95%", "95%");
errorDialogBox = createErrorDialog();
TabPanel tabPanel = new TabPanel();
tabPanel.setAnimationEnabled(true);
rootPanel.add(tabPanel, 10, 10);
tabPanel.setSize("100%", "100%");
tabPanel.setSize("95%", "95%");
EventManagementPanel eventManagementPanel = new EventManagementPanel(sailingService, this);
eventDisplayers = new HashSet<EventDisplayer>();
EventManagementPanel eventManagementPanel = new EventManagementPanel(sailingService, this, this);
eventDisplayers.add(eventManagementPanel);
eventManagementPanel.setSize("90%", "90%");
tabPanel.add(eventManagementPanel, stringConstants.tracTracEvents(), false);
WindPanel windPanel = new WindPanel(sailingService, this);
WindPanel windPanel = new WindPanel(sailingService, this, this);
eventDisplayers.add(windPanel);
windPanel.setSize("90%", "90%");
tabPanel.add(windPanel, stringConstants.wind(), false);
tabPanel.selectTab(0);
@@ -88,4 +98,21 @@ public class AdminConsole implements EntryPoint, ErrorReporter {
dialogCloseButton.setFocus(true);
}
@Override
public void fillEvents() {
sailingService.listEvents(new AsyncCallback<List<EventDAO>>() {
@Override
public void onSuccess(List<EventDAO> result) {
for (EventDisplayer eventDisplayer : eventDisplayers) {
eventDisplayer.fillEvents(result);
}
}
@Override
public void onFailure(Throwable caught) {
reportError("Remote Procedure Call listEvents() - Failure");
}
});
}
}
@@ -0,0 +1,9 @@
package com.sap.sailing.gwt.ui.client;
import java.util.List;
import com.sap.sailing.gwt.ui.shared.EventDAO;
public interface EventDisplayer {
void fillEvents(List<EventDAO> result);
}
@@ -51,7 +51,7 @@ import com.sap.sailing.gwt.ui.shared.TracTracConfigurationDAO;
* @author Axel Uhl (D043530)
*
*/
public class EventManagementPanel extends FormPanel {
public class EventManagementPanel extends FormPanel implements EventDisplayer {
private final SailingServiceAsync sailingService;
private final ErrorReporter errorReporter;
private final IntegerBox storedPortIntegerbox;
@@ -66,11 +66,14 @@ public class EventManagementPanel extends FormPanel {
private final Map<String, TracTracConfigurationDAO> previousConfigurations;
private final ListBox previousConfigurationsComboBox;
private final Grid grid;
private final EventRefresher eventRefresher;
private final StringConstants stringConstants;
public EventManagementPanel(final SailingServiceAsync sailingService, ErrorReporter errorReporter) {
public EventManagementPanel(final SailingServiceAsync sailingService, ErrorReporter errorReporter, EventRefresher eventRefresher) {
this.sailingService = sailingService;
this.errorReporter = errorReporter;
StringConstants stringConstants = GWT.create(StringConstants.class);
this.eventRefresher = eventRefresher;
stringConstants = GWT.create(StringConstants.class);
VerticalPanel verticalPanel = new VerticalPanel();
this.setWidget(verticalPanel);
verticalPanel.setSize("100%", "100%");
@@ -253,7 +256,7 @@ public class EventManagementPanel extends FormPanel {
grid.getCellFormatter().setVerticalAlignment(8, 1, HasVerticalAlignment.ALIGN_TOP);
grid.getCellFormatter().setVerticalAlignment(8, 0, HasVerticalAlignment.ALIGN_TOP);
fillEvents();
eventRefresher.fillEvents();
updatePortStoredData();
updateLiveURI();
updateStoredURI();
@@ -270,7 +273,7 @@ public class EventManagementPanel extends FormPanel {
@Override
public void onSuccess(Void result) {
fillEvents();
eventRefresher.fillEvents();
}
});
}
@@ -285,7 +288,7 @@ public class EventManagementPanel extends FormPanel {
@Override
public void onSuccess(Void result) {
fillEvents();
eventRefresher.fillEvents();
}
});
}
@@ -350,61 +353,6 @@ public class EventManagementPanel extends FormPanel {
});
}
private void fillEvents() {
sailingService.listEvents(new AsyncCallback<List<EventDAO>>() {
@Override
public void onSuccess(List<EventDAO> result) {
grid.setWidget(8, 0, null);
VerticalPanel buttonPanel = new VerticalPanel();
Button btnRefresh = new Button("Refresh");
btnRefresh.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
fillEvents();
}
});
buttonPanel.add(btnRefresh);
grid.setWidget(8, 1, buttonPanel);
if (!result.isEmpty()) {
final ListDataProvider<EventDAO> eventsList = new ListDataProvider<EventDAO>(result);
final TrackedEventsTreeModel trackedEventsModel = new TrackedEventsTreeModel(eventsList);
// When the following line is uncommented, the race table contents don't show anymore...???!!!
CellTree eventsCellTree = new CellTree(trackedEventsModel, /* root */null);
grid.setWidget(8, 0, eventsCellTree);
Button btnRemove = new Button("Remove");
btnRemove.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent click) {
for (EventDAO event : eventsList.getList()) {
if (trackedEventsModel.getSelectionModel().isSelected(event)) {
stopTrackingEvent(event);
} else {
// scan event's races:
for (RegattaDAO regatta : event.regattas) {
for (RaceDAO race : regatta.races) {
if (trackedEventsModel.getSelectionModel().isSelected(regatta) ||
trackedEventsModel.getSelectionModel().isSelected(race)) {
stopTrackingRace(event, race);
}
}
}
}
}
}
});
btnRemove.setWidth("100%");
buttonPanel.add(btnRemove);
}
}
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Remote Procedure Call listEvents() - Failure");
}
});
}
private void fillRaces(final SailingServiceAsync sailingService) {
final String jsonURL = jsonURLBox.getValue();
final String liveDataURI = liveURIBox.getValue();
@@ -459,7 +407,7 @@ public class EventManagementPanel extends FormPanel {
@Override
public void onSuccess(Void result) {
fillEvents();
eventRefresher.fillEvents();
}
});
}
@@ -480,4 +428,51 @@ public class EventManagementPanel extends FormPanel {
}
}
@Override
public void fillEvents(List<EventDAO> result) {
grid.setWidget(8, 0, null);
VerticalPanel buttonPanel = new VerticalPanel();
Button btnRefresh = new Button(stringConstants.refresh());
btnRefresh.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
eventRefresher.fillEvents();
}
});
buttonPanel.add(btnRefresh);
grid.setWidget(8, 1, buttonPanel);
if (!result.isEmpty()) {
final ListDataProvider<EventDAO> eventsList = new ListDataProvider<EventDAO>(result);
final TrackedEventsTreeModel trackedEventsModel = new TrackedEventsTreeModel(eventsList, /* multiSelection */ true);
// When the following line is uncommented, the race table contents don't show anymore
// if there are no events yet...???!!!
CellTree eventsCellTree = new CellTree(trackedEventsModel, /* root */null);
grid.setWidget(8, 0, eventsCellTree);
Button btnRemove = new Button(stringConstants.remove());
btnRemove.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent click) {
for (EventDAO event : eventsList.getList()) {
if (trackedEventsModel.getSelectionModel().isSelected(event)) {
stopTrackingEvent(event);
} else {
// scan event's races:
for (RegattaDAO regatta : event.regattas) {
for (RaceDAO race : regatta.races) {
if (trackedEventsModel.getSelectionModel().isSelected(regatta) ||
trackedEventsModel.getSelectionModel().isSelected(race)) {
stopTrackingRace(event, race);
}
}
}
}
}
}
});
btnRemove.setWidth("100%");
buttonPanel.add(btnRemove);
}
}
}
@@ -0,0 +1,5 @@
package com.sap.sailing.gwt.ui.client;
public interface EventRefresher {
void fillEvents();
}
@@ -0,0 +1,9 @@
package com.sap.sailing.gwt.ui.client;
import com.sap.sailing.gwt.ui.shared.EventDAO;
import com.sap.sailing.gwt.ui.shared.Pair;
import com.sap.sailing.gwt.ui.shared.RaceDAO;
public interface RaceSelectionProvider {
Pair<EventDAO, RaceDAO> getSelectedEventAndRace();
}
@@ -7,6 +7,8 @@ import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
import com.sap.sailing.gwt.ui.shared.EventDAO;
import com.sap.sailing.gwt.ui.shared.RaceRecordDAO;
import com.sap.sailing.gwt.ui.shared.TracTracConfigurationDAO;
import com.sap.sailing.gwt.ui.shared.WindDAO;
import com.sap.sailing.gwt.ui.shared.WindInfoForRaceDAO;
/**
* The client side stub for the RPC service.
@@ -26,4 +28,8 @@ public interface SailingService extends RemoteService {
void stopTrackingEvent(String eventName) throws Exception;
void stopTrackingRace(String eventName, String raceName) throws Exception;
WindInfoForRaceDAO getWindInfo(String eventName, String raceName, long fromAsMilliseconds, long toAsMilliseconds);
void setWind(String eventName, String raceName, WindDAO wind);
}
@@ -6,6 +6,8 @@ import com.google.gwt.user.client.rpc.AsyncCallback;
import com.sap.sailing.gwt.ui.shared.EventDAO;
import com.sap.sailing.gwt.ui.shared.RaceRecordDAO;
import com.sap.sailing.gwt.ui.shared.TracTracConfigurationDAO;
import com.sap.sailing.gwt.ui.shared.WindDAO;
import com.sap.sailing.gwt.ui.shared.WindInfoForRaceDAO;
/**
* The async counterpart of {@link SailingService}
@@ -27,4 +29,9 @@ public interface SailingServiceAsync {
void stopTrackingRace(String eventName, String raceName, AsyncCallback<Void> asyncCallback);
void getWindInfo(String eventName, String raceName, long fromAsMilliseconds, long toAsMilliseconds,
AsyncCallback<WindInfoForRaceDAO> callback);
void setWind(String eventName, String raceName, WindDAO wind, AsyncCallback<Void> callback);
}
@@ -11,4 +11,6 @@ public interface StringConstants extends Constants {
String listRaces();
String wind();
String windPanelLabel();
String refresh();
String remove();
}
@@ -5,4 +5,6 @@ tracTracEvents=TracTrac Events
trackedBefore=Tracked Before
listRaces=List Races
wind=Wind
windPanelLabel=This is the Wind Panel which so far is completely empty.
windPanelLabel=This is the Wind Panel which so far is completely empty.
refresh=Refresh
remove=Remove
@@ -4,24 +4,26 @@ import com.google.gwt.cell.client.AbstractCell;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.MultiSelectionModel;
import com.google.gwt.view.client.SelectionModel;
import com.google.gwt.view.client.SingleSelectionModel;
import com.google.gwt.view.client.TreeViewModel;
import com.sap.sailing.gwt.ui.shared.EventDAO;
import com.sap.sailing.gwt.ui.shared.RaceDAO;
import com.sap.sailing.gwt.ui.shared.RegattaDAO;
public class TrackedEventsTreeModel implements TreeViewModel {
private final MultiSelectionModel<?> selectionModel;
private final SelectionModel<?> selectionModel;
private final ListDataProvider<EventDAO> events;
public TrackedEventsTreeModel(ListDataProvider<EventDAO> eventsList) {
public TrackedEventsTreeModel(ListDataProvider<EventDAO> eventsList, boolean multiSelection) {
this.events = eventsList;
selectionModel = new MultiSelectionModel<Object>();
selectionModel = multiSelection ? new MultiSelectionModel<Object>() : new SingleSelectionModel<Object>();
}
@SuppressWarnings("unchecked")
public <T> MultiSelectionModel<T> getSelectionModel() {
return (MultiSelectionModel<T>) selectionModel;
public <T> SelectionModel<T> getSelectionModel() {
return (SelectionModel<T>) selectionModel;
}
@Override
@@ -1,17 +1,181 @@
package com.sap.sailing.gwt.ui.client;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.ui.FormPanel;
import com.google.gwt.user.client.ui.Label;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Map;
public class WindPanel extends FormPanel {
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.user.cellview.client.CellTable;
import com.google.gwt.user.cellview.client.CellTree;
import com.google.gwt.user.cellview.client.ColumnSortEvent.Handler;
import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler;
import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FormPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.sap.sailing.gwt.ui.shared.EventDAO;
import com.sap.sailing.gwt.ui.shared.Pair;
import com.sap.sailing.gwt.ui.shared.RaceDAO;
import com.sap.sailing.gwt.ui.shared.RegattaDAO;
import com.sap.sailing.gwt.ui.shared.WindDAO;
import com.sap.sailing.gwt.ui.shared.WindInfoForRaceDAO;
import com.sap.sailing.gwt.ui.shared.WindTrackInfoDAO;
public class WindPanel extends FormPanel implements EventDisplayer, RaceSelectionProvider, WindShower {
private final SailingServiceAsync sailingService;
private final ErrorReporter errorReporter;
private EventRefresher eventRefresher;
private final Grid grid;
private final StringConstants stringConstants;
private final WindSettingPanel windSettingPanel;
private Pair<EventDAO, RaceDAO> selectedEventAndRace;
public WindPanel(final SailingServiceAsync sailingService, ErrorReporter errorReporter) {
public WindPanel(final SailingServiceAsync sailingService, ErrorReporter errorReporter, EventRefresher eventRefresher) {
this.sailingService = sailingService;
this.errorReporter = errorReporter;
StringConstants stringConstants = GWT.create(StringConstants.class);
this.setWidget(new Label(stringConstants.windPanelLabel()));
this.eventRefresher = eventRefresher;
stringConstants = GWT.create(StringConstants.class);
grid = new Grid(2, 2); // first row: event/race selection; second row: wind display
Button btnRefresh = new Button(stringConstants.refresh());
btnRefresh.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
WindPanel.this.eventRefresher.fillEvents();
}
});
grid.setWidget(0, 1, btnRefresh);
windSettingPanel = new WindSettingPanel(sailingService, errorReporter, this, this);
grid.setWidget(1, 1, windSettingPanel);
this.setWidget(grid);
}
@Override
public void fillEvents(List<EventDAO> result) {
grid.setWidget(0, 0, null); // remove tree view; important in case event list is empty
grid.getCellFormatter().setVerticalAlignment(0, 1, HasVerticalAlignment.ALIGN_TOP);
if (!result.isEmpty()) {
final ListDataProvider<EventDAO> eventsList = new ListDataProvider<EventDAO>(result);
final TrackedEventsTreeModel trackedEventsModel = new TrackedEventsTreeModel(eventsList, /* multiSelection */ false);
CellTree eventsCellTree = new CellTree(trackedEventsModel, /* root */null);
grid.setWidget(0, 0, eventsCellTree);
trackedEventsModel.getSelectionModel().addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent selectionChangeEvent) {
for (EventDAO event : eventsList.getList()) {
for (RegattaDAO regatta : event.regattas) {
for (RaceDAO race : regatta.races) {
if (trackedEventsModel.getSelectionModel().isSelected(race)) {
selectedEventAndRace = new Pair<EventDAO, RaceDAO>(event, race);
showWind(event, race);
}
}
}
}
}
});
}
}
@Override
public void showWind(final EventDAO event, final RaceDAO race) {
sailingService.getWindInfo(event.name, race.name,
// TODO what about the time interval?
/* fromAsMilliseconds */0, /* toAsMilliseconds */System.currentTimeMillis(),
new AsyncCallback<WindInfoForRaceDAO>() {
@Override
public void onSuccess(WindInfoForRaceDAO result) {
showWindForRace(result);
}
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error fetching wind information for race " + race.name + ": "
+ caught.getMessage());
}
});
}
private void showWindForRace(WindInfoForRaceDAO result) {
grid.setWidget(1, 0, null);
VerticalPanel windDisplay = new VerticalPanel();
grid.setWidget(1, 0, windDisplay);
for (Map.Entry<String, WindTrackInfoDAO> e : result.windTrackInfoByWindSourceName.entrySet()) {
Label windSourceLabel = new Label("Wind Source: "+e.getKey()+
", Dampening Interval: "+e.getValue().dampeningIntervalInMilliseconds+"ms");
windDisplay.add(windSourceLabel);
TextColumn<WindDAO> timeColumn = new TextColumn<WindDAO>() {
@Override
public String getValue(WindDAO object) {
return new Date(object.timepoint).toString();
}
};
TextColumn<WindDAO> speedInKnotsColumn = new TextColumn<WindDAO>() {
@Override
public String getValue(WindDAO object) {
return ""+object.trueWindSpeedInKnots;
}
};
TextColumn<WindDAO> windDirectionInDegColumn = new TextColumn<WindDAO>() {
@Override
public String getValue(WindDAO object) {
return ""+object.trueWindFromDeg;
}
};
timeColumn.setSortable(true);
speedInKnotsColumn.setSortable(true);
windDirectionInDegColumn.setSortable(true);
CellTable<WindDAO> windTable = new CellTable<WindDAO>(/* pageSize */ 100);
windTable.addColumn(timeColumn, "Name");
windTable.addColumn(speedInKnotsColumn, "Tracking Started");
windTable.addColumn(windDirectionInDegColumn, "From (deg)");
ListDataProvider<WindDAO> windList = new ListDataProvider<WindDAO>(e.getValue().windFixes);
windList.addDataDisplay(windTable);
Handler columnSortHandler = getWindTableColumnSortHandler(windList.getList(), timeColumn,
speedInKnotsColumn, windDirectionInDegColumn);
windTable.addColumnSortHandler(columnSortHandler);
windDisplay.add(windTable);
}
}
private Handler getWindTableColumnSortHandler(List<WindDAO> list, TextColumn<WindDAO> timeColumn,
TextColumn<WindDAO> speedInKnotsColumn, TextColumn<WindDAO> windDirectionInDegColumn) {
ListHandler<WindDAO> result = new ListHandler<WindDAO>(list);
result.setComparator(timeColumn, new Comparator<WindDAO>() {
@Override
public int compare(WindDAO o1, WindDAO o2) {
return o1.timepoint < o2.timepoint ? -1 : o1.timepoint == o2.timepoint ? 0 : 1;
}
});
result.setComparator(speedInKnotsColumn, new Comparator<WindDAO>() {
@Override
public int compare(WindDAO o1, WindDAO o2) {
return o1.trueWindSpeedInKnots < o2.trueWindSpeedInKnots ? -1 :
o1.trueWindSpeedInKnots == o2.trueWindSpeedInKnots ? 0 : 1;
}
});
result.setComparator(windDirectionInDegColumn, new Comparator<WindDAO>() {
@Override
public int compare(WindDAO o1, WindDAO o2) {
return o1.trueWindFromDeg < o2.trueWindFromDeg ? -1 :
o1.trueWindFromDeg == o2.trueWindFromDeg ? 0 : 1;
}
});
return result;
}
@Override
public Pair<EventDAO, RaceDAO> getSelectedEventAndRace() {
return selectedEventAndRace;
}
}
@@ -0,0 +1,81 @@
package com.sap.sailing.gwt.ui.client;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DoubleBox;
import com.google.gwt.user.client.ui.FocusWidget;
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.Pair;
import com.sap.sailing.gwt.ui.shared.PositionDAO;
import com.sap.sailing.gwt.ui.shared.RaceDAO;
import com.sap.sailing.gwt.ui.shared.WindDAO;
public class WindSettingPanel extends FormPanel {
public WindSettingPanel(final SailingServiceAsync sailingService, final ErrorReporter errorReporter,
final RaceSelectionProvider raceSelectionProvider, final WindShower windShower) {
Grid grid = new Grid(6, 2);
setWidget(grid);
grid.setWidget(0, 0, new Label("Set Wind"));
grid.setWidget(1, 0, new Label("Speed (kn)"));
final DoubleBox speedInKnotsBox = new DoubleBox();
grid.setWidget(1, 1, speedInKnotsBox);
grid.setWidget(2, 0, new Label("From (deg)"));
final DoubleBox fromInDegBox = new DoubleBox();
grid.setWidget(2, 1, fromInDegBox);
grid.setWidget(3, 0, new Label("Latitude (optional)"));
final DoubleBox latDegBox = new DoubleBox();
grid.setWidget(3, 1, latDegBox);
grid.setWidget(4, 0, new Label("Longitude (optional)"));
final DoubleBox lngDegBox = new DoubleBox();
grid.setWidget(4, 1, lngDegBox);
Button setWindButton = new Button("Set");
grid.setWidget(5, 0, setWindButton);
linkEnterToButton(setWindButton, speedInKnotsBox, fromInDegBox, latDegBox, lngDegBox);
setWindButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent clickEvent) {
WindDAO wind = new WindDAO();
wind.trueWindSpeedInKnots = speedInKnotsBox.getValue();
wind.trueWindFromDeg = fromInDegBox.getValue();
wind.timepoint = System.currentTimeMillis();
if (latDegBox.getValue() != null && lngDegBox.getValue() != null) {
wind.position = new PositionDAO(latDegBox.getValue(), lngDegBox.getValue());
}
final Pair<EventDAO, RaceDAO> eventAndRace = raceSelectionProvider.getSelectedEventAndRace();
sailingService.setWind(eventAndRace.getA().name, eventAndRace.getB().name, wind, new AsyncCallback<Void>() {
@Override
public void onSuccess(Void result) {
windShower.showWind(eventAndRace.getA(), eventAndRace.getB());
}
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error setting wind for race "+eventAndRace.getB().name+": "+caught.getMessage());
}
});
}
});
}
private void linkEnterToButton(final Button button, FocusWidget... widgets) {
for (FocusWidget widget : widgets) {
widget.addKeyPressHandler(new KeyPressHandler() {
@Override
public void onKeyPress(KeyPressEvent event) {
if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) {
button.click();
}
}
});
}
}
}
@@ -0,0 +1,10 @@
package com.sap.sailing.gwt.ui.client;
import com.sap.sailing.gwt.ui.shared.EventDAO;
import com.sap.sailing.gwt.ui.shared.RaceDAO;
public interface WindShower {
void showWind(EventDAO event, RaceDAO race);
}
@@ -8,10 +8,12 @@ import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.json.simple.JSONObject;
import org.osgi.framework.BundleContext;
import org.osgi.util.tracker.ServiceTracker;
@@ -19,7 +21,22 @@ import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Event;
import com.sap.sailing.domain.base.Position;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Speed;
import com.sap.sailing.domain.base.SpeedWithBearing;
import com.sap.sailing.domain.base.TimePoint;
import com.sap.sailing.domain.base.impl.DegreeBearingImpl;
import com.sap.sailing.domain.base.impl.DegreePosition;
import com.sap.sailing.domain.base.impl.KilometersPerHourSpeedImpl;
import com.sap.sailing.domain.base.impl.KnotSpeedImpl;
import com.sap.sailing.domain.base.impl.KnotSpeedWithBearingImpl;
import com.sap.sailing.domain.base.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.domain.tracking.Wind;
import com.sap.sailing.domain.tracking.WindSource;
import com.sap.sailing.domain.tracking.WindTrack;
import com.sap.sailing.domain.tracking.impl.WindImpl;
import com.sap.sailing.domain.tractracadapter.DomainFactory;
import com.sap.sailing.domain.tractracadapter.RaceRecord;
import com.sap.sailing.domain.tractracadapter.TracTracConfiguration;
@@ -27,10 +44,14 @@ 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.EventDAO;
import com.sap.sailing.gwt.ui.shared.PositionDAO;
import com.sap.sailing.gwt.ui.shared.RaceDAO;
import com.sap.sailing.gwt.ui.shared.RaceRecordDAO;
import com.sap.sailing.gwt.ui.shared.RegattaDAO;
import com.sap.sailing.gwt.ui.shared.TracTracConfigurationDAO;
import com.sap.sailing.gwt.ui.shared.WindDAO;
import com.sap.sailing.gwt.ui.shared.WindInfoForRaceDAO;
import com.sap.sailing.gwt.ui.shared.WindTrackInfoDAO;
import com.sap.sailing.mongodb.DomainObjectFactory;
import com.sap.sailing.mongodb.MongoObjectFactory;
import com.sap.sailing.mongodb.MongoWindStoreFactory;
@@ -173,9 +194,90 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
}
private void startTrackingWind(String eventName, String raceName, boolean correctByDeclination) throws Exception {
Event event = service.getEventByName(eventName);
if (event != null) {
RaceDefinition race = getRaceByName(event, raceName);
service.startTrackingWind(event, race, correctByDeclination);
}
}
@Override
public WindInfoForRaceDAO getWindInfo(String eventName, String raceName, long fromAsMilliseconds, long toAsMilliseconds) {
Event event = service.getEventByName(eventName);
RaceDefinition race = getRaceByName(event, raceName);
service.startTrackingWind(event, race, correctByDeclination);
WindInfoForRaceDAO result = new WindInfoForRaceDAO();
TrackedRace trackedRace = service.getDomainFactory().getTrackedEvent(event).getExistingTrackedRace(race);
TimePoint from = new MillisecondsTimePoint(fromAsMilliseconds);
TimePoint to = new MillisecondsTimePoint(toAsMilliseconds);
JSONObject jsonWindTracks = new JSONObject();
jsonWindTracks.put("currentwindsource", trackedRace.getWindSource().toString());
Map<String, WindTrackInfoDAO> windTrackInfoDAOs = new HashMap<String, WindTrackInfoDAO>();
result.windTrackInfoByWindSourceName = windTrackInfoDAOs;
for (WindSource windSource : WindSource.values()) {
WindTrackInfoDAO windTrackInfoDAO = new WindTrackInfoDAO();
windTrackInfoDAO.windFixes = new ArrayList<WindDAO>();
windTrackInfoDAOs.put(windSource.name(), windTrackInfoDAO);
WindTrack windTrack = trackedRace.getWindTrack(windSource);
windTrackInfoDAO.dampeningIntervalInMilliseconds = windTrack.getMillisecondsOverWhichToAverageWind();
Iterator<Wind> windIter = windTrack.getFixesIterator(from, /* inclusive */true);
while (windIter.hasNext()) {
Wind wind = windIter.next();
if (wind.getTimePoint().compareTo(to) > 0) {
break;
}
WindDAO windDAO = new WindDAO();
windDAO.trueWindBearingDeg = wind.getBearing().getDegrees();
windDAO.trueWindFromDeg = wind.getBearing().reverse().getDegrees();
windDAO.trueWindSpeedInKnots = wind.getBearing().getDegrees();
windDAO.trueWindSpeedInMetersPerSecond = wind.getMetersPerSecond();
if (wind.getPosition() != null) {
windDAO.position = new PositionDAO(wind.getPosition().getLatDeg(), wind.getPosition().getLngDeg());
}
windTrackInfoDAO.windFixes.add(windDAO);
if (wind.getTimePoint() != null) {
windDAO.timepoint = wind.getTimePoint().asMillis();
Wind estimatedWind = windTrack.getEstimatedWind(wind.getPosition(), wind.getTimePoint());
windDAO.dampenedTrueWindBearingDeg = estimatedWind.getBearing().getDegrees();
windDAO.dampenedTrueWindSpeedInKnots = estimatedWind.getKnots();
windDAO.dampenedTrueWindSpeedInMetersPerSecond = estimatedWind.getMetersPerSecond();
}
}
}
return result;
}
@Override
public void setWind(String eventName, String raceName, WindDAO windDAO) {
Event event = service.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());
}
}
Wind wind = new WindImpl(p, at, speedWithBearing);
service.getDomainFactory().getTrackedEvent(event).getTrackedRace(race).recordWind(wind, WindSource.WEB);
}
}
@@ -0,0 +1,74 @@
package com.sap.sailing.gwt.ui.shared;
import com.google.gwt.user.client.rpc.IsSerializable;
public class Pair<A, B> implements IsSerializable {
private A a;
private B b;
private int hashCode;
public Pair( A a, B b ) {
this.a = a;
this.b = b;
hashCode = 0;
}
public void setA( A a ) {
this.a = a;
hashCode = 0;
}
public A getA( ) {
return a;
}
public void setB( B b ) {
this.b = b;
hashCode = 0;
}
public B getB( ) {
return b;
}
@Override
public int hashCode( ) {
if ( hashCode == 0 ) {
hashCode = 17;
hashCode = 37 * hashCode + ( a != null ? a.hashCode( ) : 0 );
hashCode = 37 * hashCode + ( b != null ? b.hashCode( ) : 0 );
}
return hashCode;
}
@Override
public boolean equals( Object obj ) {
boolean result;
if ( this == obj ) {
result = true;
} else if ( obj instanceof Pair<?, ?> ) {
Pair<?, ?> pair = (Pair<?, ?>) obj;
result = ( this.a != null && this.a.equals( pair.a ) || this.a == null && pair.a == null ) && ( this.b != null && this.b.equals( pair.b ) || this.b == null && pair.b == null );
} else {
result = false;
}
return result;
}
@Override
public String toString( ) {
return "[" + (a==null?"null":a.toString( )) + ", " +
(b==null?"null":b.toString( )) + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
}
@@ -0,0 +1,16 @@
package com.sap.sailing.gwt.ui.shared;
import com.google.gwt.user.client.rpc.IsSerializable;
public class PositionDAO implements IsSerializable {
public double latDeg;
public double lngDeg;
public PositionDAO() {}
public PositionDAO(double latDeg, double lngDeg) {
this.latDeg = latDeg;
this.lngDeg = lngDeg;
}
}
@@ -0,0 +1,17 @@
package com.sap.sailing.gwt.ui.shared;
import com.google.gwt.user.client.rpc.IsSerializable;
public class WindDAO implements IsSerializable {
public Double trueWindSpeedInMetersPerSecond;
public Double trueWindSpeedInKnots;
public Double trueWindBearingDeg;
public Double trueWindFromDeg;
public Double dampenedTrueWindSpeedInMetersPerSecond;
public Double dampenedTrueWindSpeedInKnots;
public Double dampenedTrueWindBearingDeg;
public PositionDAO position;
public Long timepoint;
public WindDAO() {}
}
@@ -0,0 +1,16 @@
package com.sap.sailing.gwt.ui.shared;
import java.util.List;
import com.google.gwt.user.client.rpc.IsSerializable;
public class WindInfoDAO implements IsSerializable {
public List<WindInfoForRaceDAO> windInfoForRaces;
public WindInfoDAO() {}
public WindInfoDAO(List<WindInfoForRaceDAO> windInfoForRaces) {
super();
this.windInfoForRaces = windInfoForRaces;
}
}
@@ -0,0 +1,11 @@
package com.sap.sailing.gwt.ui.shared;
import java.util.Map;
import com.google.gwt.user.client.rpc.IsSerializable;
public class WindInfoForRaceDAO implements IsSerializable {
public Map<String, WindTrackInfoDAO> windTrackInfoByWindSourceName;
public WindInfoForRaceDAO() {}
}
@@ -0,0 +1,12 @@
package com.sap.sailing.gwt.ui.shared;
import java.util.List;
import com.google.gwt.user.client.rpc.IsSerializable;
public class WindTrackInfoDAO implements IsSerializable {
public List<WindDAO> windFixes;
public long dampeningIntervalInMilliseconds;
public WindTrackInfoDAO() {}
}
@@ -1,2 +0,0 @@
serviceClass: com.sap.sailing.gwt.ui.client.SailingService
path: 71024D1E1E45536C91129D4A82525C1D.gwt.rpc
@@ -1,78 +0,0 @@
com.google.gwt.event.shared.UmbrellaException, true, true, false, false, com.google.gwt.event.shared.UmbrellaException/3104463596, 3104463596
com.google.gwt.http.client.RequestException, true, true, false, false, com.google.gwt.http.client.RequestException/190587325, 190587325
com.google.gwt.i18n.client.impl.DateRecord, true, true, true, true, com.google.gwt.i18n.client.impl.DateRecord/3220471373, 3220471373
com.google.gwt.jsonp.client.TimeoutException, true, true, false, false, com.google.gwt.jsonp.client.TimeoutException/1112787596, 1112787596
com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException, true, true, true, true, com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException/3936916533, 3936916533
com.google.gwt.user.client.rpc.InvocationException, true, false, false, false, com.google.gwt.user.client.rpc.InvocationException/1510557512, 1510557512
com.google.gwt.user.client.rpc.RpcTokenException, true, true, false, false, com.google.gwt.user.client.rpc.RpcTokenException/2345075298, 2345075298
com.google.gwt.user.client.rpc.SerializableException, true, true, false, false, com.google.gwt.user.client.rpc.SerializableException/3047383460, 3047383460
com.google.gwt.user.client.rpc.SerializationException, true, true, false, false, com.google.gwt.user.client.rpc.SerializationException/2836333220, 2836333220
com.google.gwt.user.client.rpc.ServiceDefTarget$NoServiceEntryPointSpecifiedException, true, true, false, false, com.google.gwt.user.client.rpc.ServiceDefTarget$NoServiceEntryPointSpecifiedException/3408313447, 3408313447
com.google.gwt.user.client.rpc.XsrfToken, false, false, true, true, com.google.gwt.user.client.rpc.XsrfToken/4254043109, 4254043109
com.google.web.bindery.event.shared.UmbrellaException, true, true, false, false, com.google.web.bindery.event.shared.UmbrellaException/1025846929, 1025846929
com.sap.sailing.gwt.ui.client.SailingService, false, false, false, false, _, 2610738066
com.sap.sailing.gwt.ui.shared.BoatClassDAO, true, true, false, false, com.sap.sailing.gwt.ui.shared.BoatClassDAO/876059280, 876059280
com.sap.sailing.gwt.ui.shared.CompetitorDAO, true, true, false, false, com.sap.sailing.gwt.ui.shared.CompetitorDAO/1117883818, 1117883818
[Lcom.sap.sailing.gwt.ui.shared.CompetitorDAO;, true, true, false, false, [Lcom.sap.sailing.gwt.ui.shared.CompetitorDAO;/681863127, 681863127
com.sap.sailing.gwt.ui.shared.EventDAO, true, true, false, false, com.sap.sailing.gwt.ui.shared.EventDAO/4067968685, 4067968685
[Lcom.sap.sailing.gwt.ui.shared.EventDAO;, true, true, false, false, [Lcom.sap.sailing.gwt.ui.shared.EventDAO;/887606509, 887606509
com.sap.sailing.gwt.ui.shared.RaceDAO, true, true, false, false, com.sap.sailing.gwt.ui.shared.RaceDAO/3981862063, 3981862063
[Lcom.sap.sailing.gwt.ui.shared.RaceDAO;, true, true, false, false, [Lcom.sap.sailing.gwt.ui.shared.RaceDAO;/1871712056, 1871712056
com.sap.sailing.gwt.ui.shared.RaceRecordDAO, true, true, true, true, com.sap.sailing.gwt.ui.shared.RaceRecordDAO/3506849265, 3506849265
[Lcom.sap.sailing.gwt.ui.shared.RaceRecordDAO;, true, true, false, false, [Lcom.sap.sailing.gwt.ui.shared.RaceRecordDAO;/2905316035, 2905316035
com.sap.sailing.gwt.ui.shared.RegattaDAO, true, true, false, false, com.sap.sailing.gwt.ui.shared.RegattaDAO/1020702142, 1020702142
[Lcom.sap.sailing.gwt.ui.shared.RegattaDAO;, true, true, false, false, [Lcom.sap.sailing.gwt.ui.shared.RegattaDAO;/821437198, 821437198
com.sap.sailing.gwt.ui.shared.TracTracConfigurationDAO, true, true, false, false, com.sap.sailing.gwt.ui.shared.TracTracConfigurationDAO/1734357729, 1734357729
[Lcom.sap.sailing.gwt.ui.shared.TracTracConfigurationDAO;, true, true, false, false, [Lcom.sap.sailing.gwt.ui.shared.TracTracConfigurationDAO;/3836669265, 3836669265
java.io.IOException, true, true, false, false, java.io.IOException/1159940531, 1159940531
java.io.UnsupportedEncodingException, true, true, false, false, java.io.UnsupportedEncodingException/1526756933, 1526756933
java.lang.ArithmeticException, true, true, false, false, java.lang.ArithmeticException/1539622151, 1539622151
java.lang.ArrayIndexOutOfBoundsException, true, true, false, false, java.lang.ArrayIndexOutOfBoundsException/600550433, 600550433
java.lang.ArrayStoreException, true, true, false, false, java.lang.ArrayStoreException/3540507190, 3540507190
java.lang.AssertionError, true, true, false, false, java.lang.AssertionError/3490171458, 3490171458
java.lang.Boolean, true, true, false, false, java.lang.Boolean/476441737, 476441737
java.lang.ClassCastException, true, true, false, false, java.lang.ClassCastException/702295179, 702295179
java.lang.Error, true, true, false, false, java.lang.Error/1331973429, 1331973429
java.lang.Exception, true, true, true, false, java.lang.Exception/1920171873, 1920171873
java.lang.IllegalArgumentException, true, true, false, false, java.lang.IllegalArgumentException/1755012560, 1755012560
java.lang.IllegalStateException, true, true, false, false, java.lang.IllegalStateException/1972187323, 1972187323
java.lang.IndexOutOfBoundsException, true, true, false, false, java.lang.IndexOutOfBoundsException/2489527753, 2489527753
java.lang.NegativeArraySizeException, true, true, false, false, java.lang.NegativeArraySizeException/3846860241, 3846860241
java.lang.NullPointerException, true, true, false, false, java.lang.NullPointerException/1463492344, 1463492344
java.lang.NumberFormatException, true, true, false, false, java.lang.NumberFormatException/3305228476, 3305228476
java.lang.RuntimeException, true, true, true, false, java.lang.RuntimeException/515124647, 515124647
java.lang.String, true, true, true, true, java.lang.String/2004016611, 2004016611
java.lang.StringIndexOutOfBoundsException, true, true, false, false, java.lang.StringIndexOutOfBoundsException/500777603, 500777603
java.lang.Throwable, true, true, true, false, java.lang.Throwable/2953622131, 2953622131
java.lang.UnsupportedOperationException, true, true, false, false, java.lang.UnsupportedOperationException/3744010015, 3744010015
java.lang.annotation.AnnotationFormatError, true, true, false, false, java.lang.annotation.AnnotationFormatError/2257184627, 2257184627
java.lang.annotation.AnnotationTypeMismatchException, true, true, false, false, java.lang.annotation.AnnotationTypeMismatchException/976205828, 976205828
java.security.DigestException, true, true, false, false, java.security.DigestException/629316798, 629316798
java.security.GeneralSecurityException, true, true, false, false, java.security.GeneralSecurityException/2669239907, 2669239907
java.security.NoSuchAlgorithmException, true, true, false, false, java.security.NoSuchAlgorithmException/2892037213, 2892037213
java.sql.Date, true, true, true, true, java.sql.Date/730999118, 730999118
java.sql.Time, true, true, true, true, java.sql.Time/1816797103, 1816797103
java.sql.Timestamp, true, true, true, true, java.sql.Timestamp/3040052672, 3040052672
java.util.ArrayList, true, true, false, false, java.util.ArrayList/4159755760, 4159755760
java.util.Arrays$ArrayList, true, true, false, false, java.util.Arrays$ArrayList/2507071751, 2507071751
java.util.Collections$EmptyList, true, true, false, false, java.util.Collections$EmptyList/4157118744, 4157118744
java.util.Collections$EmptySet, true, true, false, false, java.util.Collections$EmptySet/3523698179, 3523698179
java.util.Collections$SingletonList, true, true, false, false, java.util.Collections$SingletonList/1586180994, 1586180994
java.util.ConcurrentModificationException, true, true, false, false, java.util.ConcurrentModificationException/2717383897, 2717383897
java.util.Date, true, true, true, true, java.util.Date/3385151746, 3385151746
java.util.EmptyStackException, true, true, false, false, java.util.EmptyStackException/89438517, 89438517
java.util.HashSet, true, true, false, false, java.util.HashSet/3273092938, 3273092938
java.util.LinkedHashSet, true, true, false, false, java.util.LinkedHashSet/1826081506, 1826081506
java.util.LinkedList, true, true, false, false, java.util.LinkedList/3953877921, 3953877921
java.util.NoSuchElementException, true, true, false, false, java.util.NoSuchElementException/1559248883, 1559248883
java.util.Stack, true, true, false, false, java.util.Stack/1346942793, 1346942793
java.util.TooManyListenersException, true, true, false, false, java.util.TooManyListenersException/2023078032, 2023078032
java.util.TreeMap, true, true, false, false, java.util.TreeMap/1493889780, 1493889780
java.util.TreeSet, true, true, false, false, java.util.TreeSet/4043497002, 4043497002
java.util.Vector, true, true, false, false, java.util.Vector/3057315478, 3057315478
javax.validation.ConstraintDeclarationException, true, true, false, false, javax.validation.ConstraintDeclarationException/3610544007, 3610544007
javax.validation.ConstraintDefinitionException, true, true, false, false, javax.validation.ConstraintDefinitionException/3732439488, 3732439488
javax.validation.ConstraintViolationException, true, true, false, false, javax.validation.ConstraintViolationException/173345760, 173345760
javax.validation.GroupDefinitionException, true, true, false, false, javax.validation.GroupDefinitionException/4024780846, 4024780846
javax.validation.UnexpectedTypeException, true, true, false, false, javax.validation.UnexpectedTypeException/593026390, 593026390
javax.validation.ValidationException, true, true, false, false, javax.validation.ValidationException/1570221831, 1570221831
@@ -1,4 +1,4 @@
function com_sap_sailing_gwt_ui_AdminConsole(){var O='',vb='" for "gwt:onLoadErrorFn"',tb='" for "gwt:onPropertyErrorFn"',hb='"><\/script>',Y='#',Vb='.cache.html',$='/',Ob='065EB70609FB41D7CD835BB23B07BF98',Pb='339AE597D04A89C76E21AEFC343AF097',Qb='38AD959FDAAB70FAED5A96E2CB2E9D23',Rb='9AFB228AFCF1B1ECC119B24A89EB8694',Ub=':',nb='::',bc='<script defer="defer">com_sap_sailing_gwt_ui_AdminConsole.onInjectionDone(\'com.sap.sailing.gwt.ui.AdminConsole\')<\/script>',gb='<script id="',qb='=',Z='?',Sb='B70C47309E7B309548C1C833D0F6A7D5',sb='Bad handler "',ac='DOMContentLoaded',Tb='E38DFF1ED0CF1D92C9706EB9D79F0D2C',ib='SCRIPT',fb='__gwt_marker_com.sap.sailing.gwt.ui.AdminConsole',jb='base',bb='baseUrl',S='begin',R='bootstrap',ab='clear.cache.gif',P='com.sap.sailing.gwt.ui.AdminConsole',db='com.sap.sailing.gwt.ui.AdminConsole.nocache.js',mb='com.sap.sailing.gwt.ui.AdminConsole::',pb='content',X='end',Ib='gecko',Jb='gecko1_8',T='gwt.codesvr=',U='gwt.hosted=',V='gwt.hybrid',Wb='gwt/clean/clean.css',ub='gwt:onLoadErrorFn',rb='gwt:onPropertyErrorFn',ob='gwt:property',_b='head',Mb='hosted.html?com_sap_sailing_gwt_ui_AdminConsole',$b='href',Hb='ie6',Gb='ie8',Fb='ie9',wb='iframe',_='img',xb="javascript:''",Xb='link',Lb='loadExternalRefs',kb='meta',zb='moduleRequested',W='moduleStartup',Eb='msie',lb='name',Bb='opera',yb='position:absolute;width:0;height:0;border:none',Yb='rel',Db='safari',cb='script',Nb='selectingPermutation',Q='startup',Zb='stylesheet',eb='undefined',Kb='unknown',Ab='user.agent',Cb='webkit';var l=window,m=document,n=l.__gwtStatsEvent?function(a){return l.__gwtStatsEvent(a)}:null,o=l.__gwtStatsSessionId?l.__gwtStatsSessionId:null,p,q,r,s=O,t={},u=[],v=[],w=[],x=0,y,z;n&&n({moduleName:P,sessionId:o,subSystem:Q,evtGroup:R,millis:(new Date).getTime(),type:S});if(!l.__gwt_stylesLoaded){l.__gwt_stylesLoaded={}}if(!l.__gwt_scriptsLoaded){l.__gwt_scriptsLoaded={}}function A(){var b=false;try{var c=l.location.search;return (c.indexOf(T)!=-1||(c.indexOf(U)!=-1||l.external&&l.external.gwtOnLoad))&&c.indexOf(V)==-1}catch(a){}A=function(){return b};return b}
function com_sap_sailing_gwt_ui_AdminConsole(){var O='',vb='" for "gwt:onLoadErrorFn"',tb='" for "gwt:onPropertyErrorFn"',hb='"><\/script>',Y='#',Vb='.cache.html',$='/',Ob='0C8F5763011319D284DC41D4CFB768D2',Pb='349C9D0A56EE5A4AB7610A2E28B4F66C',Qb='6C62904521EC8EE12DA765042129A819',Ub=':',nb='::',bc='<script defer="defer">com_sap_sailing_gwt_ui_AdminConsole.onInjectionDone(\'com.sap.sailing.gwt.ui.AdminConsole\')<\/script>',gb='<script id="',qb='=',Z='?',Rb='BEC4F3F8B89EF2802F217CE589CC9692',sb='Bad handler "',ac='DOMContentLoaded',Sb='F2C0230A09556ECBDDEA83BB4ADF8F2C',Tb='FCD5B88FFF90DAC9778E029276824ED4',ib='SCRIPT',fb='__gwt_marker_com.sap.sailing.gwt.ui.AdminConsole',jb='base',bb='baseUrl',S='begin',R='bootstrap',ab='clear.cache.gif',P='com.sap.sailing.gwt.ui.AdminConsole',db='com.sap.sailing.gwt.ui.AdminConsole.nocache.js',mb='com.sap.sailing.gwt.ui.AdminConsole::',pb='content',X='end',Ib='gecko',Jb='gecko1_8',T='gwt.codesvr=',U='gwt.hosted=',V='gwt.hybrid',Wb='gwt/clean/clean.css',ub='gwt:onLoadErrorFn',rb='gwt:onPropertyErrorFn',ob='gwt:property',_b='head',Mb='hosted.html?com_sap_sailing_gwt_ui_AdminConsole',$b='href',Hb='ie6',Gb='ie8',Fb='ie9',wb='iframe',_='img',xb="javascript:''",Xb='link',Lb='loadExternalRefs',kb='meta',zb='moduleRequested',W='moduleStartup',Eb='msie',lb='name',Bb='opera',yb='position:absolute;width:0;height:0;border:none',Yb='rel',Db='safari',cb='script',Nb='selectingPermutation',Q='startup',Zb='stylesheet',eb='undefined',Kb='unknown',Ab='user.agent',Cb='webkit';var l=window,m=document,n=l.__gwtStatsEvent?function(a){return l.__gwtStatsEvent(a)}:null,o=l.__gwtStatsSessionId?l.__gwtStatsSessionId:null,p,q,r,s=O,t={},u=[],v=[],w=[],x=0,y,z;n&&n({moduleName:P,sessionId:o,subSystem:Q,evtGroup:R,millis:(new Date).getTime(),type:S});if(!l.__gwt_stylesLoaded){l.__gwt_stylesLoaded={}}if(!l.__gwt_scriptsLoaded){l.__gwt_scriptsLoaded={}}function A(){var b=false;try{var c=l.location.search;return (c.indexOf(T)!=-1||(c.indexOf(U)!=-1||l.external&&l.external.gwtOnLoad))&&c.indexOf(V)==-1}catch(a){}A=function(){return b};return b}
function B(){if(p&&q){var b=m.getElementById(P);var c=b.contentWindow;if(A()){c.__gwt_getProperty=function(a){return G(a)}}com_sap_sailing_gwt_ui_AdminConsole=null;c.gwtOnLoad(y,P,s,x);n&&n({moduleName:P,sessionId:o,subSystem:Q,evtGroup:W,millis:(new Date).getTime(),type:X})}}
function C(){function e(a){var b=a.lastIndexOf(Y);if(b==-1){b=a.length}var c=a.indexOf(Z);if(c==-1){c=a.length}var d=a.lastIndexOf($,Math.min(c,b));return d>=0?a.substring(0,d+1):O}
function f(a){if(a.match(/^\w+:\/\//)){}else{var b=m.createElement(_);b.src=a+ab;a=e(b.src)}return a}
@@ -12,6 +12,6 @@ function E(a){var b=t[a];return b==null?null:b}
function F(a,b){var c=w;for(var d=0,e=a.length-1;d<e;++d){c=c[a[d]]||(c[a[d]]=[])}c[a[e]]=b}
function G(a){var b=v[a](),c=u[a];if(b in c){return b}var d=[];for(var e in c){d[c[e]]=e}if(z){z(a,d,b)}throw null}
var H;function I(){if(!H){H=true;var a=m.createElement(wb);a.src=xb;a.id=P;a.style.cssText=yb;a.tabIndex=-1;m.body.appendChild(a);n&&n({moduleName:P,sessionId:o,subSystem:Q,evtGroup:W,millis:(new Date).getTime(),type:zb});a.contentWindow.location.replace(s+K)}}
v[Ab]=function(){var b=navigator.userAgent.toLowerCase();var c=function(a){return parseInt(a[1])*1000+parseInt(a[2])};if(function(){return b.indexOf(Bb)!=-1}())return Bb;if(function(){return b.indexOf(Cb)!=-1}())return Db;if(function(){return b.indexOf(Eb)!=-1&&m.documentMode>=9}())return Fb;if(function(){return b.indexOf(Eb)!=-1&&m.documentMode>=8}())return Gb;if(function(){var a=/msie ([0-9]+)\.([0-9]+)/.exec(b);if(a&&a.length==3)return c(a)>=6000}())return Hb;if(function(){return b.indexOf(Ib)!=-1}())return Jb;return Kb};u[Ab]={gecko1_8:0,ie6:1,ie8:2,ie9:3,opera:4,safari:5};com_sap_sailing_gwt_ui_AdminConsole.onScriptLoad=function(){if(H){q=true;B()}};com_sap_sailing_gwt_ui_AdminConsole.onInjectionDone=function(){p=true;n&&n({moduleName:P,sessionId:o,subSystem:Q,evtGroup:Lb,millis:(new Date).getTime(),type:X});B()};D();C();var J;var K;if(A()){if(l.external&&(l.external.initModule&&l.external.initModule(P))){l.location.reload();return}K=Mb;J=O}n&&n({moduleName:P,sessionId:o,subSystem:Q,evtGroup:R,millis:(new Date).getTime(),type:Nb});if(!A()){try{F([Hb],Ob);F([Fb],Pb);F([Db],Qb);F([Bb],Rb);F([Gb],Sb);F([Jb],Tb);J=w[G(Ab)];var L=J.indexOf(Ub);if(L!=-1){x=Number(J.substring(L+1));J=J.substring(0,L)}K=J+Vb}catch(a){return}}var M;function N(){if(!r){r=true;if(!__gwt_stylesLoaded[Wb]){var a=m.createElement(Xb);__gwt_stylesLoaded[Wb]=a;a.setAttribute(Yb,Zb);a.setAttribute($b,s+Wb);m.getElementsByTagName(_b)[0].appendChild(a)}B();if(m.removeEventListener){m.removeEventListener(ac,N,false)}if(M){clearInterval(M)}}}
v[Ab]=function(){var b=navigator.userAgent.toLowerCase();var c=function(a){return parseInt(a[1])*1000+parseInt(a[2])};if(function(){return b.indexOf(Bb)!=-1}())return Bb;if(function(){return b.indexOf(Cb)!=-1}())return Db;if(function(){return b.indexOf(Eb)!=-1&&m.documentMode>=9}())return Fb;if(function(){return b.indexOf(Eb)!=-1&&m.documentMode>=8}())return Gb;if(function(){var a=/msie ([0-9]+)\.([0-9]+)/.exec(b);if(a&&a.length==3)return c(a)>=6000}())return Hb;if(function(){return b.indexOf(Ib)!=-1}())return Jb;return Kb};u[Ab]={gecko1_8:0,ie6:1,ie8:2,ie9:3,opera:4,safari:5};com_sap_sailing_gwt_ui_AdminConsole.onScriptLoad=function(){if(H){q=true;B()}};com_sap_sailing_gwt_ui_AdminConsole.onInjectionDone=function(){p=true;n&&n({moduleName:P,sessionId:o,subSystem:Q,evtGroup:Lb,millis:(new Date).getTime(),type:X});B()};D();C();var J;var K;if(A()){if(l.external&&(l.external.initModule&&l.external.initModule(P))){l.location.reload();return}K=Mb;J=O}n&&n({moduleName:P,sessionId:o,subSystem:Q,evtGroup:R,millis:(new Date).getTime(),type:Nb});if(!A()){try{F([Hb],Ob);F([Jb],Pb);F([Db],Qb);F([Fb],Rb);F([Gb],Sb);F([Bb],Tb);J=w[G(Ab)];var L=J.indexOf(Ub);if(L!=-1){x=Number(J.substring(L+1));J=J.substring(0,L)}K=J+Vb}catch(a){return}}var M;function N(){if(!r){r=true;if(!__gwt_stylesLoaded[Wb]){var a=m.createElement(Xb);__gwt_stylesLoaded[Wb]=a;a.setAttribute(Yb,Zb);a.setAttribute($b,s+Wb);m.getElementsByTagName(_b)[0].appendChild(a)}B();if(m.removeEventListener){m.removeEventListener(ac,N,false)}if(M){clearInterval(M)}}}
if(m.addEventListener){m.addEventListener(ac,function(){I();N()},false)}var M=setInterval(function(){if(/loaded|complete/.test(m.readyState)){I();N()}},50);n&&n({moduleName:P,sessionId:o,subSystem:Q,evtGroup:R,millis:(new Date).getTime(),type:X});n&&n({moduleName:P,sessionId:o,subSystem:Q,evtGroup:Lb,millis:(new Date).getTime(),type:S});m.write(bc)}
com_sap_sailing_gwt_ui_AdminConsole();
@@ -18,10 +18,10 @@
</listAttribute>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog -console"/>
<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Declipse.ignoreApp=true -Dosgi.noShutdown=true -Dorg.osgi.service.http.port=8888 -Xmx4096m"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Declipse.ignoreApp=true -Dosgi.noShutdown=true -Dorg.osgi.service.http.port=8888 -Dexpedition.udp.port=2010 -Xmx4096m"/>
<stringAttribute key="pde.version" value="3.3"/>
<booleanAttribute key="show_selected_only" value="false"/>
<stringAttribute key="target_bundles" value="javax.servlet.jsp@default:default,javax.servlet@default:default,org.apache.ant@default:default,org.apache.commons.el@default:default,org.apache.commons.logging@default:default,org.apache.jasper@default:default,org.eclipse.core.jobs@default:default,org.eclipse.core.runtime.compatibility.registry@default:false,org.eclipse.equinox.common@2:true,org.eclipse.equinox.http.jetty@default:default,org.eclipse.equinox.http.registry@default:default,org.eclipse.equinox.http.servlet@default:default,org.eclipse.equinox.registry@default:default,org.eclipse.equinox.util@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi.util@default:default,org.eclipse.osgi@-1:true,org.hamcrest.core@default:default,org.junit*3.8.2.v3_8_2_v20100427-1100@default:default,org.junit*4.8.2.v4_8_2_v20110321-1705@default:default,org.junit4@default:default,org.mortbay.jetty.server@default:default,org.mortbay.jetty.util@default:default"/>
<stringAttribute key="target_bundles" value="javax.servlet.jsp@default:default,javax.servlet@default:default,org.apache.ant@default:default,org.apache.commons.el@default:default,org.apache.commons.logging@default:default,org.apache.jasper@default:default,org.eclipse.core.jobs@default:default,org.eclipse.core.runtime.compatibility.registry@default:false,org.eclipse.equinox.common@2:true,org.eclipse.equinox.http.jetty@default:default,org.eclipse.equinox.http.registry@default:default,org.eclipse.equinox.http.servlet@default:default,org.eclipse.equinox.registry@default:default,org.eclipse.equinox.util@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi.util@default:default,org.eclipse.osgi@-1:true,org.eclipse.update.configurator@3:true,org.hamcrest.core@default:default,org.junit*3.8.2.v3_8_2_v20100427-1100@default:default,org.junit*4.8.2.v4_8_2_v20110321-1705@default:default,org.junit4@default:default,org.mortbay.jetty.server@default:default,org.mortbay.jetty.util@default:default"/>
<booleanAttribute key="tracing" value="false"/>
<booleanAttribute key="useCustomFeatures" value="false"/>
<booleanAttribute key="useDefaultConfigArea" value="true"/>
@@ -17,7 +17,7 @@
</listAttribute>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog -console"/>
<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Declipse.ignoreApp=true -Dosgi.noShutdown=true -Dhttp.proxyHost=proxy.wdf.sap.corp -Dhttp.proxyPort=8080&#13;&#10;-Dorg.osgi.service.http.port=8888 -Xmx4096m"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Declipse.ignoreApp=true -Dosgi.noShutdown=true -Dhttp.proxyHost=proxy.wdf.sap.corp -Dhttp.proxyPort=8080&#13;&#10;-Dorg.osgi.service.http.port=8888 -Dexpedition.udp.port=2010 -Xmx4096m"/>
<stringAttribute key="pde.version" value="3.3"/>
<booleanAttribute key="show_selected_only" value="false"/>
<stringAttribute key="target_bundles" value="javax.servlet.jsp@default:default,javax.servlet@default:default,org.apache.ant@default:default,org.apache.commons.el@default:default,org.apache.commons.logging@default:default,org.apache.jasper@default:default,org.eclipse.core.jobs@default:default,org.eclipse.core.runtime.compatibility.registry@default:false,org.eclipse.equinox.common@2:true,org.eclipse.equinox.http.jetty@default:default,org.eclipse.equinox.http.registry@default:default,org.eclipse.equinox.http.servlet@default:default,org.eclipse.equinox.registry@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.eclipse.update.configurator@3:true,org.junit*3.8.2.v3_8_2_v20100427-1100@default:default,org.junit*4.8.2.v4_8_2_v20110321-1705@default:default,org.junit4@default:default,org.mortbay.jetty.server@default:default,org.mortbay.jetty.util@default:default"/>