add copy course functionality for racelogs

This commit is contained in:
Fredrik Teschke committed 2014-03-11 15:20:20 +01:00
1 parent 1ebed6373e
commit 02ce1e8c00
13 files changed
+158 -8

No files matched your search

@@ -11,6 +11,7 @@ public class FleetDTO extends NamedDTO {
public boolean raceLogTrackerCanBeAdded;
public RaceLogTrackingState raceLogTrackingState;
public boolean raceLogTrackerExists;
public boolean courseDefinitionInRaceLog;
public FleetDTO() {}
@@ -76,7 +76,7 @@ TrackedRaceChangedListener {
protected final RaceSelectionProvider raceSelectionProvider;
protected static class RaceColumnDTOAndFleetDTOWithNameBasedEquality extends Pair<RaceColumnDTO, FleetDTO> {
public static class RaceColumnDTOAndFleetDTOWithNameBasedEquality extends Pair<RaceColumnDTO, FleetDTO> {
private static final long serialVersionUID = -8742476113296862662L;
public RaceColumnDTOAndFleetDTOWithNameBasedEquality(RaceColumnDTO a, FleetDTO b) {
@@ -82,4 +82,7 @@ interface AdminConsoleResources extends ClientBundle {
@Source("com/sap/sailing/gwt/ui/client/images/ping.png")
ImageResource ping();
@Source("com/sap/sailing/gwt/ui/client/images/copy_course.png")
ImageResource copyCourse();
}
@@ -53,6 +53,7 @@ public class RaceLogTrackingCourseDefinitionDialog extends RaceLogTrackingDialog
});
courseActionsPanel.insert(addMark, courseActionsPanel.getWidgetIndex(RaceLogCourseManagementWidget.this.saveButton));
Button cancel = new Button(stringMessages.cancel());
cancel.addClickHandler(new ClickHandler() {
@Override
@@ -5,7 +5,11 @@ import com.google.gwt.user.cellview.client.CellTable;
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.Label;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionChangeEvent.Handler;
import com.sap.sailing.domain.common.dto.FleetDTO;
import com.sap.sailing.domain.common.dto.RaceColumnDTO;
import com.sap.sailing.domain.common.racelog.tracking.RaceLogTrackingState;
@@ -18,8 +22,7 @@ import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO;
/**
* Allows the user to start and stop tracking of races using the RaceLog-tracking connector.
*/
public class RaceLogTrackingEventManagementPanel extends AbstractLeaderboardConfigPanel {
public class RaceLogTrackingEventManagementPanel extends AbstractLeaderboardConfigPanel {
public RaceLogTrackingEventManagementPanel(SailingServiceAsync sailingService, AdminConsoleEntryPoint adminConsole,
RegattaRefresher regattaRefresher,
ErrorReporter errorReporter, StringMessages stringMessages) {
@@ -101,9 +104,9 @@ public class RaceLogTrackingEventManagementPanel extends AbstractLeaderboardConf
raceActionColumn.setFieldUpdater(new FieldUpdater<RaceColumnDTOAndFleetDTOWithNameBasedEquality, String>() {
@Override
public void update(int index, RaceColumnDTOAndFleetDTOWithNameBasedEquality object, String value) {
String leaderboardName = getSelectedLeaderboardName();
String raceColumnName = object.getA().getName();
String fleetName = object.getB().getName();
final String leaderboardName = getSelectedLeaderboardName();
final String raceColumnName = object.getA().getName();
final String fleetName = object.getB().getName();
if (RaceLogTrackingEventManagementRaceImagesBarCell.ACTION_ADD_RACELOG_TRACKER.equals(value)) {
addRaceLogTracker(object.getA(), object.getB());
} else if (RaceLogTrackingEventManagementRaceImagesBarCell.ACTION_DENOTE_FOR_RACELOG_TRACKING.equals(value)) {
@@ -118,6 +121,39 @@ public class RaceLogTrackingEventManagementPanel extends AbstractLeaderboardConf
new RaceLogTrackingCourseDefinitionDialog(sailingService, stringMessages, errorReporter, leaderboardName, raceColumnName, fleetName).show();
} else if (RaceLogTrackingEventManagementRaceImagesBarCell.ACTION_MAP_DEVICES.equals(value)) {
//TODO
} else if (RaceLogTrackingEventManagementRaceImagesBarCell.ACTION_COPY_COURSE.equals(value)) {
final Label selectToCopy = new Label(stringMessages.selectRowInTableToCopyCourse());
final VerticalPanel panelToAddTo = (VerticalPanel) selectedLeaderBoardPanel.getContentWidget();
panelToAddTo.add(selectToCopy);
raceColumnTableSelectionModel.addSelectionChangeHandler(new Handler() {
private boolean done = false;
@Override
public void onSelectionChange(SelectionChangeEvent event) {
if (! done && raceColumnTableSelectionModel.getSelectedSet().size() == 1) {
final String leaderboardTo = getSelectedLeaderboardName();
final String raceColumnTo = getSelectedRaceColumnWithFleet().getA().getName();
String fleetTo = getSelectedRaceColumnWithFleet().getB().getName();
if (!(leaderboardTo.equals(leaderboardName) && raceColumnTo.equals(raceColumnName) && fleetTo
.equals(fleetName)) && getSelectedRaceColumnWithFleet().getB().raceLogTrackingState.isForTracking()) {
done = true;
panelToAddTo.remove(selectToCopy);
sailingService.copyCourseToOtherRaceLog(leaderboardName, raceColumnName, fleetName,
leaderboardTo, raceColumnTo, fleetTo, new AsyncCallback<Void>() {
@Override
public void onSuccess(Void result) {
loadAndRefreshLeaderboard(leaderboardTo, raceColumnTo);
}
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Could not copy course: " + caught.getMessage());
}
});
}
}
}
});
}
}
});
@@ -16,6 +16,7 @@ public class RaceLogTrackingEventManagementRaceImagesBarCell extends ImagesBarCe
public final static String ACTION_COMPETITOR_REGISTRATIONS = "ACTION_COMPETITOR_REGISTRATIONS";
public final static String ACTION_DEFINE_COURSE = "ACTION_DEFINE_COURSE";
public final static String ACTION_MAP_DEVICES = "ACTION_MAP_DEVICES";
public final static String ACTION_COPY_COURSE = "ACTION_COPY_COURSE";
private final StringMessages stringMessages;
private static AdminConsoleResources resources = GWT.create(AdminConsoleResources.class);
@@ -46,6 +47,10 @@ public class RaceLogTrackingEventManagementRaceImagesBarCell extends ImagesBarCe
result.add(new ImageSpec(ACTION_MAP_DEVICES, stringMessages.mapDevices(), makeImagePrototype(resources.mapDevices())));
}
if (object.getB().courseDefinitionInRaceLog) {
result.add(new ImageSpec(ACTION_COPY_COURSE, stringMessages.copyCourseToOther(), makeImagePrototype(resources.copyCourse())));
}
return result;
}
}
@@ -420,4 +420,9 @@ public interface SailingService extends RemoteService {
* Adds a fix to the {@link GPSFixStore}, and creates a mapping with a virtual device for exactly the current timepoint.
*/
void pingMarkViaRaceLogTracking(String leaderboardName, String raceColumnName, String fleetName, MarkDTO mark, PositionDTO position);
List<RaceCourseDTO> getCoursesFromRaceLogsInLeaderboard(String leaderboardName);
void copyCourseToOtherRaceLog(String leaderboardFrom, String raceColumnFrom, String fleetFrom,
String leaderboardTo, String raceColumnTo, String fleetTo);
}
@@ -552,5 +552,10 @@ public interface SailingServiceAsync {
void pingMarkViaRaceLogTracking(String leaderboardName, String raceColumnName, String fleetName, MarkDTO mark,
PositionDTO position, AsyncCallback<Void> callback);
void copyCourseToOtherRaceLog(String leaderboardFrom, String raceColumnFrom, String fleetFrom,
String leaderboardTo, String raceColumnTo, String fleetTo, AsyncCallback<Void> callback);
void getCoursesFromRaceLogsInLeaderboard(String leaderboardName, AsyncCallback<List<RaceCourseDTO>> callback);
}
@@ -980,4 +980,7 @@ public interface StringMessages extends Messages {
String pleaseEnterA(String what);
String pingPosition(String whose);
String pleaseEnterAValidValueFor(String what, String validTemplate);
String copyCourseToOther();
String nowSelectRaceColumnAndFleetToCopyTo();
String selectRowInTableToCopyCourse();
}
@@ -965,4 +965,7 @@ add_what=Add {0}
remove_what=Remove {0}
pleaseEnterA=Please enter a {0}
pingPosition=Ping {0} position
pleaseEnterAValidValueFor=Please enter a valid value for {0} ({1})
pleaseEnterAValidValueFor=Please enter a valid value for {0} ({1})
copyCourseToOther=Copy course to other
nowSelectRaceColumnAndFleetToCopyTo=Now select the race column and fleet to copy the course to.
selectRowInTableToCopyCourse=Select a single row in the table, to which to copy the course.
@@ -961,4 +961,7 @@ add_what={0} hinzufügen
remove_what={0} entfernen
pleaseEnterA=Bitte {0} eingeben.
pingPosition={0}-Position pingen
pleaseEnterAValidValueFor=Bitte geben Sie für {0} einen gültigen Wert ein ({1})
pleaseEnterAValidValueFor=Bitte geben Sie für {0} einen gültigen Wert ein ({1})
copyCourseToOther=Diesen Kurs kopieren
nowSelectRaceColumnAndFleetToCopyTo=Bitte wählen Sie nun die Renn-Spalte und Flotte zum Kopieren des Kurses aus.
selectRowInTableToCopyCourse=Bitte selektieren Sie eine einzelne Zeile der Tabelle, um den Kurs dorthin zu kopieren.
@@ -2021,6 +2021,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
RaceLog raceLog = raceColumn.getRaceLog(fleet);
fleetDTO.raceLogTrackingState = new RaceLogTrackingStateAnalyzer(raceLog).analyze();
fleetDTO.raceLogTrackerExists = getService().getRaceTrackerById(raceLog.getId()) != null;
fleetDTO.courseDefinitionInRaceLog = new LastPublishedCourseDesignFinder(raceLog).analyze() != null;
if (getRaceLogTrackingAdapter().isDenotedForRaceLogTracking(getService(), raceColumn, fleet)) {
leaderboardDTO.isDenotedForRaceLogTracking = true;
@@ -4093,4 +4094,88 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
getService().getGPSFixStore().storeFix(device, fix);
}
@Override
public List<RaceCourseDTO> getCoursesFromRaceLogsInLeaderboard(String leaderboardName) {
List<RaceCourseDTO> result = new ArrayList<RaceCourseDTO>();
Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName);
for (RaceColumn raceColumn : leaderboard.getRaceColumns()) {
for (Fleet fleet : raceColumn.getFleets()) {
RaceCourseDTO last = getLastCourseDefinitionInRaceLog(leaderboardName, raceColumn.getName(), fleet.getName());
if (last != null) {
result.add(last);
}
}
}
return result;
}
private Waypoint duplicateWaypoint(Waypoint waypoint, Map<ControlPoint, ControlPoint> controlPointDuplicationCache,
Map<Mark, Mark> markDuplicationCache) {
ControlPoint oldCP = waypoint.getControlPoint();
ControlPoint newCP = null;
PassingInstruction pi = waypoint.getPassingInstructions();
if (controlPointDuplicationCache.get(oldCP) != null) {
newCP = controlPointDuplicationCache.get(oldCP);
} else {
Mark[] newMarks = new Mark[Util.size(oldCP.getMarks())];
int i = 0;
for (Mark oldMark : oldCP.getMarks()) {
newMarks[i] = null;
if (markDuplicationCache.get(oldMark) != null) {
newMarks[i] = markDuplicationCache.get(oldMark);
} else {
newMarks[i] = baseDomainFactory.getOrCreateMark(UUID.randomUUID(), oldMark.getName(), oldMark.getType(),
oldMark.getColor(), oldMark.getShape(), oldMark.getPattern());
markDuplicationCache.put(oldMark, newMarks[i]);
}
i++;
}
switch (newMarks.length) {
case 1:
newCP = newMarks[0];
break;
case 2:
newCP = baseDomainFactory.createControlPointWithTwoMarks(newMarks[0], newMarks[1], oldCP.getName());
break;
default:
logger.log(Level.WARNING, "Don't know how to duplicate CP with more than 2 marks");
throw new RuntimeException("Don't know how to duplicate CP with more than 2 marks");
}
controlPointDuplicationCache.put(oldCP, newCP);
}
return baseDomainFactory.createWaypoint(newCP, pi);
}
@Override
public void copyCourseToOtherRaceLog(String leaderboardFrom, String raceColumnFrom, String fleetFrom,
String leaderboardTo, String raceColumnTo, String fleetTo) {
if (leaderboardFrom == leaderboardTo && raceColumnFrom == raceColumnTo && fleetFrom == fleetTo) {
return;
}
TimePoint now = MillisecondsTimePoint.now();
RaceLog fromRaceLog = getRaceLog(leaderboardFrom, raceColumnFrom, fleetFrom);
RaceLog toRaceLog = getRaceLog(leaderboardTo, raceColumnTo, fleetTo);
CourseBase from = new LastPublishedCourseDesignFinder(fromRaceLog).analyze();
CourseBase to = new CourseDataImpl("Copy of \"" + from.getName()
+ "\" for " + leaderboardTo + " - " + raceColumnTo + " - " + fleetTo);
if (from != null && new RaceLogTrackingStateAnalyzer(toRaceLog).analyze().isForTracking()) {
int i = 0;
Map<ControlPoint, ControlPoint> controlPointDuplicationCache = new HashMap<ControlPoint, ControlPoint>();
Map<Mark, Mark> markDuplicationCache = new HashMap<Mark, Mark>();
for (Waypoint oldWaypoint : from.getWaypoints()) {
to.addWaypoint(i++, duplicateWaypoint(oldWaypoint, controlPointDuplicationCache, markDuplicationCache));
}
for (Mark mark : markDuplicationCache.values()) {
RaceLogEvent event = RaceLogEventFactory.INSTANCE.createDefineMarkEvent(now, getService().getServerAuthor(),
toRaceLog.getCurrentPassId(), mark);
toRaceLog.add(event);
}
}
RaceLogEvent duplicatedEvent = RaceLogEventFactory.INSTANCE.createCourseDesignChangedEvent(now, getService().getServerAuthor(), toRaceLog.getCurrentPassId(), to);
toRaceLog.add(duplicatedEvent);
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB