added course definition dialog

This commit is contained in:
Fredrik Teschke committed 2014-03-07 18:09:28 +01:00
1 parent 2dbec9dbbf
commit 69b10da77e
18 files changed
+697 -182

No files matched your search

@@ -95,4 +95,8 @@ public interface SharedDomainFactory extends CompetitorFactory {
* Hm.
*/
DeviceConfigurationMatcher getOrCreateDeviceConfigurationMatcher(DeviceConfigurationMatcherType type, List<String> clientIdentifiers);
Mark getExistingMarkByIdAsString(String toStringRepresentationOfID);
Mark getExistingMarkById(Serializable id);
}
@@ -312,5 +312,15 @@ public class SharedDomainFactoryImpl implements SharedDomainFactory {
}
return matcher;
}
@Override
public Mark getExistingMarkById(Serializable id) {
return markCache.get(id);
}
@Override
public Mark getExistingMarkByIdAsString(String toStringRepresentationOfID) {
return markCache.get(markIdCache.get(toStringRepresentationOfID));
}
}
@@ -1,8 +1,8 @@
package com.sap.sailing.domain.racelog.tracking.analyzing.impl;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.racelog.RaceLog;
@@ -10,21 +10,21 @@ import com.sap.sailing.domain.racelog.RaceLogEvent;
import com.sap.sailing.domain.racelog.analyzing.impl.RaceLogAnalyzer;
import com.sap.sailing.domain.racelog.tracking.DefineMarkEvent;
public class DefinedMarkFinder extends RaceLogAnalyzer<Iterable<Mark>> {
public class DefinedMarkFinder extends RaceLogAnalyzer<Collection<Mark>> {
public DefinedMarkFinder(RaceLog raceLog) {
super(raceLog);
}
@Override
protected Iterable<Mark> performAnalysis() {
Map<Serializable, Mark> result = new HashMap<Serializable, Mark>();
protected Collection<Mark> performAnalysis() {
List< Mark> result = new ArrayList<Mark>();
for (RaceLogEvent event : getAllEvents()) {
if (event instanceof DefineMarkEvent) {
DefineMarkEvent dME = (DefineMarkEvent) event;
result.put(dME.getMark().getId(), dME.getMark());
result.add(dME.getMark());
}
}
return result.values();
return result;
}
}
@@ -1,11 +1,15 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import com.google.gwt.cell.client.FieldUpdater;
import com.google.gwt.cell.client.SafeHtmlCell;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.FontWeight;
@@ -32,6 +36,7 @@ import com.google.gwt.view.client.SelectionChangeEvent.Handler;
import com.google.gwt.view.client.SelectionModel;
import com.google.gwt.view.client.SingleSelectionModel;
import com.sap.sailing.domain.common.PassingInstruction;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
@@ -178,7 +183,7 @@ public abstract class CourseManagementWidget implements IsWidget {
protected final Handler markSelectionChangeHandler;
protected final Button insertWaypointBefore;
protected final Button insertWaypointAfter;
protected final Button removeWaypointBtn;
protected final Button saveButton;
protected boolean ignoreWaypointAndOldAndNewMarkSelectionChange;
@Override
@@ -249,6 +254,19 @@ public abstract class CourseManagementWidget implements IsWidget {
};
controlPointsTable.addColumn(newMarkColumn, stringMessages.newMark());
ImagesBarColumn<ControlPointAndOldAndNewMark, CourseManagementWidgetWaypointsImagesBarCell> actionColumn =
new ImagesBarColumn<ControlPointAndOldAndNewMark, CourseManagementWidgetWaypointsImagesBarCell>(
new CourseManagementWidgetWaypointsImagesBarCell(stringMessages));
actionColumn.setFieldUpdater(new FieldUpdater<ControlPointAndOldAndNewMark, String>() {
@Override
public void update(int index, ControlPointAndOldAndNewMark controlPoint, String value) {
if (CourseManagementWidgetWaypointsImagesBarCell.ACTION_DELETE.equals(value)) {
removeSelectedWaypoints(sailingService);
}
}
});
controlPointsTable.addColumn(actionColumn, stringMessages.actions());
controlPointDataProvider = new ListDataProvider<ControlPointAndOldAndNewMark>();
controlPointDataProvider.addDataDisplay(controlPointsTable);
@@ -290,15 +308,6 @@ public abstract class CourseManagementWidget implements IsWidget {
});
insertWaypointAfter.setEnabled(false);
courseActionsPanel.add(insertWaypointAfter);
removeWaypointBtn = new Button(stringMessages.remove());
removeWaypointBtn.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
removeSelectedWaypoints(sailingService);
}
});
removeWaypointBtn.setEnabled(false);
courseActionsPanel.add(removeWaypointBtn);
Button refreshBtn = new Button(stringMessages.refresh());
refreshBtn.addClickHandler(new ClickHandler() {
@Override
@@ -307,14 +316,32 @@ public abstract class CourseManagementWidget implements IsWidget {
}
});
courseActionsPanel.add(refreshBtn);
Button saveBtn = new Button(stringMessages.save());
saveBtn.addClickHandler(new ClickHandler() {
saveButton = new Button(stringMessages.save());
saveButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
saveCourse(sailingService, stringMessages);
Set<ControlPointDTO> oldControlPointsFromTableAlreadyHandled = new HashSet<ControlPointDTO>();
List<Pair<ControlPointDTO, PassingInstruction>> controlPoints = new ArrayList<Pair<ControlPointDTO, PassingInstruction>>();
for (ControlPointAndOldAndNewMark cpaoanb : controlPointDataProvider.getList()) {
if (!oldControlPointsFromTableAlreadyHandled.contains(cpaoanb.getControlPoint())) {
oldControlPointsFromTableAlreadyHandled.add(cpaoanb.getControlPoint());
ControlPointDTO controlPointToAdd;
if (controlPointsNeedingReplacement.contains(cpaoanb.getControlPoint())) {
if (cpaoanb.getControlPoint() instanceof GateDTO) {
controlPointToAdd = createGate((GateDTO) cpaoanb.getControlPoint());
} else {
controlPointToAdd = cpaoanb.getNewMark();
}
} else {
controlPointToAdd = cpaoanb.getControlPoint();
}
controlPoints.add(new Pair<ControlPointDTO, PassingInstruction>(controlPointToAdd, cpaoanb.passingInstructions));
}
}
saveCourse(controlPoints);
}
});␍ courseActionsPanel.add(saveBtn);
courseActionsPanel.setVisible(false);
});␍ courseActionsPanel.add(saveButton);
// courseActionsPanel.setVisible(false);
mainPanel.add(courseActionsPanel);
}
@@ -325,8 +352,7 @@ public abstract class CourseManagementWidget implements IsWidget {
markSelectionModel.setSelected(markSelectionModel.getSelectedObject(), false);
final int selectionSize = controlPointsSelectionModel.getSelectedSet().size();
insertWaypointAfter.setEnabled(selectionSize==1);
insertWaypointBefore.setEnabled(selectionSize==1);
removeWaypointBtn.setEnabled(selectionSize>=1);
insertWaypointBefore.setEnabled(selectionSize==1 || controlPointDataProvider.getList().isEmpty());
if (selectionSize == 1) {
MarkDTO newMark = controlPointsSelectionModel.getSelectedSet().iterator().next().getNewMark();
if (newMark != null) {
@@ -342,7 +368,7 @@ public abstract class CourseManagementWidget implements IsWidget {
}
}
protected abstract void saveCourse(SailingServiceAsync sailingService, final StringMessages stringMessages);
protected abstract void saveCourse(List<Pair<ControlPointDTO, PassingInstruction>> controlPoints);
/**
* When a gate needs replacement, its entries in {@link #controlPointDataProvider} are looked up, and a new
@@ -474,13 +500,19 @@ public abstract class CourseManagementWidget implements IsWidget {
@Override
public void ok(ControlPointDTO result) {
Set<ControlPointAndOldAndNewMark> selectedElements = controlPointsSelectionModel.getSelectedSet();
if (!selectedElements.isEmpty()) {
int index = -1;
if (controlPointDataProvider.getList().isEmpty()) {
index = 0;
} else if (!selectedElements.isEmpty()) {
ControlPointAndOldAndNewMark selectedElement = selectedElements.iterator().next();
int insertPos = controlPointDataProvider.getList().indexOf(selectedElement) + (beforeSelection?0:1);
index = controlPointDataProvider.getList().indexOf(selectedElement) + (beforeSelection?0:1);
}
if (index != -1) {
for (MarkDTO markDTO : result.getMarks()) {
controlPointDataProvider.getList().add(insertPos++, new ControlPointAndOldAndNewMark(result, null, markDTO));
controlPointDataProvider.getList().add(index++, new ControlPointAndOldAndNewMark(result, null, markDTO));
}
}
handleControlPointSelectionChange();
}
}).show();
}
@@ -513,8 +545,20 @@ public abstract class CourseManagementWidget implements IsWidget {
ControlPointAndOldAndNewMark next = i.next();
if (selectedControlPoints.contains(next.getControlPoint())) {
i.remove();
controlPointsSelectionModel.setSelected(next, false);
}
}
handleControlPointSelectionChange();
}
protected void updateMarksTable(Collection<MarkDTO> marks) {
markDataProvider.getList().clear();
markDataProvider.getList().addAll(marks);
Collections.sort(markDataProvider.getList(), new Comparator<MarkDTO>() {
@Override
public int compare(MarkDTO o1, MarkDTO o2) {
return o1.getName().compareTo(o2.getName());
}
});
}
}
@@ -0,0 +1,25 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.ArrayList;
import com.google.gwt.core.client.GWT;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.shared.components.ImagesBarCell;
public class CourseManagementWidgetWaypointsImagesBarCell extends ImagesBarCell {
public static final String ACTION_DELETE = "ACTION_DELETE";
private static AdminConsoleResources resources = GWT.create(AdminConsoleResources.class);
private final StringMessages stringMessages;
public CourseManagementWidgetWaypointsImagesBarCell(StringMessages stringMessages) {
super();
this.stringMessages = stringMessages;
}
@Override
protected Iterable<ImageSpec> getImageSpecs() {
ArrayList<ImageSpec> result = new ArrayList<ImageSpec>();
result.add(new ImageSpec(ACTION_DELETE, stringMessages.remove(), makeImagePrototype(resources.removeIcon())));
return result;
}
}
@@ -0,0 +1,107 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.MarkType;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.HtmlPredefinedColor;
import com.sap.sailing.gwt.ui.shared.MarkDTO;
import com.sap.sailing.gwt.ui.shared.racemap.Pattern;
import com.sap.sailing.gwt.ui.shared.racemap.Shape;
import com.sap.sse.gwt.ui.DataEntryDialog;
public class MarkEditDialog extends DataEntryDialog<MarkDTO> {
private final MarkDTO markToEdit; //color, shape, pattern, type
private final TextBox name;
private final ListBox shape;
private final ListBox pattern;
private final ListBox type;
private final ListBox color;
private final StringMessages stringMessages;
public MarkEditDialog(final StringMessages stringMessages, MarkDTO markToEdit, boolean isNewMark,
DialogCallback<MarkDTO> callback) {
super(isNewMark ? stringMessages.add(stringMessages.mark()) : stringMessages.edit(stringMessages.mark()),
isNewMark ? stringMessages.add(stringMessages.mark()) : stringMessages.edit(stringMessages.mark()),
stringMessages.ok(), stringMessages.cancel(), new Validator<MarkDTO>() {
@Override
public String getErrorMessage(MarkDTO valueToValidate) {
String result = null;
if (valueToValidate.getName() == null || valueToValidate.getName().isEmpty()) {
result = stringMessages.pleaseEnterAName();
}
return result;
}
}, /* animationEnabled */true, callback);
this.stringMessages = stringMessages;
this.markToEdit = markToEdit;
this.name = createTextBox(markToEdit.getName());
this.shape = createAndSelectListBox(Shape.values(), markToEdit.shape, true);
this.type = createAndSelectListBox(MarkType.values(), markToEdit.type == null ? null : markToEdit.type.name(), false);
this.color = createAndSelectListBox(HtmlPredefinedColor.values(), markToEdit.color, true);
this.pattern = createAndSelectListBox(Pattern.values(), markToEdit.pattern, true);
}
private <T extends Enum<T>> ListBox createAndSelectListBox(T[] values, String toSelect, boolean emptySelectionPossible) {
ListBox result = createListBox(/* isMultipleSelect */ false);
int i=0;
List<String> list = new ArrayList<String>();
for (T t : values) {
list.add(t.name());
}
if (emptySelectionPossible) {
list.add("");
}
Collections.sort(list);
for (String name : list) {
result.addItem(name);
if (name.equals(toSelect)) {
result.setSelectedIndex(i);
}
i++;
}
return result;
}
@Override
public void show() {
super.show();
name.setFocus(true);
}
@Override
protected MarkDTO getResult() {
MarkDTO result = new MarkDTO(markToEdit.getIdAsString(), name.getText());
result.shape = shape.getItemText(shape.getSelectedIndex());
result.type = MarkType.valueOf(type.getItemText(type.getSelectedIndex()));
result.color = color.getItemText(color.getSelectedIndex());
result.pattern = pattern.getItemText(pattern.getSelectedIndex());
return result;
}
@Override
protected Widget getAdditionalWidget() {
Grid result = new Grid(5, 2);
result.setWidget(0, 0, new Label(stringMessages.name()));
result.setWidget(0, 1, name);
result.setWidget(1, 0, new Label(stringMessages.shape()));
result.setWidget(1, 1, shape);
result.setWidget(2, 0, new Label(stringMessages.type()));
result.setWidget(2, 1, type);
result.setWidget(3, 0, new Label(stringMessages.color()));
result.setWidget(3, 1, color);
result.setWidget(4, 0, new Label(stringMessages.pattern()));
result.setWidget(4, 1, pattern);
return result;
}
}
@@ -1,12 +1,7 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
@@ -17,8 +12,6 @@ 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.ControlPointDTO;
import com.sap.sailing.gwt.ui.shared.GateDTO;
import com.sap.sailing.gwt.ui.shared.MarkDTO;
import com.sap.sailing.gwt.ui.shared.RaceCourseDTO;
/**
@@ -39,25 +32,7 @@ public class RaceCourseManagementPanel extends AbstractRaceManagementPanel {
courseManagementWidget = new CourseManagementWidget(sailingService, errorReporter, stringMessages) {
@Override
protected void saveCourse(SailingServiceAsync sailingService, final StringMessages stringMessages) {
Set<ControlPointDTO> oldControlPointsFromTableAlreadyHandled = new HashSet<ControlPointDTO>();
List<Pair<ControlPointDTO, PassingInstruction>> controlPoints = new ArrayList<Pair<ControlPointDTO, PassingInstruction>>();
for (ControlPointAndOldAndNewMark cpaoanb : controlPointDataProvider.getList()) {
if (!oldControlPointsFromTableAlreadyHandled.contains(cpaoanb.getControlPoint())) {
oldControlPointsFromTableAlreadyHandled.add(cpaoanb.getControlPoint());
ControlPointDTO controlPointToAdd;
if (controlPointsNeedingReplacement.contains(cpaoanb.getControlPoint())) {
if (cpaoanb.getControlPoint() instanceof GateDTO) {
controlPointToAdd = createGate((GateDTO) cpaoanb.getControlPoint());
} else {
controlPointToAdd = cpaoanb.getNewMark();
}
} else {
controlPointToAdd = cpaoanb.getControlPoint();
}
controlPoints.add(new Pair<ControlPointDTO, PassingInstruction>(controlPointToAdd, cpaoanb.passingInstructions));
}
}
protected void saveCourse(List<Pair<ControlPointDTO, PassingInstruction>> controlPoints) {
sailingService.updateRaceCourse(singleSelectedRace, controlPoints, new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
@@ -75,13 +50,13 @@ public class RaceCourseManagementPanel extends AbstractRaceManagementPanel {
@Override
public void refresh() {
if (singleSelectedRace != null && selectedRaceDTO != null) {
courseActionsPanel.setVisible(true);
// courseActionsPanel.setVisible(true);
// TODO bug 1351: never use System.currentTimeMillis() on the client when trying to compare anything with "server time"; this one is not so urgent as it is reached only in the AdminConsole and we expect administrators to have proper client-side time settings
sailingService.getRaceCourse(singleSelectedRace, new Date(), new AsyncCallback<RaceCourseDTO>() {
@Override
public void onSuccess(RaceCourseDTO raceCourseDTO) {
updateWaypointTable(raceCourseDTO);
updateMarksTable(raceCourseDTO);
updateMarksTable(raceCourseDTO.getMarks());
}
@Override
@@ -95,17 +70,6 @@ public class RaceCourseManagementPanel extends AbstractRaceManagementPanel {
courseActionsPanel.setVisible(false);
}
}
private void updateMarksTable(RaceCourseDTO raceCourseDTO) {
markDataProvider.getList().clear();
markDataProvider.getList().addAll(raceCourseDTO.getMarks());
Collections.sort(markDataProvider.getList(), new Comparator<MarkDTO>() {
@Override
public int compare(MarkDTO o1, MarkDTO o2) {
return o1.getName().compareTo(o2.getName());
}
});
}
};
this.selectedRaceContentPanel.add(courseManagementWidget);
}
@@ -8,27 +8,56 @@ 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.HorizontalPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Panel;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
public class CompetitorRegistrationsDialog extends DialogBox {
private final CompetitorTableWrapper competitorTable;
public CompetitorRegistrationsDialog(final SailingServiceAsync sailingService, final StringMessages stringMessages,
public class RaceLogTrackingCompetitorRegistrationsDialog extends RaceLogTrackingDialog {
private CompetitorTableWrapper competitorTable;
private final boolean filterByLeaderBoardInitially = false;
private final boolean editable;
public RaceLogTrackingCompetitorRegistrationsDialog(final SailingServiceAsync sailingService, final StringMessages stringMessages,
final ErrorReporter errorReporter, final String leaderboardName,
final String raceColumnName, final String fleetName, boolean editable) {
boolean filterByLeaderBoardInitially = false;
VerticalPanel mainPanel = new VerticalPanel();
setWidget(mainPanel);
HorizontalPanel buttonPanel = new HorizontalPanel();
super(sailingService, stringMessages, errorReporter, leaderboardName, raceColumnName, fleetName);
this.editable = editable;
competitorTable.refreshCompetitorList(filterByLeaderBoardInitially ? leaderboardName : null,
true, new Callback<Iterable<CompetitorDTO>, Throwable>() {
@Override
public void onSuccess(Iterable<CompetitorDTO> result) {
center();
//preselect competitors that are already registered
sailingService.getCompetitorRegistrations(leaderboardName, raceColumnName, fleetName, new AsyncCallback<Iterable<CompetitorDTO>>() {
@Override
public void onSuccess(Iterable<CompetitorDTO> result) {
Set<String> registeredIds = new HashSet<String>();
for (CompetitorDTO c : result) {
registeredIds.add(c.getIdAsString());
}
for (CompetitorDTO c : competitorTable.getAllCompetitors()) {
competitorTable.getSelectionModel().setSelected(c, registeredIds.contains(c.getIdAsString()));
}
}
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Could not load already registered competitors: " + caught.getMessage());
}
});
}
@Override
public void onFailure(Throwable reason) {}
});
}
@Override
protected void addButtons(Panel buttonPanel) {
final Button toggleOnlyLeaderboard = new Button(filterByLeaderBoardInitially ? stringMessages.removeLeaderboardFilter():
stringMessages.filterByLeaderboard());
toggleOnlyLeaderboard.addClickHandler(new ClickHandler() {
@@ -50,72 +79,38 @@ public class CompetitorRegistrationsDialog extends DialogBox {
}
toggleSelection.setText(selectAll ? stringMessages.deselectAll() : stringMessages.selectAll());
}
});
Button cancel = new Button(stringMessages.cancel());
cancel.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
hide();
}
});
Button save = new Button(stringMessages.save());
save.setEnabled(editable);
save.setTitle(stringMessages.canOnlyBeEditedBeforeStartingTracking());
save.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
sailingService.setCompetitorRegistrations(leaderboardName, raceColumnName, fleetName,
competitorTable.getSelectionModel().getSelectedSet(), new AsyncCallback<Void>() {
@Override
public void onSuccess(Void result) {
hide();
}
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Could not save competitor registrations: " + caught.getMessage());
}
});
}
});
buttonPanel.add(toggleOnlyLeaderboard);
buttonPanel.add(toggleSelection);
buttonPanel.add(cancel);
buttonPanel.add(save);
mainPanel.add(buttonPanel);
super.addButtons(buttonPanel);
saveButton.setEnabled(editable);
saveButton.setTitle(stringMessages.canOnlyBeEditedBeforeStartingTracking());
}
@Override
protected void addMainContent(Panel mainPanel) {
super.addMainContent(mainPanel);
competitorTable = new CompetitorTableWrapper(sailingService, stringMessages, errorReporter);
mainPanel.add(competitorTable);
competitorTable.refreshCompetitorList(filterByLeaderBoardInitially ? leaderboardName : null,
true, new Callback<Iterable<CompetitorDTO>, Throwable>() {
}
@Override
protected void save() {
sailingService.setCompetitorRegistrations(leaderboardName, raceColumnName, fleetName,
competitorTable.getSelectionModel().getSelectedSet(), new AsyncCallback<Void>() {
@Override
public void onSuccess(Iterable<CompetitorDTO> result) {
center();
//preselect competitors that are already registered
sailingService.getCompetitorRegistrations(leaderboardName, raceColumnName, fleetName, new AsyncCallback<Iterable<CompetitorDTO>>() {
@Override
public void onSuccess(Iterable<CompetitorDTO> result) {
Set<String> registeredIds = new HashSet<String>();
for (CompetitorDTO c : result) {
registeredIds.add(c.getIdAsString());
}
for (CompetitorDTO c : competitorTable.getAllCompetitors()) {
competitorTable.getSelectionModel().setSelected(c, registeredIds.contains(c.getIdAsString()));
}
}
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Could not load already registered competitors: " + caught.getMessage());
}
});
public void onSuccess(Void result) {
hide();
}
@Override
public void onFailure(Throwable reason) {}
public void onFailure(Throwable caught) {
errorReporter.reportError("Could not save competitor registrations: " + caught.getMessage());
}
});
}
}
@@ -0,0 +1,136 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.Collection;
import java.util.List;
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.Panel;
import com.sap.sailing.domain.common.PassingInstruction;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.ControlPointDTO;
import com.sap.sailing.gwt.ui.shared.MarkDTO;
import com.sap.sailing.gwt.ui.shared.RaceCourseDTO;
import com.sap.sse.gwt.ui.DataEntryDialog.DialogCallback;
public class RaceLogTrackingCourseDefinitionDialog extends RaceLogTrackingDialog {
private class RaceLogCourseManagementWidget extends CourseManagementWidget {
public RaceLogCourseManagementWidget(final SailingServiceAsync sailingService, final ErrorReporter errorReporter,
final StringMessages stringMessages) {
super(sailingService, errorReporter, stringMessages);
Button addMark = new Button(stringMessages.add(stringMessages.mark()));
addMark.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
new MarkEditDialog(stringMessages, new MarkDTO(null, null), true, new DialogCallback<MarkDTO>() {
@Override
public void ok(MarkDTO mark) {
sailingService.addMarkToRaceLog(leaderboardName, raceColumnName, fleetName, mark, new AsyncCallback<Void>() {
@Override
public void onSuccess(Void result) {
courseManagementWidget.refresh();
}
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Could not add mark: " + caught.getMessage());
}
});
}
@Override
public void cancel() {}
}).show();
}
});
courseActionsPanel.insert(addMark, courseActionsPanel.getWidgetIndex(RaceLogCourseManagementWidget.this.saveButton));
Button cancel = new Button(stringMessages.cancel());
cancel.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
hide();
}
});
courseActionsPanel.insert(cancel, courseActionsPanel.getWidgetIndex(RaceLogCourseManagementWidget.this.saveButton));
}
@Override
protected void saveCourse(List<Pair<ControlPointDTO, PassingInstruction>> controlPoints) {
sailingService.addCourseDefinitionToRaceLog(leaderboardName, raceColumnName, fleetName, controlPoints, new AsyncCallback<Void>() {
@Override
public void onSuccess(Void result) {
hide();
}
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Could note save course: " + caught.getMessage());
}
});
}
@Override
public void refresh() {
sailingService.getLastCourseDefinitionInRaceLog(leaderboardName, raceColumnName, fleetName, new AsyncCallback<RaceCourseDTO>() {
@Override
public void onSuccess(RaceCourseDTO result) {
updateWaypointTable(result);
if (result.waypoints.isEmpty()) {
insertWaypointBefore.setEnabled(true);
}
}
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Could not load course: " + caught.getMessage());
}
});
sailingService.getMarksInRaceLog(leaderboardName, raceColumnName, fleetName, new AsyncCallback<Collection<MarkDTO>>() {
@Override
public void onSuccess(Collection<MarkDTO> result) {
updateMarksTable(result);
}
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Could not load marks: " + caught.getMessage());
}
});
}
};
private CourseManagementWidget courseManagementWidget;
public RaceLogTrackingCourseDefinitionDialog(final SailingServiceAsync sailingService, final StringMessages stringMessages,
final ErrorReporter errorReporter, final String leaderboardName, final String raceColumnName, final String fleetName) {
super(sailingService, stringMessages, errorReporter, leaderboardName, raceColumnName, fleetName);
courseManagementWidget.refresh();
}
@Override
protected void addMainContent(Panel mainPanel) {
super.addMainContent(mainPanel);
courseManagementWidget = new RaceLogCourseManagementWidget(sailingService, errorReporter, stringMessages);
mainPanel.add(courseManagementWidget);
}
@Override
protected void addButtons(Panel buttonPanel) {
//reuse buttons of widget
}
@Override
protected void save() {
//won't be called, as we are reusing widget buttons
}
}
@@ -0,0 +1,67 @@
package com.sap.sailing.gwt.ui.adminconsole;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
public abstract class RaceLogTrackingDialog extends DialogBox {
protected final SailingServiceAsync sailingService;
protected final StringMessages stringMessages;
protected final ErrorReporter errorReporter;
protected final String leaderboardName;
protected final String raceColumnName;
protected final String fleetName;
protected Button saveButton;
public RaceLogTrackingDialog(SailingServiceAsync sailingService, StringMessages stringMessages,
ErrorReporter errorReporter, String leaderboardName, String raceColumnName, String fleetName) {
this.sailingService = sailingService;
this.stringMessages = stringMessages;
this.errorReporter = errorReporter;
this.leaderboardName = leaderboardName;
this.raceColumnName = raceColumnName;
this.fleetName = fleetName;
VerticalPanel mainPanel = new VerticalPanel();
setWidget(mainPanel);
addMainContent(mainPanel);
center();
}
protected void addMainContent(Panel mainPanel) {
HorizontalPanel buttonPanel = new HorizontalPanel();
mainPanel.add(buttonPanel);
addButtons(buttonPanel);
}
protected void addButtons(Panel buttonPanel) {
Button cancel = new Button(stringMessages.cancel());
cancel.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
hide();
}
});
saveButton = new Button(stringMessages.save());
saveButton.setTitle(stringMessages.canOnlyBeEditedBeforeStartingTracking());
saveButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
save();
}
});
buttonPanel.add(cancel);
buttonPanel.add(saveButton);
}
protected abstract void save();
}
@@ -101,6 +101,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();
if (RaceLogTrackingEventManagementRaceImagesBarCell.ACTION_ADD_RACELOG_TRACKER.equals(value)) {
addRaceLogTracker(object.getA(), object.getB());
} else if (RaceLogTrackingEventManagementRaceImagesBarCell.ACTION_DENOTE_FOR_RACELOG_TRACKING.equals(value)) {
@@ -109,10 +112,10 @@ public class RaceLogTrackingEventManagementPanel extends AbstractLeaderboardConf
startRaceLogTracking(object.getA(), object.getB());
} else if (RaceLogTrackingEventManagementRaceImagesBarCell.ACTION_COMPETITOR_REGISTRATIONS.equals(value)) {
boolean editable = object.getB().raceLogTrackingState != RaceLogTrackingState.TRACKING;
new CompetitorRegistrationsDialog(sailingService, stringMessages, errorReporter,
new RaceLogTrackingCompetitorRegistrationsDialog(sailingService, stringMessages, errorReporter,
getSelectedLeaderboardName(), object.getA().getName(), object.getB().getName(), editable).show();
} else if (RaceLogTrackingEventManagementRaceImagesBarCell.ACTION_DEFINE_COURSE.equals(value)) {
//TODO
new RaceLogTrackingCourseDefinitionDialog(sailingService, stringMessages, errorReporter, leaderboardName, raceColumnName, fleetName).show();
} else if (RaceLogTrackingEventManagementRaceImagesBarCell.ACTION_MAP_DEVICES.equals(value)) {
//TODO
}
@@ -12,6 +12,7 @@ import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
import com.sap.sailing.datamining.shared.DataMiningSerializationDummy;
import com.sap.sailing.datamining.shared.QueryDefinition;
import com.sap.sailing.datamining.shared.QueryResult;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.common.DetailType;
import com.sap.sailing.domain.common.LeaderboardType;
import com.sap.sailing.domain.common.MasterDataImportObjectCreationCount;
@@ -35,6 +36,7 @@ import com.sap.sailing.domain.common.dto.RegattaCreationParametersDTO;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.common.impl.Util.Triple;
import com.sap.sailing.domain.common.racelog.tracking.RaceNotCreatedException;
import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.gwt.ui.shared.BulkScoreCorrectionDTO;
import com.sap.sailing.gwt.ui.shared.CompactRaceMapDataDTO;
import com.sap.sailing.gwt.ui.shared.CompetitorsRaceDataDTO;
@@ -48,6 +50,7 @@ import com.sap.sailing.gwt.ui.shared.EventDTO;
import com.sap.sailing.gwt.ui.shared.GPSFixDTO;
import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO;
import com.sap.sailing.gwt.ui.shared.ManeuverDTO;
import com.sap.sailing.gwt.ui.shared.MarkDTO;
import com.sap.sailing.gwt.ui.shared.RaceCourseDTO;
import com.sap.sailing.gwt.ui.shared.RaceGroupDTO;
import com.sap.sailing.gwt.ui.shared.RaceLogDTO;
@@ -398,4 +401,16 @@ public interface SailingService extends RemoteService {
void setCompetitorRegistrations(String leaderboardName, String raceColumnName, String fleetName, Set<CompetitorDTO> competitors);
Iterable<CompetitorDTO> getCompetitorRegistrations(String leaderboardName, String raceColumnName, String fleetName);
void addMarkToRaceLog(String leaderboardName, String raceColumnName, String fleetName, MarkDTO markDTO);
Collection<MarkDTO> getMarksInRaceLog(String leaderboardName, String raceColumnName, String fleetName);
/**
* Adds the course definition to the racelog, while trying to reuse existing marks, controlpoints and waypoints
* from the previous course definition in the racelog.
*/
void addCourseDefinitionToRaceLog(String leaderboardName, String raceColumnName, String fleetName, List<Pair<ControlPointDTO, PassingInstruction>> course);
RaceCourseDTO getLastCourseDefinitionInRaceLog(String leaderboardName, String raceColumnName, String fleetName);
}
@@ -47,6 +47,7 @@ import com.sap.sailing.gwt.ui.shared.EventDTO;
import com.sap.sailing.gwt.ui.shared.GPSFixDTO;
import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO;
import com.sap.sailing.gwt.ui.shared.ManeuverDTO;
import com.sap.sailing.gwt.ui.shared.MarkDTO;
import com.sap.sailing.gwt.ui.shared.RaceCourseDTO;
import com.sap.sailing.gwt.ui.shared.RaceGroupDTO;
import com.sap.sailing.gwt.ui.shared.RaceLogDTO;
@@ -535,5 +536,17 @@ public interface SailingServiceAsync {
void getCompetitorRegistrations(String leaderboardName, String raceColumnName, String fleetName,
AsyncCallback<Iterable<CompetitorDTO>> callback);
void addMarkToRaceLog(String leaderboardName, String raceColumnName, String fleetName, MarkDTO markDTO,
AsyncCallback<Void> callback);
void getMarksInRaceLog(String leaderboardName, String raceColumnName, String fleetName,
AsyncCallback<Collection<MarkDTO>> callback);
void addCourseDefinitionToRaceLog(String leaderboardName, String raceColumnName, String fleetName,
List<Pair<ControlPointDTO, PassingInstruction>> course, AsyncCallback<Void> callback);
void getLastCourseDefinitionInRaceLog(String leaderboardName, String raceColumnName, String fleetName,
AsyncCallback<RaceCourseDTO> callback);
}
@@ -971,4 +971,11 @@ public interface StringMessages extends Messages {
String canOnlyBeEditedBeforeStartingTracking();
String defineCourse();
String mapDevices();
@Key("edit_what")
String edit(String what);
@Key("add_what")
String add(String what);
@Key("remove_what")
String remove(String what);
String pleaseEnterA(String what);
}
@@ -959,4 +959,8 @@ competitorRegistrations=Competitor Registrations
trackerStatus=Tracker Status
canOnlyBeEditedBeforeStartingTracking=Can only be edited before starting tracking
defineCourse=Define Course Layout
mapDevices=Map Devices to Competitors and Marks
mapDevices=Map Devices to Competitors and Marks
edit_what=Edit {0}
add_what=Add {0}
remove_what=Remove {0}
pleaseEnterA=Please enter a {0}
@@ -955,4 +955,8 @@ competitorRegistrations=Team Anmeldungen
trackerStatus=Tracker-Status
canOnlyBeEditedBeforeStartingTracking=Kann nur vor Beginn des Trackings bearbeitet werden
defineCourse=Kurs definieren
mapDevices=Gerätezuordnung zu Teams und Tonnen
mapDevices=Gerätezuordnung zu Teams und Tonnen
edit_what={0} bearbeiten
add_what={0} hinzufügen
remove_what={0} entfernen
pleaseEnterA=Bitte {0} eingeben.
@@ -86,6 +86,8 @@ import com.sap.sailing.domain.base.configuration.impl.RRS26ConfigurationImpl;
import com.sap.sailing.domain.base.configuration.impl.RacingProcedureConfigurationImpl;
import com.sap.sailing.domain.base.configuration.impl.RegattaConfigurationImpl;
import com.sap.sailing.domain.base.impl.BoatImpl;
import com.sap.sailing.domain.base.impl.CourseDataImpl;
import com.sap.sailing.domain.base.impl.CourseImpl;
import com.sap.sailing.domain.base.impl.DynamicBoat;
import com.sap.sailing.domain.base.impl.DynamicPerson;
import com.sap.sailing.domain.base.impl.DynamicTeam;
@@ -180,6 +182,7 @@ import com.sap.sailing.domain.racelog.RaceLogEventFactory;
import com.sap.sailing.domain.racelog.RaceLogFlagEvent;
import com.sap.sailing.domain.racelog.RaceStateOfSameDayHelper;
import com.sap.sailing.domain.racelog.analyzing.impl.AbortingFlagFinder;
import com.sap.sailing.domain.racelog.analyzing.impl.LastPublishedCourseDesignFinder;
import com.sap.sailing.domain.racelog.state.ReadonlyRaceState;
import com.sap.sailing.domain.racelog.state.impl.ReadonlyRaceStateImpl;
import com.sap.sailing.domain.racelog.state.racingprocedure.FlagPoleState;
@@ -188,6 +191,7 @@ import com.sap.sailing.domain.racelog.state.racingprocedure.rrs26.ReadonlyRRS26R
import com.sap.sailing.domain.racelog.tracking.RaceLogTrackingAdapter;
import com.sap.sailing.domain.racelog.tracking.RaceLogTrackingAdapterFactory;
import com.sap.sailing.domain.racelog.tracking.RegisterCompetitorEvent;
import com.sap.sailing.domain.racelog.tracking.analyzing.impl.DefinedMarkFinder;
import com.sap.sailing.domain.racelog.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer;
import com.sap.sailing.domain.racelog.tracking.analyzing.impl.RegisteredCompetitorsAnalyzer;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingAdapter;
@@ -1620,7 +1624,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
} else {
final Position posOfFirst = trackedRace.getOrCreateTrack(controlPoint.getMarks().iterator().next()).
getEstimatedPosition(timePoint, /* extrapolate */ false);
result = new MarkDTO(controlPoint.getId().toString(), controlPoint.getName(), posOfFirst.getLatDeg(), posOfFirst.getLngDeg());
result = new MarkDTO(controlPoint.getId().toString(), controlPoint.getName(), posOfFirst == null ? -1 : posOfFirst.getLatDeg(), posOfFirst == null ? -1 : posOfFirst.getLngDeg());
}
return result;
}
@@ -1637,6 +1641,55 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
return result;
}
/**
* For each {@link ControlPointDTO} in <code>controlPoints</code> tries to find the best-matching waypoint
* from the {@code old} {@code CourseBase}.
* If such a waypoint is found, its control point is added to the control point list for the new course.
* Otherwise, a new control point is created using the default {@link com.sap.sailing.domain.base.DomainFactory}
* instance.
*/
private List<Pair<ControlPoint, PassingInstruction>> resolveControlPoints(
CourseBase old, List<Pair<ControlPointDTO, PassingInstruction>> controlPoints) {
Iterable<Waypoint> waypoints = old.getWaypoints();
List<Pair<ControlPoint, PassingInstruction>> newControlPoints = new ArrayList<Pair<ControlPoint, PassingInstruction>>();
int lastMatchPosition = -1;
for (Pair<ControlPointDTO, PassingInstruction> controlPointAndPassingInstruction : controlPoints) {
ControlPointDTO controlPointDTO = controlPointAndPassingInstruction.getA();
ControlPoint matchFromOldCourse = null;
for (int i=lastMatchPosition+1; matchFromOldCourse == null && i<Util.size(waypoints); i++) {
Waypoint waypointAtI = Util.get(waypoints, i);
ControlPoint controlPointAtI = waypointAtI.getControlPoint();
if (controlPointAtI.getId().toString().equals(controlPointDTO.getIdAsString()) && markIDsMatch(controlPointAtI.getMarks(), controlPointDTO.getMarks())) {
matchFromOldCourse = controlPointAtI;
newControlPoints.add(new Pair<ControlPoint, PassingInstruction>(matchFromOldCourse, null));
lastMatchPosition = i;
}
}
if (matchFromOldCourse == null) {
// no match found; create new control point:
ControlPoint newControlPoint;
if (controlPointDTO instanceof GateDTO) {
GateDTO gateDTO = (GateDTO) controlPointDTO;
final Serializable id;
if (gateDTO.getIdAsString() == null) {
id = UUID.randomUUID();
} else {
id = gateDTO.getIdAsString();
}
Mark left = baseDomainFactory.getOrCreateMark(gateDTO.getLeft().getIdAsString(), gateDTO.getLeft().getName());
Mark right = baseDomainFactory.getOrCreateMark(gateDTO.getRight().getIdAsString(), gateDTO.getRight().getName());
newControlPoint = baseDomainFactory.createControlPointWithTwoMarks(id, left, right, gateDTO.getName());
newControlPoints.add(new Pair<ControlPoint, PassingInstruction>(newControlPoint, null));
} else {
newControlPoint = baseDomainFactory.getOrCreateMark(controlPointDTO.getIdAsString(), controlPointDTO.getName());
PassingInstruction passingInstructions = controlPointAndPassingInstruction.getB();
newControlPoints.add(new Pair<ControlPoint, PassingInstruction>(newControlPoint, passingInstructions));
}
}
}
return newControlPoints;
}
/**
* For each {@link ControlPointDTO} in <code>controlPoints</code> tries to find the best-matching waypoint
* from the course that belongs to the race identified by <code>raceIdentifier</code>. If such a waypoint is
@@ -1650,43 +1703,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
TrackedRace trackedRace = getExistingTrackedRace(raceIdentifier);
if (trackedRace != null) {
Course course = trackedRace.getRace().getCourse();
Iterable<Waypoint> waypoints = course.getWaypoints();
List<Pair<ControlPoint, PassingInstruction>> newControlPoints = new ArrayList<Pair<ControlPoint, PassingInstruction>>();
int lastMatchPosition = -1;
for (Pair<ControlPointDTO, PassingInstruction> controlPointAndPassingInstruction : controlPoints) {
ControlPointDTO controlPointDTO = controlPointAndPassingInstruction.getA();
ControlPoint matchFromOldCourse = null;
for (int i=lastMatchPosition+1; matchFromOldCourse == null && i<Util.size(waypoints); i++) {
Waypoint waypointAtI = Util.get(waypoints, i);
ControlPoint controlPointAtI = waypointAtI.getControlPoint();
if (controlPointAtI.getId().toString().equals(controlPointDTO.getIdAsString()) && markIDsMatch(controlPointAtI.getMarks(), controlPointDTO.getMarks())) {
matchFromOldCourse = controlPointAtI;
newControlPoints.add(new Pair<ControlPoint, PassingInstruction>(matchFromOldCourse, null));
lastMatchPosition = i;
}
}
if (matchFromOldCourse == null) {
// no match found; create new control point:
ControlPoint newControlPoint;
if (controlPointDTO instanceof GateDTO) {
GateDTO gateDTO = (GateDTO) controlPointDTO;
final Serializable id;
if (gateDTO.getIdAsString() == null) {
id = UUID.randomUUID();
} else {
id = gateDTO.getIdAsString();
}
Mark left = baseDomainFactory.getOrCreateMark(gateDTO.getLeft().getIdAsString(), gateDTO.getLeft().getName());
Mark right = baseDomainFactory.getOrCreateMark(gateDTO.getRight().getIdAsString(), gateDTO.getRight().getName());
newControlPoint = baseDomainFactory.createControlPointWithTwoMarks(id, left, right, gateDTO.getName());
newControlPoints.add(new Pair<ControlPoint, PassingInstruction>(newControlPoint, null));
} else {
newControlPoint = baseDomainFactory.getOrCreateMark(controlPointDTO.getIdAsString(), controlPointDTO.getName());
PassingInstruction passingInstructions = controlPointAndPassingInstruction.getB();
newControlPoints.add(new Pair<ControlPoint, PassingInstruction>(newControlPoint, passingInstructions));
}
}
}
List<Pair<ControlPoint, PassingInstruction>> newControlPoints = resolveControlPoints(course, controlPoints);
try {
course.update(newControlPoints, baseDomainFactory);
} catch (Exception e) {
@@ -3943,4 +3960,99 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
unregisterCompetitor(raceLog, c);
}
}
/**
* Generates new id, does not resolve against domain factory.
*/
private Mark convertToMark(MarkDTO dto) {
// Mark existing = baseDomainFactory.getExistingMarkByIdAsString(dto.getIdAsString());
// if (existing != null) {
// return existing;
// }
// Serializable id = dto.getIdAsString();
// if (id == null) {
Serializable id = UUID.randomUUID();
// }
return baseDomainFactory.getOrCreateMark(id, dto.getName(), dto.type, dto.color, dto.shape, dto.pattern);
}
private Collection<MarkDTO> convertToMarkDTOs(Iterable<Mark> marks) {
List<MarkDTO> dtos = new ArrayList<MarkDTO>();
for (Mark mark : marks) {
dtos.add(convertToMarkDTO(mark, null));
}
return dtos;
}
@Override
public void addMarkToRaceLog(String leaderboardName, String raceColumnName, String fleetName, MarkDTO markDTO) {
Mark mark = convertToMark(markDTO);
RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName);
RaceLogEvent event = RaceLogEventFactory.INSTANCE.createDefineMarkEvent(MillisecondsTimePoint.now(),
getService().getServerAuthor(), raceLog.getCurrentPassId(), mark);
raceLog.add(event);
}
@Override
public Collection<MarkDTO> getMarksInRaceLog(String leaderboardName, String raceColumnName, String fleetName) {
RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName);
Collection<Mark> marks = new DefinedMarkFinder(raceLog).analyze();
return convertToMarkDTOs(marks);
}
@Override
public void addCourseDefinitionToRaceLog(String leaderboardName, String raceColumnName, String fleetName,
List<Pair<ControlPointDTO, PassingInstruction>> courseDTO) {
RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName);
String name = String.format("Course for %s - %s - %s", leaderboardName, raceColumnName, fleetName);
CourseBase lastPublishedCourse = new LastPublishedCourseDesignFinder(raceLog).analyze();
if (lastPublishedCourse == null) {
lastPublishedCourse = new CourseDataImpl(name);
}
List<Pair<ControlPoint, PassingInstruction>> waypoints = resolveControlPoints(lastPublishedCourse, courseDTO);
Course course = new CourseImpl(name, lastPublishedCourse.getWaypoints());
try {
course.update(waypoints, baseDomainFactory);
} catch (Exception e) {
throw new RuntimeException(e);
}
RaceLogEvent event = RaceLogEventFactory.INSTANCE.createCourseDesignChangedEvent(MillisecondsTimePoint.now(),
getService().getServerAuthor(), raceLog.getCurrentPassId(), course);
raceLog.add(event);
}
private WaypointDTO convertToWaypointDTO(Waypoint waypoint) {
ControlPointDTO cp = convertToControlPointDTO(waypoint.getControlPoint());
List<MarkDTO> marks = new ArrayList<MarkDTO>();
Util.addAll(cp.getMarks(), marks);
return new WaypointDTO(waypoint.getName(), cp, marks, waypoint.getPassingInstructions());
}
private RaceCourseDTO convertToRaceCourseDTO(CourseBase course) {
List<WaypointDTO> waypointDTOs = new ArrayList<WaypointDTO>();
RaceCourseDTO result = new RaceCourseDTO(waypointDTOs);
for (Waypoint waypoint : course.getWaypoints()) {
waypointDTOs.add(convertToWaypointDTO(waypoint));
}
return result;
}
@Override
public RaceCourseDTO getLastCourseDefinitionInRaceLog(String leaderboardName, String raceColumnName,
String fleetName) {
RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName);
CourseBase lastPublishedCourse = new LastPublishedCourseDesignFinder(raceLog).analyze();
if (lastPublishedCourse == null) {
lastPublishedCourse = new CourseDataImpl("");
}
return convertToRaceCourseDTO(lastPublishedCourse);
}
}
@@ -0,0 +1,5 @@
package com.sap.sailing.gwt.ui.shared;
public enum HtmlPredefinedColor {
aqua, black, blue, fuchsia, gray, green, lime, maroon, navy, olive, orange, purple, red, silver, teal, white, yellow
}