Merge remote-tracking branch 'server/master'

Conflicts:
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceCourseManagementPanel.java
This commit is contained in:
Axel Uhl committed 2012-07-30 15:35:59 +02:00
commit 02bba76e2d
10 files changed
+153 -12

No files matched your search

@@ -429,4 +429,10 @@ public class MockedTrackedRaceWithStartTimeAndRanks implements TrackedRace {
// TODO Auto-generated method stub
}
@Override
public Iterable<Buoy> getBuoys() {
// TODO Auto-generated method stub
return null;
}
}
@@ -663,4 +663,10 @@ public class MockedTrackedRace implements DynamicTrackedRace {
public void waitUntilWindLoadingComplete() throws InterruptedException {
// TODO Auto-generated method stub
}
@Override
public Iterable<Buoy> getBuoys() {
// TODO Auto-generated method stub
return null;
}
}
@@ -111,6 +111,7 @@ public class CourseImpl extends NamedImpl implements Course {
public void addWaypoint(int zeroBasedPosition, Waypoint waypointToAdd) {
LockUtil.lock(lock.writeLock());
try {
logger.info("Waypoint " + waypointToAdd + " added to course '" + getName() + "'");
waypoints.add(zeroBasedPosition, waypointToAdd);
Map<Waypoint, Integer> updatesToWaypointIndexes = new HashMap<Waypoint, Integer>();
updatesToWaypointIndexes.put(waypointToAdd, zeroBasedPosition);
@@ -13,10 +13,10 @@ import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.base.impl.DouglasPeucker;
import com.sap.sailing.domain.common.Distance;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.LegType;
import com.sap.sailing.domain.common.NoWindException;
import com.sap.sailing.domain.common.Position;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.Tack;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.WindSource;
@@ -187,6 +187,11 @@ public interface TrackedRace extends Serializable {
*/
GPSFixTrack<Buoy, GPSFix> getOrCreateTrack(Buoy buoy);
/**
* Retrieves all buoys assigned to the race. They are not necessarily part of the race course.
*/
Iterable<Buoy> getBuoys();
/**
* If the <code>waypoint</code> only has one {@link #getBuoys() buoy}, its position at time <code>timePoint</code>
* is returned. Otherwise, the center of gravity between the buoys' positions is computed and returned.
@@ -1865,7 +1865,18 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener {
public Iterable<WindSource> getWindSources() {
while (true) {
try {
return new ArrayList<WindSource>(windTracks.keySet());
return new HashSet<WindSource>(windTracks.keySet());
} catch (ConcurrentModificationException cme) {
logger.info("Caught " + cme + "; trying again.");
}
}
}
@Override
public Iterable<Buoy> getBuoys() {
while (true) {
try {
return new HashSet<Buoy>(buoyTracks.keySet());
} catch (ConcurrentModificationException cme) {
logger.info("Caught " + cme + "; trying again.");
}
@@ -17,15 +17,18 @@ 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.Grid;
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.google.gwt.view.client.SingleSelectionModel;
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.RaceBuoysDTO;
import com.sap.sailing.gwt.ui.shared.RaceCourseDTO;
import com.sap.sailing.gwt.ui.shared.WaypointDTO;
@@ -39,25 +42,32 @@ import com.sap.sailing.gwt.ui.shared.WaypointDTO;
*
*/
public class RaceCourseManagementPanel extends AbstractRaceManagementPanel {
private final CellTable<WaypointDTO> courseWaypointsTable;
private final CellTable<MarkDTO> buoysTable;
private final ListDataProvider<MarkDTO> buoyDataProvider;
private final SingleSelectionModel<MarkDTO> buoySelectionModel;
private final CellTable<WaypointDTO> courseWaypointsTable;
private final MultiSelectionModel<WaypointDTO> wayPointSelectionModel;
private final ListDataProvider<WaypointDTO> waypointDataProvider;
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);
selectedRaceContentPanel.add(courseDataRequestTimeLabel);
Grid grid = new Grid(1, 2);
grid.setCellPadding(10);
selectedRaceContentPanel.add(grid);
AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class);
courseWaypointsTable = new CellTable<WaypointDTO>(/* pageSize */10000, tableRes);
this.selectedRaceContentPanel.add(courseWaypointsTable);
grid.setWidget(0, 0, courseWaypointsTable);
wayPointSelectionModel = new MultiSelectionModel<WaypointDTO>();
courseWaypointsTable.setSelectionModel(wayPointSelectionModel);
@@ -96,6 +106,35 @@ public class RaceCourseManagementPanel extends AbstractRaceManagementPanel {
courseWaypointsTable.addColumn(markPassingsCountColumn, stringMessages.markPassing());
waypointDataProvider = new ListDataProvider<WaypointDTO>();
waypointDataProvider.addDataDisplay(courseWaypointsTable);
// race buoys table
buoysTable = new CellTable<MarkDTO>(/* pageSize */10000, tableRes);
grid.setWidget(0, 1, buoysTable);
buoySelectionModel = new SingleSelectionModel<MarkDTO>();
buoysTable.setSelectionModel(buoySelectionModel);
TextColumn<MarkDTO> buoyNameColumn = new TextColumn<MarkDTO>() {
@Override
public String getValue(MarkDTO markDTO) {
return markDTO.name;
}
};
buoysTable.addColumn(buoyNameColumn, stringMessages.buoy());
final SafeHtmlCell buoyPositionCell = new SafeHtmlCell();
Column<MarkDTO, SafeHtml> buoyPositionColumn = new Column<MarkDTO, SafeHtml>(buoyPositionCell) {
@Override
public SafeHtml getValue(MarkDTO mark) {
SafeHtmlBuilder builder = new SafeHtmlBuilder();
builder.appendEscaped(mark.name + ", " + stringMessages.position() + ": " + mark.position.toFormattedString());
return builder.toSafeHtml();
}
};
buoysTable.addColumn(buoyPositionColumn, stringMessages.position());
buoyDataProvider = new ListDataProvider<MarkDTO>();
buoyDataProvider.addDataDisplay(buoysTable);
courseActionsPanel = new HorizontalPanel();
courseActionsPanel.setSpacing(10);
Button insertRoundBtn = new Button("Insert round (2 waypoints)");
@@ -115,6 +154,31 @@ public class RaceCourseManagementPanel extends AbstractRaceManagementPanel {
}
});
courseActionsPanel.add(removeRoundBtn);
Button swapBuoyBtn = new Button("Swap buoy");
swapBuoyBtn.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
if(wayPointSelectionModel.getSelectedSet().size() != 1 || buoySelectionModel.getSelectedObject() == null) {
Window.alert("To swap 2 buoys you have the select a course waypoint and a buoy.");
return;
} else {
// Todo: implement the swap buoy function
// sailingService.swapBuoysOfRaceCourse(singleSelectedRace,..., new AsyncCallback<Void>() {
// @Override
// public void onSuccess(Void arg0) {
// refreshSelectedRaceData();
// }
//
// @Override
// public void onFailure(Throwable arg0) {
// }
// });
}
}
});
courseActionsPanel.add(swapBuoyBtn);
Button refreshBtn = new Button(stringMessages.refresh());
refreshBtn.addClickHandler(new ClickHandler() {
@Override
@@ -160,8 +224,18 @@ public class RaceCourseManagementPanel extends AbstractRaceManagementPanel {
courseActionsPanel.setVisible(true);
sailingService.getRaceCourse(singleSelectedRace, new Date(), new AsyncCallback<RaceCourseDTO>() {
@Override
public void onSuccess(RaceCourseDTO result) {
updateCourseInfo(result);
public void onSuccess(final RaceCourseDTO raceCourseDTO) {
sailingService.getRaceBuoys(singleSelectedRace, new Date(), new AsyncCallback<RaceBuoysDTO>() {
@Override
public void onSuccess(RaceBuoysDTO raceBuoysDTO) {
updateCourseAndBuoysInfo(raceCourseDTO, raceBuoysDTO);
}
@Override
public void onFailure(Throwable caught) {
RaceCourseManagementPanel.this.errorReporter.reportError("Error trying to obtain the buoys of the race: " + caught.getMessage());
}
});
}
@Override
@@ -174,8 +248,9 @@ public class RaceCourseManagementPanel extends AbstractRaceManagementPanel {
}
}
private void updateCourseInfo(RaceCourseDTO courseDTO) {
private void updateCourseAndBuoysInfo(RaceCourseDTO courseDTO, RaceBuoysDTO buoysDTO) {
waypointDataProvider.setList(courseDTO.waypoints);
buoyDataProvider.setList(new ArrayList<MarkDTO>(buoysDTO.buoys));
courseDataRequestTimeLabel.setText(courseDTO.requestTime.toString());
}
@@ -29,6 +29,7 @@ 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.RaceBuoysDTO;
import com.sap.sailing.gwt.ui.shared.RaceCourseDTO;
import com.sap.sailing.gwt.ui.shared.RaceDTO;
import com.sap.sailing.gwt.ui.shared.RaceMapDataDTO;
@@ -254,4 +255,6 @@ public interface SailingService extends RemoteService {
Void updateLeaderboardScoreCorrectionMetadata(String leaderboardName, Date timePointOfLastCorrectionValidity,
String comment);
RaceBuoysDTO getRaceBuoys(RaceIdentifier raceIdentifier, Date date);
}
@@ -21,6 +21,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.RaceBuoysDTO;
import com.sap.sailing.gwt.ui.shared.RaceCourseDTO;
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
import com.sap.sailing.gwt.ui.shared.GPSFixDTO;
@@ -420,4 +421,6 @@ public interface SailingServiceAsync {
void removeFregURLs(Set<String> toRemove, AsyncCallback<Void> asyncCallback);
void addFragUrl(String result, AsyncCallback<Void> asyncCallback);
void getRaceBuoys(RaceIdentifier raceIdentifier, Date date, AsyncCallback<RaceBuoysDTO> callback);
}
@@ -145,6 +145,7 @@ import com.sap.sailing.gwt.ui.shared.PlacemarkDTO;
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.RaceBuoysDTO;
import com.sap.sailing.gwt.ui.shared.RaceColumnDTO;
import com.sap.sailing.gwt.ui.shared.RaceCourseDTO;
import com.sap.sailing.gwt.ui.shared.RaceDTO;
@@ -1504,6 +1505,27 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
return result;
}
@Override
public RaceBuoysDTO getRaceBuoys(RaceIdentifier raceIdentifier, Date date) {
RaceBuoysDTO raceBuoysDTO = new RaceBuoysDTO();
TimePoint dateAsTimePoint = new MillisecondsTimePoint(date);
TrackedRace trackedRace = getExistingTrackedRace(raceIdentifier);
if (trackedRace != null) {
raceBuoysDTO.buoys = new HashSet<MarkDTO>();
Iterable<Buoy> buoys = trackedRace.getBuoys();
for (Buoy buoy : buoys) {
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());
raceBuoysDTO.buoys.add(markDTO);
}
}
}
return raceBuoysDTO;
}
@Override
public RaceCourseDTO getRaceCourse(RaceIdentifier raceIdentifier, Date date) {
RaceCourseDTO result = new RaceCourseDTO();
@@ -0,0 +1,9 @@
package com.sap.sailing.gwt.ui.shared;
import java.util.Set;
import com.google.gwt.user.client.rpc.IsSerializable;
public class RaceBuoysDTO implements IsSerializable {
public Set<MarkDTO> buoys;
}