mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-11-03 17:49:40 +00:00
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:
commit
02bba76e2d
10 files changed
+153
-12
No files matched your search
+6
@@ -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;
|
||||
}
|
||||
}
|
||||
+6
@@ -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.
|
||||
|
||||
+12
-1
@@ -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.");
|
||||
}
|
||||
|
||||
Regular → Executable
+85
-10
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
+3
@@ -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);
|
||||
}
|
||||
+3
@@ -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);
|
||||
}
|
||||
+22
@@ -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();
|
||||
|
||||
+9
@@ -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;
|
||||
}
|
||||
Reference in new issue
Block a user