Merge branch 'master' into dev

This commit is contained in:
Axel Uhl committed 2012-07-11 17:00:00 +02:00
commit c76a8a8398
19 files changed
+563 -74

No files matched your search

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.jdt.junit.launchconfig">
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="2"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value="=com.sap.sailing.domain.test/src&lt;com.sap.sailing.domain.test"/>
<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.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/sapjvm_7"/>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value=""/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sailing.domain.test"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y -XX:+UseParallelGC -ea -Djava.util.logging.config.file=${project_loc:com.sap.sailing.server}/../target/configuration/logging_debug.properties"/>
</launchConfiguration>
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.jdt.junit.launchconfig">
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="2"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value="=com.sap.sailing.domain.test/src&lt;com.sap.sailing.domain.test"/>
<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.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/sapjvm_7"/>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value=""/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sailing.domain.test"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y -Dhttp.proxyHost=proxy -Dhttp.proxyPort=8080 -XX:+UseParallelGC -Dtractrac.tunnel=true -Dtractrac.tunnel.host=10.18.206.73 -ea -Djava.util.logging.config.file=${project_loc:com.sap.sailing.server}/../target/configuration/logging_debug.properties"/>
</launchConfiguration>
@@ -18,7 +18,8 @@ Require-Bundle: com.sap.sailing.domain,
com.sap.sailing.domain.common,
org.moxieapps.gwt.highcharts;bundle-version="1.1.4",
com.sap.sailing.geocoding,
com.sap.sailing.server.replication
com.sap.sailing.server.replication,
com.googlecode.java-diff-utils;bundle-version="1.3.0"
Bundle-Activator: com.sap.sailing.gwt.ui.server.Activator
Bundle-ActivationPolicy: lazy
Export-Package: com.sap.sailing.gwt.ui.client;x-friends:="com.sap.sailing.gwt.ui.test",
@@ -0,0 +1,82 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.List;
import com.google.gwt.user.client.ui.CaptionPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.RaceSelectionChangeListener;
import com.sap.sailing.gwt.ui.client.RaceSelectionModel;
import com.sap.sailing.gwt.ui.client.RegattaRefresher;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.RaceDTO;
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
public abstract class AbstractRaceManagementPanel extends AbstractEventManagementPanel implements RaceSelectionChangeListener {
protected RegattaAndRaceIdentifier singleSelectedRace;
protected RaceDTO selectedRaceDTO;
protected final CaptionPanel selectedCaptionRacePanel;
protected List<RegattaDTO> savedEvents;
protected final VerticalPanel selectedRaceContentPanel;
public AbstractRaceManagementPanel(final SailingServiceAsync sailingService, ErrorReporter errorReporter,
RegattaRefresher regattaRefresher, StringMessages stringMessages) {
super(sailingService, regattaRefresher, errorReporter, new RaceSelectionModel(), stringMessages);
VerticalPanel mainPanel = new VerticalPanel();
this.setWidget(mainPanel);
mainPanel.setWidth("100%");
mainPanel.add(trackedRacesListComposite);
trackedRacesListComposite.addRaceSelectionChangeListener(this);
singleSelectedRace = null;
selectedCaptionRacePanel = new CaptionPanel(stringMessages.race());
selectedCaptionRacePanel.setWidth("100%");
mainPanel.add(selectedCaptionRacePanel);
selectedRaceContentPanel = new VerticalPanel();
selectedRaceContentPanel.setWidth("100%");
selectedCaptionRacePanel.setContentWidget(selectedRaceContentPanel);
selectedCaptionRacePanel.setVisible(false);
}
abstract void refreshSelectedRaceData();
@Override
public void fillRegattas(List<RegattaDTO> result) {
trackedRacesListComposite.fillRegattas(result);
savedEvents = result;
}
@Override
public void onRaceSelectionChange(List<RegattaAndRaceIdentifier> selectedRaces) {
if (selectedRaces.size() == 1) {
singleSelectedRace = selectedRaces.get(0);
selectedCaptionRacePanel.setCaptionText(singleSelectedRace.getRaceName());
selectedCaptionRacePanel.setVisible(true);
for (RegattaDTO regatta : savedEvents) {
for (RaceDTO race : regatta.races) {
if (race != null && race.getRaceIdentifier().equals(singleSelectedRace)) {
this.selectedRaceDTO = race;
refreshSelectedRaceData();
break;
}
}
}
} else {
selectedCaptionRacePanel.setCaptionText("");
singleSelectedRace = null;
selectedCaptionRacePanel.setVisible(false);
}
}
}
@@ -51,6 +51,11 @@ public class AdminConsoleEntryPoint extends AbstractEntryPoint implements Regatt
regattaDisplayers.add(trackedRacesManagementPanel);
trackedRacesManagementPanel.setSize("90%", "90%");
tabPanel.add(trackedRacesManagementPanel, stringMessages.trackedRaces(),false);
RaceCourseManagementPanel raceCourseManagementPanel = new RaceCourseManagementPanel(sailingService, this, this, stringMessages);
regattaDisplayers.add(raceCourseManagementPanel);
raceCourseManagementPanel.setSize("90%", "90%");
tabPanel.add(raceCourseManagementPanel, stringMessages.courseLayout(),false);
final AsyncActionsExecutor asyncActionsExecutor = new AsyncActionsExecutor();
WindPanel windPanel = new WindPanel(sailingService, asyncActionsExecutor, this, this, stringMessages);
regattaDisplayers.add(windPanel);
@@ -0,0 +1,190 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.ArrayList;
import java.util.Date;
import java.util.Map;
import java.util.TreeMap;
import com.google.gwt.cell.client.SafeHtmlCell;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.user.cellview.client.CellTable;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.MultiSelectionModel;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.RegattaRefresher;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.MarkDTO;
import com.sap.sailing.gwt.ui.shared.RaceCourseDTO;
import com.sap.sailing.gwt.ui.shared.WaypointDTO;
public class RaceCourseManagementPanel extends AbstractRaceManagementPanel {
private final CellTable<WaypointDTO> courseWaypointsTable;
private final Label courseDataRequestTimeLabel;
private final ListDataProvider<WaypointDTO> waypointDataProvider;
private final HorizontalPanel courseActionsPanel;
private final MultiSelectionModel<WaypointDTO> wayPointSelectionModel;
public RaceCourseManagementPanel(final SailingServiceAsync sailingService, ErrorReporter errorReporter,
RegattaRefresher regattaRefresher, final StringMessages stringMessages) {
super(sailingService, errorReporter, regattaRefresher, stringMessages);
courseDataRequestTimeLabel = new Label();
this.selectedRaceContentPanel.add(courseDataRequestTimeLabel);
AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class);
courseWaypointsTable = new CellTable<WaypointDTO>(/* pageSize */10000, tableRes);
this.selectedRaceContentPanel.add(courseWaypointsTable);
wayPointSelectionModel = new MultiSelectionModel<WaypointDTO>();
courseWaypointsTable.setSelectionModel(wayPointSelectionModel);
TextColumn<WaypointDTO> nameColumn = new TextColumn<WaypointDTO>() {
@Override
public String getValue(WaypointDTO waypointDTO) {
return waypointDTO.name;
}
};
courseWaypointsTable.addColumn(nameColumn, stringMessages.waypoint());
final SafeHtmlCell buoysCell = new SafeHtmlCell();
Column<WaypointDTO, SafeHtml> buoysColumn = new Column<WaypointDTO, SafeHtml>(buoysCell) {
@Override
public SafeHtml getValue(WaypointDTO waypoint) {
SafeHtmlBuilder builder = new SafeHtmlBuilder();
int buoysCount = waypoint.buoys.size();
int i = 1;
for (MarkDTO mark : waypoint.buoys) {
builder.appendEscaped(mark.name + ", " + stringMessages.position() + ": " + mark.position.toFormattedString());
if (i < buoysCount) {
builder.appendHtmlConstant("<br>");
}
i++;
}
return builder.toSafeHtml();
}
};
courseWaypointsTable.addColumn(buoysColumn, stringMessages.buoys());
TextColumn<WaypointDTO> markPassingsCountColumn = new TextColumn<WaypointDTO>() {
@Override
public String getValue(WaypointDTO waypointDTO) {
return "" + waypointDTO.markPassingsCount;
}
};
courseWaypointsTable.addColumn(markPassingsCountColumn, stringMessages.markPassing());
waypointDataProvider = new ListDataProvider<WaypointDTO>();
waypointDataProvider.addDataDisplay(courseWaypointsTable);
courseActionsPanel = new HorizontalPanel();
courseActionsPanel.setSpacing(10);
Button insertLegBtn = new Button("Insert Leg");
insertLegBtn.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
if(wayPointSelectionModel.getSelectedSet().size() != 2) {
Window.alert("To insert (copy) a leg you have to select two waypoints.");
return;
} else {
Map<Integer, String> controlPointsToInsert = new TreeMap<Integer, String>();
for(WaypointDTO selectedWaypoint: wayPointSelectionModel.getSelectedSet()) {
controlPointsToInsert.put(selectedWaypoint.courseIndex, selectedWaypoint.name);
}
int insertPosition = waypointDataProvider.getList().size()-2;
sailingService.addControlPointsToRaceCourse(singleSelectedRace,
new ArrayList<String>(controlPointsToInsert.values()), insertPosition, new AsyncCallback<Void>() {
@Override
public void onSuccess(Void arg0) {
refreshSelectedRaceData();
}
@Override
public void onFailure(Throwable arg0) {
}
});
}
}
});
courseActionsPanel.add(insertLegBtn);
Button removeLegBtn = new Button("Remove Leg");
removeLegBtn.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
if(wayPointSelectionModel.getSelectedSet().size() != 2) {
Window.alert("To delete a leg you have to select two waypoints.");
return;
} else {
Map<Integer, WaypointDTO> controlPointsToDelete = new TreeMap<Integer, WaypointDTO>();
for(WaypointDTO selectedWaypoint: wayPointSelectionModel.getSelectedSet()) {
controlPointsToDelete.put(selectedWaypoint.courseIndex, selectedWaypoint);
}
sailingService.removeControlPointsFromRaceCourse(singleSelectedRace,
new ArrayList<WaypointDTO>(controlPointsToDelete.values()), new AsyncCallback<Void>() {
@Override
public void onSuccess(Void arg0) {
refreshSelectedRaceData();
}
@Override
public void onFailure(Throwable arg0) {
}
});
}
}
});
courseActionsPanel.add(removeLegBtn);
Button refreshBtn = new Button(stringMessages.refresh());
refreshBtn.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
refreshSelectedRaceData();
}
});
courseActionsPanel.add(refreshBtn);
courseActionsPanel.setVisible(false);
this.selectedRaceContentPanel.add(courseActionsPanel);
}
@Override
void refreshSelectedRaceData() {
if (singleSelectedRace != null && selectedRaceDTO != null) {
courseActionsPanel.setVisible(true);
sailingService.getRaceCourse(singleSelectedRace, new Date(), new AsyncCallback<RaceCourseDTO>() {
@Override
public void onSuccess(RaceCourseDTO result) {
updateCourseInfo(result);
}
@Override
public void onFailure(Throwable caught) {
RaceCourseManagementPanel.this.errorReporter.reportError("Error trying to obtain the course of the race: " + caught.getMessage());
}
});
} else {
courseActionsPanel.setVisible(false);
}
}
private void updateCourseInfo(RaceCourseDTO courseDTO) {
waypointDataProvider.setList(courseDTO.waypoints);
courseDataRequestTimeLabel.setText(courseDTO.requestTime.toString());
}
}
@@ -1,32 +1,18 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.Date;
import java.util.List;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat;
import com.google.gwt.i18n.client.TimeZone;
import com.google.gwt.text.client.DateTimeFormatRenderer;
import com.google.gwt.user.client.ui.CaptionPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.RaceSelectionChangeListener;
import com.sap.sailing.gwt.ui.client.RaceSelectionModel;
import com.sap.sailing.gwt.ui.client.RegattaRefresher;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.RaceDTO;
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
public class TrackedRacesManagementPanel extends AbstractEventManagementPanel implements RaceSelectionChangeListener {
private RegattaAndRaceIdentifier singleSelectedRace;
private RaceDTO selectedRaceDTO;
private final CaptionPanel selectedRacePanel;
public class TrackedRacesManagementPanel extends AbstractRaceManagementPanel {
private final DateTimeFormatRenderer dateFormatter = new DateTimeFormatRenderer(
DateTimeFormat.getFormat(PredefinedFormat.DATE_SHORT));
private final DateTimeFormatRenderer timeFormatter = new DateTimeFormatRenderer(
@@ -34,35 +20,14 @@ public class TrackedRacesManagementPanel extends AbstractEventManagementPanel im
private final DateTimeFormatRenderer durationFormatter = new DateTimeFormatRenderer(
DateTimeFormat.getFormat(PredefinedFormat.TIME_MEDIUM), TimeZone.createTimeZone(0));
private List<RegattaDTO> savedEvents;
private final Grid raceDataGrid;
public TrackedRacesManagementPanel(final SailingServiceAsync sailingService, ErrorReporter errorReporter,
RegattaRefresher regattaRefresher, StringMessages stringConstants) {
super(sailingService, regattaRefresher, errorReporter, new RaceSelectionModel(), stringConstants);
super(sailingService, errorReporter, regattaRefresher, stringConstants);
VerticalPanel mainPanel = new VerticalPanel();
this.setWidget(mainPanel);
mainPanel.setWidth("100%");
mainPanel.add(trackedRacesListComposite);
trackedRacesListComposite.addRaceSelectionChangeListener(this);
singleSelectedRace = null;
selectedRacePanel = new CaptionPanel("???");
selectedRacePanel.setWidth("100%");
mainPanel.add(selectedRacePanel);
VerticalPanel vPanel = new VerticalPanel();
vPanel.setWidth("100%");
selectedRacePanel.setContentWidget(vPanel);
selectedRacePanel.setVisible(false);
raceDataGrid = new Grid(6,2);
vPanel.add(raceDataGrid);
this.selectedRaceContentPanel.add(raceDataGrid);
raceDataGrid.setText(0, 0, "StartTime:");
raceDataGrid.setText(1, 0, "EndTime:");
@@ -73,34 +38,7 @@ public class TrackedRacesManagementPanel extends AbstractEventManagementPanel im
}
@Override
public void fillRegattas(List<RegattaDTO> result) {
trackedRacesListComposite.fillRegattas(result);
savedEvents = result;
}
public void onRaceSelectionChange(List<RegattaAndRaceIdentifier> selectedRaces) {
if (selectedRaces.size() == 1) {
singleSelectedRace = selectedRaces.get(0);
selectedRacePanel.setCaptionText(singleSelectedRace.getRaceName());
selectedRacePanel.setVisible(true);
for (RegattaDTO regatta : savedEvents) {
for (RaceDTO race : regatta.races) {
if (race != null && race.getRaceIdentifier().equals(singleSelectedRace)) {
this.selectedRaceDTO = race;
refreshRaceData();
break;
}
}
}
} else {
selectedRacePanel.setCaptionText("");
singleSelectedRace = null;
selectedRacePanel.setVisible(false);
}
}
private void refreshRaceData() {
void refreshSelectedRaceData() {
if (singleSelectedRace != null && selectedRaceDTO != null) {
if (selectedRaceDTO.startOfRace != null) {
raceDataGrid.setText(0, 1, dateFormatter.render(selectedRaceDTO.startOfRace) + " "
@@ -28,18 +28,20 @@ import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO;
import com.sap.sailing.gwt.ui.shared.ManeuverDTO;
import com.sap.sailing.gwt.ui.shared.MultiCompetitorRaceDataDTO;
import com.sap.sailing.gwt.ui.shared.QuickRankDTO;
import com.sap.sailing.gwt.ui.shared.RaceCourseDTO;
import com.sap.sailing.gwt.ui.shared.RaceDTO;
import com.sap.sailing.gwt.ui.shared.RaceMapDataDTO;
import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO;
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
import com.sap.sailing.gwt.ui.shared.ReplicationStateDTO;
import com.sap.sailing.gwt.ui.shared.RegattaScoreCorrectionDTO;
import com.sap.sailing.gwt.ui.shared.ReplicationStateDTO;
import com.sap.sailing.gwt.ui.shared.ScoreCorrectionProviderDTO;
import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO;
import com.sap.sailing.gwt.ui.shared.SwissTimingConfigurationDTO;
import com.sap.sailing.gwt.ui.shared.SwissTimingRaceRecordDTO;
import com.sap.sailing.gwt.ui.shared.TracTracConfigurationDTO;
import com.sap.sailing.gwt.ui.shared.TracTracRaceRecordDTO;
import com.sap.sailing.gwt.ui.shared.WaypointDTO;
import com.sap.sailing.gwt.ui.shared.WindDTO;
import com.sap.sailing.gwt.ui.shared.WindInfoForRaceDTO;
@@ -96,6 +98,8 @@ public interface SailingService extends RemoteService {
CourseDTO getCoursePositions(RaceIdentifier raceIdentifier, Date date);
RaceCourseDTO getRaceCourse(RaceIdentifier raceIdentifier, Date date);
List<QuickRankDTO> getQuickRanks(RaceIdentifier raceIdentifier, Date date) throws NoWindException;
void removeWind(RaceIdentifier raceIdentifier, WindDTO windDTO);
@@ -237,4 +241,8 @@ public interface SailingService extends RemoteService {
void updateLeaderboardScoreCorrectionsAndMaxPointsReasons(BulkScoreCorrectionDTO updates) throws NoWindException;
WindInfoForRaceDTO getWindSourcesInfo(RegattaAndRaceIdentifier raceIdentifier);
void removeControlPointsFromRaceCourse(RaceIdentifier raceIdentifier, List<WaypointDTO> waypointsToDelete);
void addControlPointsToRaceCourse(RaceIdentifier raceIdentifier, List<String> controlPointNames, int insertPosition);
}
@@ -20,6 +20,7 @@ import com.sap.sailing.gwt.ui.shared.BulkScoreCorrectionDTO;
import com.sap.sailing.gwt.ui.shared.CompetitorDTO;
import com.sap.sailing.gwt.ui.shared.CourseDTO;
import com.sap.sailing.gwt.ui.shared.EventDTO;
import com.sap.sailing.gwt.ui.shared.RaceCourseDTO;
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
import com.sap.sailing.gwt.ui.shared.GPSFixDTO;
import com.sap.sailing.gwt.ui.shared.LeaderboardDTO;
@@ -39,6 +40,7 @@ import com.sap.sailing.gwt.ui.shared.SwissTimingConfigurationDTO;
import com.sap.sailing.gwt.ui.shared.SwissTimingRaceRecordDTO;
import com.sap.sailing.gwt.ui.shared.TracTracConfigurationDTO;
import com.sap.sailing.gwt.ui.shared.TracTracRaceRecordDTO;
import com.sap.sailing.gwt.ui.shared.WaypointDTO;
import com.sap.sailing.gwt.ui.shared.WindDTO;
import com.sap.sailing.gwt.ui.shared.WindInfoForRaceDTO;
@@ -400,4 +402,12 @@ public interface SailingServiceAsync {
Date timePointWhenResultPublished, AsyncCallback<RegattaScoreCorrectionDTO> asyncCallback);
void getWindSourcesInfo(RegattaAndRaceIdentifier raceIdentifier, AsyncCallback<WindInfoForRaceDTO> callback);
void getRaceCourse(RaceIdentifier raceIdentifier, Date date, AsyncCallback<RaceCourseDTO> callback);
void removeControlPointsFromRaceCourse(RaceIdentifier raceIdentifier, List<WaypointDTO> waypointsToDelete,
AsyncCallback<Void> callback);
void addControlPointsToRaceCourse(RaceIdentifier raceIdentifier, List<String> controlPointNames, int insertPosition,
AsyncCallback<Void> callback);
}
@@ -339,4 +339,10 @@ public interface StringMessages extends Messages {
String regattaExistForSelectedBoatClass();
String reload();
String addRegatta();
String course();
String courseLayout();
String buoy();
String gate();
String buoys();
String waypoint();
}
@@ -337,4 +337,10 @@ Do you really want to use the regatta ''{1}''?
regattaExistForSelectedBoatClass=There is at least one regatta for the selected boat classes.\
Do you really want to use the ''no regatta'' selection?
reload=Reload
addRegatta=Add Regatta...
addRegatta=Add Regatta...
course=Course
courseLayout=Course layout
buoy=Buoy
gate=Gate
buoys=Buoys
waypoint=Waypoint
@@ -338,4 +338,10 @@ Willst du wirklich diese Regatta benutzen ''{1}''?
regattaExistForSelectedBoatClass=Es gibt mindestens eine Regatta zu den ausgewählten Bootsklassen.\
Willst du wirklich die Auswahl ''keine Regatta'' benutzen?
reload=Neu laden
addRegatta=Regatta hinzufügen...
addRegatta=Regatta hinzufügen...
course=Kurs
courseLayout=Kursdefinition
buoy=Boje
gate=Tor
buoys=Bojen
waypoint=Wegpunkt
@@ -366,7 +366,7 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
public void render(Context context, LeaderboardRowDTO object, SafeHtmlBuilder sb) {
String competitorColor = LeaderboardPanel.this.competitorSelectionProvider.getColor(object.competitor);
String competitorColorBarStyle;
if(LeaderboardPanel.this.isEmbedded) {
if (LeaderboardPanel.this.isEmbedded) {
competitorColorBarStyle = "style=\"border-bottom: 2px solid "+competitorColor+";\"";
} else {
competitorColorBarStyle = "style=\"border: none;\"";
@@ -36,7 +36,7 @@ import com.sap.sailing.gwt.ui.shared.RegattaScoreCorrectionDTO;
import com.sap.sailing.gwt.ui.shared.RegattaScoreCorrectionDTO.ScoreCorrectionEntryDTO;
public class MatchAndApplyScoreCorrectionsDialog extends DataEntryDialog<BulkScoreCorrectionDTO> {
private static final RegExp p = RegExp.compile("^([A-Z][A-Z][A-Z])[^0-9]*([0-9]*)$");
private static final RegExp p = RegExp.compile("^([A-Z][A-Z][A-Z])\\s*[^0-9]*([0-9]*)$");
private static final double MEDAL_RACE_FACTOR = 2;
@@ -196,6 +196,10 @@ public class MatchAndApplyScoreCorrectionsDialog extends DataEntryDialog<BulkSco
}
}
/**
* Try to match three-letter country code and number, optionally separated by whitespaces. If there is no match,
* use the first 20 characters of the sailID.
*/
private String canonicalizeSailID(String sailID, String defaultNationality) {
String result = null;
MatchResult m = p.exec(sailID.trim());
@@ -209,6 +213,9 @@ public class MatchAndApplyScoreCorrectionsDialog extends DataEntryDialog<BulkSco
result = iocCode + number;
}
}
if (result == null) {
result = sailID.substring(0, Math.min(20, sailID.length()));
}
return result;
}
@@ -40,6 +40,7 @@ import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Buoy;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.ControlPoint;
import com.sap.sailing.domain.base.Course;
import com.sap.sailing.domain.base.Event;
import com.sap.sailing.domain.base.Fleet;
@@ -144,6 +145,7 @@ import com.sap.sailing.gwt.ui.shared.PlacemarkOrderDTO;
import com.sap.sailing.gwt.ui.shared.PositionDTO;
import com.sap.sailing.gwt.ui.shared.QuickRankDTO;
import com.sap.sailing.gwt.ui.shared.RaceColumnDTO;
import com.sap.sailing.gwt.ui.shared.RaceCourseDTO;
import com.sap.sailing.gwt.ui.shared.RaceDTO;
import com.sap.sailing.gwt.ui.shared.RaceMapDataDTO;
import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO;
@@ -163,6 +165,7 @@ import com.sap.sailing.gwt.ui.shared.SwissTimingRaceRecordDTO;
import com.sap.sailing.gwt.ui.shared.TracTracConfigurationDTO;
import com.sap.sailing.gwt.ui.shared.TracTracRaceRecordDTO;
import com.sap.sailing.gwt.ui.shared.VenueDTO;
import com.sap.sailing.gwt.ui.shared.WaypointDTO;
import com.sap.sailing.gwt.ui.shared.WindDTO;
import com.sap.sailing.gwt.ui.shared.WindInfoForRaceDTO;
import com.sap.sailing.gwt.ui.shared.WindTrackInfoDTO;
@@ -1377,7 +1380,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
result.waypointPositions = new ArrayList<PositionDTO>();
Set<Buoy> buoys = new HashSet<Buoy>();
Course course = trackedRace.getRace().getCourse();
for (Waypoint waypoint : course.getWaypoints()) {
for (Waypoint waypoint : course.getWaypoints()) {
Position waypointPosition = trackedRace.getApproximatePosition(waypoint, dateAsTimePoint);
if (waypointPosition != null) {
result.waypointPositions.add(new PositionDTO(waypointPosition.getLatDeg(), waypointPosition.getLngDeg()));
@@ -1404,12 +1407,100 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
Waypoint lastWaypoint = course.getLastWaypoint();
if (lastWaypoint != null) {
result.finishBuoyPositions = getBuoyPositionDTOs(dateAsTimePoint, trackedRace, lastWaypoint);
}
}
}
}
return result;
}
@Override
public RaceCourseDTO getRaceCourse(RaceIdentifier raceIdentifier, Date date) {
RaceCourseDTO result = new RaceCourseDTO();
if (date != null) {
TimePoint dateAsTimePoint = new MillisecondsTimePoint(date);
TrackedRace trackedRace = getExistingTrackedRace(raceIdentifier);
if (trackedRace != null) {
Course course = trackedRace.getRace().getCourse();
result.waypoints = new ArrayList<WaypointDTO>();
result.requestTime = date;
int waypointIndex = 0;
for (Waypoint waypoint : course.getWaypoints()) {
WaypointDTO waypointDTO = new WaypointDTO(waypoint.getName(), waypointIndex++);
waypointDTO.buoys = new ArrayList<MarkDTO>();
result.waypoints.add(waypointDTO);
Iterable<MarkPassing> markPassingsInOrder = trackedRace.getMarkPassingsInOrder(waypoint);
waypointDTO.markPassingsCount = Util.size(markPassingsInOrder);
for (Buoy buoy : waypoint.getBuoys()) {
GPSFixTrack<Buoy, GPSFix> track = trackedRace.getOrCreateTrack(buoy);
Position positionAtDate = track.getEstimatedPosition(dateAsTimePoint, /* extrapolate */false);
if (positionAtDate != null) {
MarkDTO markDTO = new MarkDTO(buoy.getName(), positionAtDate.getLatDeg(),
positionAtDate.getLngDeg());
waypointDTO.buoys.add(markDTO);
}
}
}
}
}
return result;
}
@Override
public void addControlPointsToRaceCourse(RaceIdentifier raceIdentifier, List<String> controlPointNames, int insertPosition) {
TrackedRace trackedRace = getExistingTrackedRace(raceIdentifier);
if (trackedRace != null) {
Course course = trackedRace.getRace().getCourse();
Iterable<Waypoint> waypoints = course.getWaypoints();
Map<String, ControlPoint> controlPointsByName = new HashMap<String, ControlPoint>();
int waypointsCount = Util.size(waypoints);
if(waypointsCount >= 3) {
List<ControlPoint> newControlPoints = new ArrayList<ControlPoint>();
for (Waypoint wayPoint : waypoints) {
ControlPoint controlPoint = wayPoint.getControlPoint();
newControlPoints.add(controlPoint);
controlPointsByName.put(controlPoint.getName(), controlPoint);
}
for(String controlPointName: controlPointNames) {
ControlPoint controlPointToInsert = controlPointsByName.get(controlPointName);
if(controlPointToInsert != null) {
newControlPoints.add(insertPosition, controlPointToInsert);
}
}
try {
course.update(newControlPoints, com.sap.sailing.domain.base.DomainFactory.INSTANCE);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
@Override
public void removeControlPointsFromRaceCourse(RaceIdentifier raceIdentifier, List<WaypointDTO> waypointsToDelete) {
TrackedRace trackedRace = getExistingTrackedRace(raceIdentifier);
if (trackedRace != null) {
Course course = trackedRace.getRace().getCourse();
Iterable<Waypoint> waypoints = course.getWaypoints();
List<ControlPoint> newControlPoints = new ArrayList<ControlPoint>();
for (Waypoint wayPoint : waypoints) {
newControlPoints.add(wayPoint.getControlPoint());
}
int indexOffset = 0;
for(WaypointDTO waypointToRemove: waypointsToDelete) {
newControlPoints.remove(waypointToRemove.courseIndex - indexOffset);
indexOffset++;
}
try {
course.update(newControlPoints, com.sap.sailing.domain.base.DomainFactory.INSTANCE);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
private List<PositionDTO> getBuoyPositionDTOs(TimePoint timePoint, TrackedRace trackedRace, Waypoint waypoint) {
List<PositionDTO> startBuoyPositions = new ArrayList<PositionDTO>();
for (Buoy startBuoy : waypoint.getBuoys()) {
@@ -1,5 +1,6 @@
package com.sap.sailing.gwt.ui.shared;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.user.client.rpc.IsSerializable;
public class PositionDTO implements IsSerializable {
@@ -18,6 +19,11 @@ public class PositionDTO implements IsSerializable {
return "("+latDeg+", "+lngDeg+")";
}
public String toFormattedString() {
NumberFormat fmt = NumberFormat.getFormat("#.###");
return fmt.format(latDeg)+", "+fmt.format(lngDeg);
}
@Override
public int hashCode() {
final int prime = 31;
@@ -0,0 +1,29 @@
package com.sap.sailing.gwt.ui.shared;
import java.util.Date;
import java.util.List;
import com.google.gwt.user.client.rpc.IsSerializable;
public class RaceCourseDTO implements IsSerializable {
public WaypointDTO startWaypoint;
public WaypointDTO finishWaypoint;
public List<WaypointDTO> waypoints;
public Date requestTime;
public WaypointDTO getFirstWaypoint() {
if(waypoints.size() == 0) {
return null;
}
return waypoints.get(0);
}
public WaypointDTO getLastWaypoint() {
if(waypoints.size() == 0) {
return null;
}
return waypoints.get(waypoints.size()-1);
}
}
@@ -0,0 +1,46 @@
package com.sap.sailing.gwt.ui.shared;
import java.util.List;
public class WaypointDTO extends NamedDTO {
public List<MarkDTO> buoys;
public int courseIndex;
public int markPassingsCount;
public WaypointDTO() {}
public WaypointDTO(String name, int courseIndex) {
super(name);
this.courseIndex = courseIndex;
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + courseIndex;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!super.equals(obj))
return false;
if (getClass() != obj.getClass())
return false;
WaypointDTO other = (WaypointDTO) obj;
if (courseIndex != other.courseIndex)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
+16
View File
@@ -0,0 +1,16 @@
#!/bin/sh
#!/bin/sh
target="`dirname \"$0\"`"
pwd=`pwd`
echo "$target" | grep "^/"
if [ "$0" != "0" ]; then
# no leading slash, therefore no absolute path; prepend pwd
target="$pwd/$target"
fi
target=c:/data/SAP/sailing/workspace/java/target
echo target is $target
cd "$target/../com.sap.sailing.feature.p2build/bin/products/raceanalysis.product.id/win32/win32/x86_64"
echo pwd is now `pwd`
classpath="`find plugins -name 'com.sap.sailing.expeditionconnector_*.jar' | sort | tail -1`;`find plugins -name 'com.sap.sailing.domain.common_*.jar' | sort | tail -1`"
echo Using classpath $classpath
"$JAVA_HOME/bin/java" -cp "$classpath" -Djava.util.logging.config.file=$target/configuration/logging.properties com.sap.sailing.expeditionconnector.FromHttpToUdpMirror $*