Merge branch 'master' into bug4370

This commit is contained in:
Axel Uhl committed 2017-11-22 14:08:13 +01:00
commit 7c8374ebcd
21 files changed
+619 -171

No files matched your search

@@ -158,6 +158,7 @@ public class RaceStateImpl extends ReadonlyRaceStateImpl implements RaceState {
public void forceNewDependentStartTime(TimePoint now, final Duration startTimeDifference, final SimpleRaceLogIdentifier dependentOnRace) {
raceLog.add(new RaceLogDependentStartTimeEventImpl(now, author, raceLog.getCurrentPassId(), dependentOnRace, startTimeDifference));
}
@Override
public void setFinishingTime(TimePoint timePoint) {
@@ -166,7 +167,10 @@ public class RaceStateImpl extends ReadonlyRaceStateImpl implements RaceState {
@Override
public void setFinishedTime(TimePoint timePoint) {
raceLog.add(new RaceLogRaceStatusEventImpl(timePoint, author, raceLog.getCurrentPassId(), RaceLogRaceStatus.FINISHED));
raceLog.add(new RaceLogRaceStatusEventImpl(timePoint, author, raceLog.getCurrentPassId(),
RaceLogRaceStatus.FINISHED));
// ensure caches are synched
forceUpdate();
}
@Override
@@ -42,6 +42,7 @@
<inherits name='com.sap.sailing.gwt.ui.SourceActions'/>
<inherits name='com.sap.sailing.gwt.ui.SourceSimulator'/>
<inherits name="com.sap.sailing.gwt.ui.SourceAdminConsole"/>
<!-- TODO: probably only used for flag images. Move RegattaRaceStatesFlagsResources to shared -->
<inherits name="com.sap.sailing.gwt.regattaoverview.SourceRegattaOverview"/>
<inherits name="com.sap.sailing.gwt.ui.SourceLeaderboard"/>
<inherits name="com.sap.sailing.gwt.ui.SourceRaceboard"/>
@@ -48,6 +48,10 @@ interface AdminConsoleResources extends ClientBundle {
@Source("com/sap/sailing/gwt/ui/client/images/clock.png")
ImageResource clockIcon();
// Smaller variant of RegattaRaceStatesFlagsResources.flagBlue to solve layouting issues
@Source("com/sap/sailing/gwt/ui/client/images/blue_small.png")
ImageResource blueSmall();
@Source("com/sap/sailing/gwt/ui/client/images/flag_blue.png")
ImageResource flagIcon();
@@ -60,9 +60,11 @@ import com.sap.sailing.gwt.ui.client.shared.controls.SelectionCheckboxColumn;
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardEntryPoint;
import com.sap.sailing.gwt.ui.leaderboard.ScoringSchemeTypeFormatter;
import com.sap.sailing.gwt.ui.shared.EventDTO;
import com.sap.sailing.gwt.ui.shared.RaceLogSetFinishingAndFinishTimeDTO;
import com.sap.sailing.gwt.ui.shared.RaceLogSetStartTimeAndProcedureDTO;
import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO;
import com.sap.sse.common.Util;
import com.sap.sse.common.Util.Pair;
import com.sap.sse.common.util.NaturalComparator;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.async.MarkedAsyncCallback;
@@ -473,6 +475,8 @@ TrackedRaceChangedListener, LeaderboardsDisplayer {
refreshRaceLog(object.getA(), object.getB(), true);
} else if (LeaderboardRaceConfigImagesBarCell.ACTION_SET_STARTTIME.equals(value)) {
setStartTime(object.getA(), object.getB());
} else if (LeaderboardRaceConfigImagesBarCell.ACTION_SET_FINISHING_AND_FINISH_TIME.equals(value)) {
setEndTime(object.getA(), object.getB());
} else if (LeaderboardRaceConfigImagesBarCell.ACTION_SHOW_RACELOG.equals(value)) {
showRaceLog(object.getA(), object.getB());
}
@@ -594,28 +598,56 @@ TrackedRaceChangedListener, LeaderboardsDisplayer {
}
private void setStartTime(RaceColumnDTO raceColumnDTO, FleetDTO fleetDTO) {
new SetStartTimeDialog(sailingService, errorReporter, getSelectedLeaderboardName(), raceColumnDTO.getName(),
new SetStartTimeDialog(sailingService, errorReporter, getSelectedLeaderboardName(), raceColumnDTO.getName(),
fleetDTO.getName(), stringMessages, new DialogCallback<RaceLogSetStartTimeAndProcedureDTO>() {
@Override
public void ok(RaceLogSetStartTimeAndProcedureDTO editedObject) {
sailingService.setStartTimeAndProcedure(editedObject, new AsyncCallback<Boolean>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError(caught.getMessage());
public void ok(RaceLogSetStartTimeAndProcedureDTO editedObject) {
sailingService.setStartTimeAndProcedure(editedObject, new AsyncCallback<Boolean>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError(caught.getMessage());
}
@Override
public void onSuccess(Boolean result) {
if (!result) {
Window.alert(stringMessages.failedToSetNewStartTime());
}
}
});
}
@Override
public void onSuccess(Boolean result) {
if (!result) {
Window.alert(stringMessages.failedToSetNewStartTime());
}
public void cancel() {
}
});
}
}).show();
}
private void setEndTime(RaceColumnDTO raceColumnDTO, FleetDTO fleetDTO) {
new SetFinishingAndFinishedTimeDialog(sailingService, errorReporter, getSelectedLeaderboardName(), raceColumnDTO.getName(),
fleetDTO.getName(), stringMessages, new DialogCallback<RaceLogSetFinishingAndFinishTimeDTO>() {
@Override
public void ok(RaceLogSetFinishingAndFinishTimeDTO editedObject) {
sailingService.setFinishingAndEndTime(editedObject, new AsyncCallback<Pair<Boolean, Boolean>>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError(caught.getMessage());
}
@Override
public void cancel() { }
}).show();
@Override
public void onSuccess(Pair<Boolean, Boolean> result) {
if (!result.getA() || !result.getB()) {
Window.alert(stringMessages.failedToSetNewFinishingAndFinishTime());
}
}
});
}
@Override
public void cancel() {
}
}).show();
}
private void removeRaceColumn(final RaceColumnDTO raceColumnDTO) {
@@ -15,6 +15,7 @@ public class LeaderboardRaceConfigImagesBarCell extends ImagesBarCell {
public final static String ACTION_EDIT = "ACTION_EDIT";
public final static String ACTION_REFRESH_RACELOG = "ACTION_REFRESH_RACE_LOG";
public final static String ACTION_SET_STARTTIME = "ACTION_SET_STARTTIME";
public final static String ACTION_SET_FINISHING_AND_FINISH_TIME = "ACTION_SET_FINISHING_AND_FINISH_TIME";
public final static String ACTION_SHOW_RACELOG = "ACTION_SHOW_RACELOG";
private final StringMessages stringMessages;
@@ -39,6 +40,7 @@ public class LeaderboardRaceConfigImagesBarCell extends ImagesBarCell {
}
result.add(new ImageSpec(ACTION_REFRESH_RACELOG, stringMessages.refreshRaceLog(), makeImagePrototype(resources.reloadIcon())));
result.add(new ImageSpec(ACTION_SET_STARTTIME, stringMessages.setStartTime(), makeImagePrototype(resources.clockIcon())));
result.add(new ImageSpec(ACTION_SET_FINISHING_AND_FINISH_TIME, stringMessages.setFinishingAndFinishTime(), makeImagePrototype(resources.blueSmall())));
result.add(new ImageSpec(ACTION_SHOW_RACELOG, stringMessages.raceLog(), makeImagePrototype(resources.flagIcon())));
return result;
}
@@ -19,6 +19,7 @@ public class RaceLogTrackingEventManagementRaceImagesBarCell extends ImagesBarCe
public final static String ACTION_EDIT = "ACTION_EDIT";
public final static String ACTION_REFRESH_RACELOG = "ACTION_REFRESH_RACE_LOG";
public final static String ACTION_SET_STARTTIME = "ACTION_SET_STARTTIME";
public final static String ACTION_SET_FINISHING_AND_FINISH_TIME = "ACTION_SET_FINISHING_AND_FINISH_TIME";
public final static String ACTION_SHOW_RACELOG = "ACTION_SHOW_RACELOG";
public final static String ACTION_SET_TRACKING_TIMES = "ACTION_SET_TRACKING_TIMES";
public final static String ACTION_STOP_TRACKING = "ACTION_STOP_TRACKING";
@@ -50,6 +51,7 @@ public class RaceLogTrackingEventManagementRaceImagesBarCell extends ImagesBarCe
result.add(new ImageSpec(ACTION_EDIT, stringMessages.actionEdit(), makeImagePrototype(resources.editIcon())));
result.add(new ImageSpec(ACTION_REFRESH_RACELOG, stringMessages.refreshRaceLog(), makeImagePrototype(resources.reloadIcon())));
result.add(new ImageSpec(ACTION_SET_STARTTIME, stringMessages.setStartTime(), makeImagePrototype(resources.clockIcon())));
result.add(new ImageSpec(ACTION_SET_FINISHING_AND_FINISH_TIME, stringMessages.setFinishingAndFinishTime(), makeImagePrototype(resources.blueSmall())));
result.add(new ImageSpec(ACTION_SHOW_RACELOG, stringMessages.raceLog(), makeImagePrototype(resources.flagIcon())));
result.add(new ImageSpec(ACTION_SET_TRACKING_TIMES, stringMessages.setTrackingTimes(), makeImagePrototype(resources.setTrackingTimes())));
@@ -0,0 +1,124 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.Date;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.BetterDateTimeBox;
import com.sap.sailing.gwt.ui.shared.RaceLogSetFinishingAndFinishTimeDTO;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
public class SetFinishingAndFinishedTimeDialog extends SetTimeDialog<RaceLogSetFinishingAndFinishTimeDTO> {
private BetterDateTimeBox finishTimeBox;
private Label currentFinishTimeLabel;
public SetFinishingAndFinishedTimeDialog(SailingServiceAsync service, ErrorReporter errorReporter, String leaderboardName,
String raceColumnName, String fleetName, StringMessages stringMessages,
DataEntryDialog.DialogCallback<RaceLogSetFinishingAndFinishTimeDTO> callback) {
super(service, errorReporter, stringMessages.setFinishingAndFinishTime(), stringMessages.setFinishingAndFinishTimeDescription(),
stringMessages.setFinishingAndFinishTime(), stringMessages.cancel(), leaderboardName, raceColumnName, fleetName,
stringMessages, new EndTimeValidator(stringMessages), callback);
this.ensureDebugId("SetFinishingAndFinishedTimeDialog");
}
@Override
protected RaceLogSetFinishingAndFinishTimeDTO getResult() {
RaceLogSetFinishingAndFinishTimeDTO dto = new RaceLogSetFinishingAndFinishTimeDTO();
dto.leaderboardName = leaderboardName;
dto.raceColumnName = raceColumnName;
dto.fleetName = fleetName;
dto.authorName = authorNameBox.getValue();
dto.authorPriority = authorPriorityBox.getValue();
dto.finishTime = finishTimeBox.getValue();
dto.finishingTime = timeBox.getValue();
dto.passId = currentPassId;
return dto;
}
@Override
protected void refreshCurrentTime() {
service.getFinishingAndFinishTime(leaderboardName, raceColumnName, fleetName,
new AsyncCallback<com.sap.sse.common.Util.Triple<Date, Date, Integer>>() {
@Override
public void onSuccess(com.sap.sse.common.Util.Triple<Date, Date, Integer> result) {
if (result == null) {
currentFinishTimeLabel.setText(stringMessages.notAvailable());
currentPassIdBox.setText(stringMessages.notAvailable());
} else {
setDate(result.getA(), currentStartOrFinishingTimeLabel, timeBox);
setDate(result.getB(), currentFinishTimeLabel, finishTimeBox);
currentPassId = result.getC().intValue();
currentPassIdBox.setText(result.getC().toString());
}
}
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError(caught.getMessage());
}
});
}
void setDate(Date date, Label currentValueLabel, BetterDateTimeBox dateTimeBox) {
if (date == null) {
currentValueLabel.setText(stringMessages.unknown());
} else {
dateTimeBox.setValue(date);
currentValueLabel.setText(DateTimeFormat
.getFormat(DateTimeFormat.PredefinedFormat.DATE_TIME_MEDIUM).format(date));
}
}
private static class EndTimeValidator implements Validator<RaceLogSetFinishingAndFinishTimeDTO> {
private final StringMessages stringMessages;
public EndTimeValidator(StringMessages stringMessages) {
this.stringMessages = stringMessages;
}
@Override
public String getErrorMessage(RaceLogSetFinishingAndFinishTimeDTO dto) {
if (dto.authorName == null || dto.authorName.isEmpty() || dto.authorPriority == null
|| dto.finishTime == null || dto.finishingTime == null) {
return stringMessages.pleaseEnterAValue();
}
// both times are != null at this point
if (dto.finishTime.before(dto.finishingTime)) {
return stringMessages.finishTimeMustBeAtOrAfterFinishingTime();
}
return null;
}
}
@Override
protected String getTimeLabel() {
return stringMessages.finishingTime();
}
@Override
protected void additionalCurrentTimeLabel(Grid content) {
currentFinishTimeLabel = new Label("");
content.setWidget(1, 0, createLabel(stringMessages.finishTimeString()));
content.setWidget(1, 1, currentFinishTimeLabel);
}
@Override
protected void addAdditionalInput(Grid content) {
}
@Override
protected void additionalInput(Grid content) {
finishTimeBox = createDateTimeBox(new Date());
finishTimeBox.setFormat("dd/mm/yyyy hh:ii:ss");
finishTimeBox.ensureDebugId("FinishTimeBox");
content.setWidget(1, 0, createLabel(stringMessages.finishTimeString()));
content.setWidget(1, 1, finishTimeBox);
}
}
@@ -2,136 +2,30 @@ package com.sap.sailing.gwt.ui.adminconsole;
import java.util.Date;
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.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.CaptionPanel;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.PushButton;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.gwt.ui.client.DataEntryDialogWithBootstrap;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.BetterDateTimeBox;
import com.sap.sailing.gwt.ui.shared.RaceLogSetStartTimeAndProcedureDTO;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
public class SetStartTimeDialog extends DataEntryDialogWithBootstrap<RaceLogSetStartTimeAndProcedureDTO> {
public class SetStartTimeDialog extends SetTimeDialog<RaceLogSetStartTimeAndProcedureDTO> {
protected ListBox racingProcedureSelection;
protected CheckBox advancePassIdCheckbox;
private static AdminConsoleResources resources = GWT.create(AdminConsoleResources.class);
private final SailingServiceAsync service;
private final ErrorReporter errorReporter;
private final String leaderboardName;
private final String raceColumnName;
private final String fleetName;
private final StringMessages stringMessages;
private int currentPassId = -1;
private Label currentStartTimeLabel;
private Label currentPassIdBox;
private BetterDateTimeBox timeBox;
private TextBox authorNameBox;
private com.sap.sse.gwt.client.controls.IntegerBox authorPriorityBox;
private ListBox racingProcedureSelection;
private CheckBox advancePassIdCheckbox;
public SetStartTimeDialog(SailingServiceAsync service, ErrorReporter errorReporter, String leaderboardName,
String raceColumnName, String fleetName, StringMessages stringMessages,
public SetStartTimeDialog(SailingServiceAsync service, ErrorReporter errorReporter, String leaderboardName,
String raceColumnName, String fleetName, StringMessages stringMessages,
DataEntryDialog.DialogCallback<RaceLogSetStartTimeAndProcedureDTO> callback) {
super(stringMessages.setStartTime(), stringMessages.setStartTimeDescription(), stringMessages.setStartTime(),
stringMessages.cancel(), new StartTimeValidator(stringMessages), callback);
this.service = service;
this.errorReporter = errorReporter;
this.stringMessages = stringMessages;
this.leaderboardName = leaderboardName;
this.raceColumnName = raceColumnName;
this.fleetName = fleetName;
super(service, errorReporter, stringMessages.setStartTime(), stringMessages.setStartTimeDescription(),
stringMessages.setStartTime(), stringMessages.cancel(), leaderboardName, raceColumnName, fleetName,
stringMessages, new StartTimeValidator(stringMessages), callback);
this.ensureDebugId("SetStartTimeDialog");
}
@Override
protected Widget getAdditionalWidget() {
VerticalPanel content = new VerticalPanel();
content.add(createCurrentPanel());
content.add(createInputPanel());
refreshCurrentStartTime();
return content;
}
private Widget createCurrentPanel() {
CaptionPanel current = new CaptionPanel(stringMessages.liveData());
HorizontalPanel currentPanel = new HorizontalPanel();
currentPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE);
Grid grid = new Grid(2,2);
currentStartTimeLabel = new Label("");
grid.setWidget(0, 0, createLabel(stringMessages.startTime()));
grid.setWidget(0, 1, currentStartTimeLabel);
currentPassIdBox = new Label("");
grid.setWidget(1, 0, createLabel(stringMessages.currentPass()));
grid.setWidget(1, 1, currentPassIdBox);
currentPanel.add(grid);
PushButton refreshButton = new PushButton(new Image(resources.reloadIcon()));
refreshButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
refreshCurrentStartTime();
}
});
currentPanel.add(refreshButton);
current.add(currentPanel);
return current;
}
private Widget createInputPanel() {
Grid content = new Grid(5, 2);
timeBox = createDateTimeBox(new Date());
timeBox.setFormat("dd/mm/yyyy hh:ii:ss");
timeBox.ensureDebugId("StartTimeTimeBox");
content.setWidget(0, 0, createLabel(stringMessages.startTime()));
content.setWidget(0, 1, timeBox);
authorNameBox = createTextBox("Shore");
authorNameBox.ensureDebugId("AuthorNameTextBox");
content.setWidget(1, 0, createLabel(stringMessages.authorName()));
content.setWidget(1, 1, authorNameBox);
authorPriorityBox = createIntegerBox(4, 2);
authorPriorityBox.ensureDebugId("AuthorPriorityIntegerBox");
content.setWidget(2, 0, createLabel(stringMessages.authorPriority()));
content.setWidget(2, 1, authorPriorityBox);
racingProcedureSelection = createListBox(false);
ListBoxUtils.setupRacingProcedureTypeListBox(racingProcedureSelection, RacingProcedureType.RRS26, stringMessages.no());
int racingCounter = 0;
for (RacingProcedureType racingType : RacingProcedureType.values()) {
racingProcedureSelection.setValue(racingCounter++, racingType.name());
}
racingProcedureSelection.ensureDebugId("RacingProcedureListBox");
content.setWidget(3, 0, createLabel(stringMessages.racingProcedure()));
content.setWidget(3, 1, racingProcedureSelection);
advancePassIdCheckbox = createCheckbox(stringMessages.advancePassId());
advancePassIdCheckbox.setValue(false);
advancePassIdCheckbox.ensureDebugId("AnvancePassIdCheckBox");
content.setWidget(4, 1, advancePassIdCheckbox);
return content;
}
@Override
protected RaceLogSetStartTimeAndProcedureDTO getResult() {
@@ -143,64 +37,94 @@ public class SetStartTimeDialog extends DataEntryDialogWithBootstrap<RaceLogSetS
dto.authorPriority = authorPriorityBox.getValue();
dto.logicalTimePoint = new Date();
dto.startTime = timeBox.getValue();
dto.passId = advancePassIdCheckbox.getValue() ? currentPassId+1 : currentPassId;
dto.passId = advancePassIdCheckbox.getValue() ? currentPassId + 1 : currentPassId;
dto.racingProcedure = RacingProcedureType.values()[racingProcedureSelection.getSelectedIndex()];
return dto;
}
private void refreshCurrentStartTime() {
service.getStartTimeAndProcedure(leaderboardName, raceColumnName, fleetName, new AsyncCallback<com.sap.sse.common.Util.Triple<Date,Integer, RacingProcedureType>>() {
@Override
public void onSuccess(com.sap.sse.common.Util.Triple<Date, Integer, RacingProcedureType> result) {
if (result == null) {
currentStartTimeLabel.setText(stringMessages.notAvailable());
currentPassIdBox.setText(stringMessages.notAvailable());
} else {
Date startTime = result.getA();
if (startTime == null) {
currentStartTimeLabel.setText(stringMessages.unknown());
} else {
currentStartTimeLabel.setText(DateTimeFormat.getFormat(
DateTimeFormat.PredefinedFormat.DATE_TIME_MEDIUM).format(startTime));
}
currentPassId = result.getB().intValue();
currentPassIdBox.setText(result.getB().toString());
int racingProcedureIndex = 0;
for (RacingProcedureType racingProcedureSelect : RacingProcedureType.values()) {
if (racingProcedureSelect.equals(result.getC())) {
break;
@Override
protected void refreshCurrentTime() {
service.getStartTimeAndProcedure(leaderboardName, raceColumnName, fleetName,
new AsyncCallback<com.sap.sse.common.Util.Triple<Date, Integer, RacingProcedureType>>() {
@Override
public void onSuccess(com.sap.sse.common.Util.Triple<Date, Integer, RacingProcedureType> result) {
if (result == null) {
currentStartOrFinishingTimeLabel.setText(stringMessages.notAvailable());
currentPassIdBox.setText(stringMessages.notAvailable());
} else {
Date startTime = result.getA();
if (startTime == null) {
currentStartOrFinishingTimeLabel.setText(stringMessages.unknown());
} else {
currentStartOrFinishingTimeLabel.setText(DateTimeFormat
.getFormat(DateTimeFormat.PredefinedFormat.DATE_TIME_MEDIUM).format(startTime));
}
currentPassId = result.getB().intValue();
currentPassIdBox.setText(result.getB().toString());
int racingProcedureIndex = 0;
for (RacingProcedureType racingProcedureSelect : RacingProcedureType.values()) {
if (racingProcedureSelect.equals(result.getC())) {
break;
}
racingProcedureIndex++;
}
racingProcedureSelection.setSelectedIndex(racingProcedureIndex);
}
racingProcedureIndex++;
}
racingProcedureSelection.setSelectedIndex(racingProcedureIndex);
}
}
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError(caught.getMessage());
}
});
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError(caught.getMessage());
}
});
}
private static class StartTimeValidator implements Validator<RaceLogSetStartTimeAndProcedureDTO> {
private final StringMessages stringMessages;
public StartTimeValidator(StringMessages stringMessages) {
this.stringMessages = stringMessages;
}
@Override
public String getErrorMessage(RaceLogSetStartTimeAndProcedureDTO dto) {
if (dto.authorName == null || dto.authorName.isEmpty() ||
dto.authorPriority == null || dto.startTime == null) {
if (dto.authorName == null || dto.authorName.isEmpty() || dto.authorPriority == null
|| dto.startTime == null) {
return stringMessages.pleaseEnterAValue();
}
return null;
}
}
@Override
protected String getTimeLabel() {
return stringMessages.startTime();
}
@Override
protected void addAdditionalInput(Grid content) {
racingProcedureSelection = createListBox(false);
ListBoxUtils.setupRacingProcedureTypeListBox(racingProcedureSelection, RacingProcedureType.RRS26,
stringMessages.no());
int racingCounter = 0;
for (RacingProcedureType racingType : RacingProcedureType.values()) {
racingProcedureSelection.setValue(racingCounter++, racingType.name());
}
racingProcedureSelection.ensureDebugId("RacingProcedureListBox");
content.setWidget(4, 0, createLabel(stringMessages.racingProcedure()));
content.setWidget(4, 1, racingProcedureSelection);
advancePassIdCheckbox = createCheckbox(stringMessages.advancePassId());
advancePassIdCheckbox.setValue(false);
advancePassIdCheckbox.ensureDebugId("AnvancePassIdCheckBox");
content.setWidget(5, 0, advancePassIdCheckbox);
}
@Override
protected void additionalInput(Grid content) {
}
}
@@ -0,0 +1,135 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.Date;
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.user.client.ui.CaptionPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PushButton;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.gwt.ui.client.DataEntryDialogWithBootstrap;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.BetterDateTimeBox;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
public abstract class SetTimeDialog<T> extends DataEntryDialogWithBootstrap<T> {
private static AdminConsoleResources resources = GWT.create(AdminConsoleResources.class);
protected final SailingServiceAsync service;
protected final ErrorReporter errorReporter;
protected final String leaderboardName;
protected final String raceColumnName;
protected final String fleetName;
protected final StringMessages stringMessages;
protected int currentPassId = -1;
protected Label currentStartOrFinishingTimeLabel;
protected Label currentPassIdBox;
protected BetterDateTimeBox timeBox;
protected TextBox authorNameBox;
protected com.sap.sse.gwt.client.controls.IntegerBox authorPriorityBox;
public SetTimeDialog(SailingServiceAsync service, ErrorReporter errorReporter, String title, String message,
String okButtonName, String cancelButtonName, String leaderboardName, String raceColumnName,
String fleetName, StringMessages stringMessages,
com.sap.sse.gwt.client.dialog.DataEntryDialog.Validator<T> validator,
DataEntryDialog.DialogCallback<T> callback) {
super(title, message, okButtonName, cancelButtonName, validator, callback);
this.service = service;
this.errorReporter = errorReporter;
this.stringMessages = stringMessages;
this.leaderboardName = leaderboardName;
this.raceColumnName = raceColumnName;
this.fleetName = fleetName;
}
@Override
protected Widget getAdditionalWidget() {
VerticalPanel content = new VerticalPanel();
content.add(createCurrentPanel());
content.add(createInputPanel());
refreshCurrentTime();
return content;
}
private Widget createCurrentPanel() {
CaptionPanel current = new CaptionPanel(stringMessages.liveData());
HorizontalPanel currentPanel = new HorizontalPanel();
currentPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE);
Grid grid = new Grid(3, 2);
currentStartOrFinishingTimeLabel = new Label("");
grid.setWidget(0, 0, createLabel(getTimeLabel()));
grid.setWidget(0, 1, currentStartOrFinishingTimeLabel);
grid.setText(1, 0, "");
grid.setText(1, 1, "");
additionalCurrentTimeLabel(grid);
currentPassIdBox = new Label("");
grid.setWidget(2, 0, createLabel(stringMessages.currentPass()));
grid.setWidget(2, 1, currentPassIdBox);
currentPanel.add(grid);
PushButton refreshButton = new PushButton(new Image(resources.reloadIcon()));
refreshButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
refreshCurrentTime();
}
});
currentPanel.add(refreshButton);
current.add(currentPanel);
return current;
}
protected abstract String getTimeLabel();
private Widget createInputPanel() {
Grid content = new Grid(7, 2);
timeBox = createDateTimeBox(new Date());
timeBox.setFormat("dd/mm/yyyy hh:ii:ss");
timeBox.ensureDebugId("StartTimeTimeBox");
content.setWidget(0, 0, createLabel(getTimeLabel()));
content.setWidget(0, 1, timeBox);
content.setText(1, 0, "");
content.setText(1, 1, "");
additionalInput(content);
authorNameBox = createTextBox("Shore");
authorNameBox.ensureDebugId("AuthorNameTextBox");
content.setWidget(2, 0, createLabel(stringMessages.authorName()));
content.setWidget(2, 1, authorNameBox);
content.setWidget(3, 0, createLabel(stringMessages.authorPriority()));
authorPriorityBox = createIntegerBox(4, 2);
authorPriorityBox.ensureDebugId("AuthorPriorityIntegerBox");
content.setWidget(3, 1, authorPriorityBox);
addAdditionalInput(content);
return content;
}
protected void additionalCurrentTimeLabel(Grid content) {
}
protected abstract void additionalInput(Grid content);
protected abstract void addAdditionalInput(Grid content);
protected abstract void refreshCurrentTime();
}
@@ -55,6 +55,7 @@ import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapSettings;
import com.sap.sailing.gwt.ui.shared.ControlPointDTO;
import com.sap.sailing.gwt.ui.shared.DeviceConfigurationDTO;
import com.sap.sailing.gwt.ui.shared.EventDTO;
import com.sap.sailing.gwt.ui.shared.RaceLogSetFinishingAndFinishTimeDTO;
import com.sap.sailing.gwt.ui.shared.RaceLogSetStartTimeAndProcedureDTO;
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO;
@@ -380,6 +381,8 @@ public class SmartphoneTrackingEventManagementPanel extends AbstractLeaderboardC
refreshRaceLog(raceColumnDTOAndFleetDTO.getA(), raceColumnDTOAndFleetDTO.getB(), true);
} else if (RaceLogTrackingEventManagementRaceImagesBarCell.ACTION_SET_STARTTIME.equals(value)) {
setStartTime(getSelectedRaceColumnWithFleet().getA(), getSelectedRaceColumnWithFleet().getB());
} else if (RaceLogTrackingEventManagementRaceImagesBarCell.ACTION_SET_FINISHING_AND_FINISH_TIME.equals(value)) {
setEndTime(getSelectedRaceColumnWithFleet().getA(), getSelectedRaceColumnWithFleet().getB());
} else if (LeaderboardRaceConfigImagesBarCell.ACTION_SHOW_RACELOG.equals(value)) {
showRaceLog(raceColumnDTOAndFleetDTO.getA(), raceColumnDTOAndFleetDTO.getB());
} else if (RaceLogTrackingEventManagementRaceImagesBarCell.ACTION_SET_TRACKING_TIMES.equals(value)) {
@@ -756,6 +759,34 @@ public class SmartphoneTrackingEventManagementPanel extends AbstractLeaderboardC
}).show();
}
private void setEndTime(RaceColumnDTO raceColumnDTO, FleetDTO fleetDTO) {
new SetFinishingAndFinishedTimeDialog(sailingService, errorReporter, getSelectedLeaderboardName(), raceColumnDTO.getName(),
fleetDTO.getName(), stringMessages, new DialogCallback<RaceLogSetFinishingAndFinishTimeDTO>() {
@Override
public void ok(RaceLogSetFinishingAndFinishTimeDTO editedObject) {
sailingService.setFinishingAndEndTime(editedObject, new AsyncCallback<Pair<Boolean, Boolean>>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError(caught.getMessage());
}
@Override
public void onSuccess(Pair<Boolean, Boolean> result) {
if (!result.getA() || !result.getB()) {
Window.alert(stringMessages.failedToSetNewFinishingAndFinishTime());
} else {
trackedRacesListComposite.regattaRefresher.fillRegattas();
}
}
});
}
@Override
public void cancel() {
}
}).show();
}
private void refreshTrackingActionButtons(){
leaderboardSelectionChanged();
}
@@ -74,6 +74,7 @@ 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;
import com.sap.sailing.gwt.ui.shared.RaceLogSetFinishingAndFinishTimeDTO;
import com.sap.sailing.gwt.ui.shared.RaceLogSetStartTimeAndProcedureDTO;
import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO;
import com.sap.sailing.gwt.ui.shared.RaceboardDataDTO;
@@ -452,7 +453,11 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS
boolean setStartTimeAndProcedure(RaceLogSetStartTimeAndProcedureDTO dto);
Pair<Boolean, Boolean> setFinishingAndEndTime(RaceLogSetFinishingAndFinishTimeDTO dto);
Util.Triple<Date, Integer, RacingProcedureType> getStartTimeAndProcedure(String leaderboardName, String raceColumnName, String fleetName);
Util.Triple<Date, Date, Integer> getFinishingAndFinishTime(String leaderboardName, String raceColumnName, String fleetName);
Iterable<String> getAllIgtimiAccountEmailAddresses();
@@ -63,6 +63,7 @@ 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;
import com.sap.sailing.gwt.ui.shared.RaceLogSetFinishingAndFinishTimeDTO;
import com.sap.sailing.gwt.ui.shared.RaceLogSetStartTimeAndProcedureDTO;
import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO;
import com.sap.sailing.gwt.ui.shared.RaceboardDataDTO;
@@ -619,6 +620,15 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan
*/
void setStartTimeAndProcedure(RaceLogSetStartTimeAndProcedureDTO dto, AsyncCallback<Boolean> callback);
/**
* Sets the a new finishing and end time.
*
* @param dto
* {@link RaceLogSetFinishingAndFinishTimeDTO} identifying the race and the new finishing and
* end time.
*/
void setFinishingAndEndTime(RaceLogSetFinishingAndFinishTimeDTO editedObject, AsyncCallback<Pair<Boolean, Boolean>> asyncCallback);
/**
* Gets the race's current start time, current pass identifier and racing procedure. If no start time is set, the
* pass identifier will still be returned, but the start time field will be <code>null</code>.
@@ -626,6 +636,13 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan
void getStartTimeAndProcedure(String leaderboardName, String raceColumnName, String fleetName,
AsyncCallback<Util.Triple<Date, Integer, RacingProcedureType>> callback);
/**
* Gets the race's current finishing and finish times as well as the current pass identifier. If no finishing or finish time is set, the
* pass identifier will still be returned, but the finishing/finish time field will be <code>null</code>.
*/
void getFinishingAndFinishTime(String leaderboardName, String raceColumnName, String fleetName,
AsyncCallback<Util.Triple<Date, Date, Integer>> asyncCallback);
void getAllIgtimiAccountEmailAddresses(AsyncCallback<Iterable<String>> callback);
void getIgtimiAuthorizationUrl(String redirectProtocol, String redirectHostname, String redirectPort, AsyncCallback<String> callback);
@@ -1022,8 +1022,12 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
String overwriteRacingProceduresConfigurationHelpText();
String setStartTime();
String finishTimeString();
String setFinishingAndFinishTime();
String finishTimeMustBeAtOrAfterFinishingTime();
String currentPass();
String setStartTimeDescription();
String setFinishingAndFinishTimeDescription();
String setTrackingTimesDescription();
String hasAdditionalGolfDownTime();
String additionalGolfDownTimeHelpText();
@@ -1049,6 +1053,7 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
String doYouReallyWantToRemoveLeaderboard(String name);
String metaLeaderboardCannotBeChanged();
String failedToSetNewStartTime();
String failedToSetNewFinishingAndFinishTime();
String doYouReallyWantToRemoveIgtimiAccount(String accountEmail);
String igtimiWindImport();
String seeIgtimiTabForAccountSettings();
@@ -1933,6 +1938,7 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
String currentStbdRudderRakeTooltip();
String currentMastRotationInDegree();
String currentMastRotationInDegreeTooltip();
String finishingTime();
String boatNameMustNotBeEmpty();
String errorUpdatingExpeditionDeviceConfiguration(String name, String message);
String doYouReallyWantToRemoveExpeditionDeviceConfiguration(String name);
@@ -995,6 +995,7 @@ overwriteRacingProceduresConfiguration=Activate regatta configuration
overwriteRacingProceduresConfigurationHelpText=Enabling this option will provide a base regatta configuration for all options unconfigured in the regatta-specific configuration.
setStartTime=Set start time
currentPass=Current pass
setFinishingAndFinishTimeDescription=Select new finishing and finish times for the race.
setStartTimeDescription=Select a new start time for the race. If you want to set the start time to a timepoint in the past then you have to enable the checkbox to update the pass count. Please be aware of the fact that changing the pass count will have you lose all information from the previous pass (like flag events).
setTrackingTimesDescription=Set the start and end of tracking for the race.
hasAdditionalGolfDownTime=Activate additional golf down time
@@ -1023,6 +1024,7 @@ searchTag=Search tag
doYouReallyWantToRemoveLeaderboard=Do you really want to remove the leaderboard: ''{0}''?
metaLeaderboardCannotBeChanged=This is a meta leaderboard. It can''t be changed here.
failedToSetNewStartTime=Failed to set new start time. This can happen when the same start time is already present in the race log or someone has added a start time that is newer (in terms of a pass id and logical time) than the one that you just added.
failedToSetNewFinishingAndFinishTime=Failed to set new finishing and finished time.
doYouReallyWantToRemoveIgtimiAccount=Do you really want to remove Igtimi account granting access to data of user {0}?
igtimiWindImport=Import Wind from Igtimi
seeIgtimiTabForAccountSettings=See the ''Igtimi'' tab for account settings determining which data from Igtimi will be considered.
@@ -1918,6 +1920,10 @@ currentStbdRudderRake=Stbd rudder rake
currentStbdRudderRakeTooltip=The current starboard rudder rake
currentMastRotationInDegree=Mast rotation
currentMastRotationInDegreeTooltip=The current mast rotation in degrees
finishingTime=Finishing time
finishTimeString=Finish time
setFinishingAndFinishTime=Set finishing and finish time
finishTimeMustBeAtOrAfterFinishingTime=Finish time must be at or after finishing time
boatNameMustNotBeEmpty=Please provide a non-empty boat name
errorUpdatingExpeditionDeviceConfiguration=Error updating Expedition device configuration "{0}": {1}
doYouReallyWantToRemoveExpeditionDeviceConfiguration=Do you really want to remove Expedition device configuration "{0}"?
@@ -1012,6 +1012,7 @@ doYouReallyWantToRemoveTrackedRaces=Möchten Sie die getrackten Rennen wirklich
doYouReallyWantToRemoveNonVisibleTrackedRaces=Sie entfernen auch getrackte Rennen, die während des Filterns nicht angezeigt werden. Die folgenden getrackten Rennen werden entfernt. Möchten Sie fortfahren?\n\n{0}
metaLeaderboardCannotBeChanged=Dies ist eine Meta-Rangliste, das hier nicht geändert werden kann.
failedToSetNewStartTime=Neue Startzeit konnte nicht gesetzt werden.
failedToSetNewFinishingAndFinishTime=Neue Zieleinlaufzeit und Endzeit konnte nicht gesetzt werden.
doYouReallyWantToRemoveIgtimiAccount=Möchten Sie wirklich den Zugang zu den Daten des Benutzers {0} löschen?
igtimiWindImport=Wind von Igtimi importieren
seeIgtimiTabForAccountSettings=Siehe den ''Igtimi'' Reiter für die Einstellungen, von welchen Igtimi-Konten Winddaten geladen werden sollen.
@@ -1912,6 +1913,11 @@ elements={0} Elemente
chooseDifferentDimensionTitle=Andere Dimension auswählen
chooseDifferentDimensionMessage=Zum Gruppieren eine andere Dimension auswählen
pleaseSelectADimension=Bitte eine Dimension auswählen
finishingTime=Zieleinlaufzeit
finishTimeString=Endzeitpunkt
setFinishingAndFinishTime=Setzte Zieleinlaufzeit und Endzeitpunkt
finishTimeMustBeAtOrAfterFinishingTime=Der Endzeitpunkt muss nach der Zieleinlaufzeit liegen oder gleich sein
setFinishingAndFinishTimeDescription=Wähle neue Werte für Zieleinlaufzeit und Endzeitpunkt aus.
boatNameMustNotBeEmpty=Bitte einen nicht leeren Bootsnamen angeben
errorUpdatingExpeditionDeviceConfiguration=Fehler beim Speichern der Expedition Gerätekonfiguration "{0}": {1}
doYouReallyWantToRemoveExpeditionDeviceConfiguration=Möchten Sie wirklich die Expedition Gerätekonfiguration "{0}" löschen?
@@ -1957,5 +1963,5 @@ currentDistanceFoiledInMetersTooltip=Gefoilte Strecke in Metern
currentDurationFoiledTooltip=Gefoilte Zeit
totalDurationFoiledInSeconds=Gesamt gefoilte Zeit
totalDistanceFoiledInMeters=Gesamt gefoilte Strecke
totalDurationFoiledInSecondsTooltip=Insgesamt gefoilte Zeit, über die gesamte Ergebnisliste kumuliert
totalDistanceFoiledInMetersTooltip=Insgesamt gefoilte Strecke, über die gesamte Ergebnisliste kumuliert
totalDurationFoiledInSecondsTooltip=Insgesamt gefoilte Zeit, über die gesamte Ergebnisliste kumuliert
totalDistanceFoiledInMetersTooltip=Insgesamt gefoilte Strecke, über die gesamte Ergebnisliste kumuliert
@@ -354,6 +354,7 @@ import com.sap.sailing.gwt.ui.shared.RaceInfoDTO.LineStartInfoDTO;
import com.sap.sailing.gwt.ui.shared.RaceInfoDTO.RaceInfoExtensionDTO;
import com.sap.sailing.gwt.ui.shared.RaceLogDTO;
import com.sap.sailing.gwt.ui.shared.RaceLogEventDTO;
import com.sap.sailing.gwt.ui.shared.RaceLogSetFinishingAndFinishTimeDTO;
import com.sap.sailing.gwt.ui.shared.RaceLogSetStartTimeAndProcedureDTO;
import com.sap.sailing.gwt.ui.shared.RaceMapDataDTO;
import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO;
@@ -5169,6 +5170,20 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
dto.racingProcedure);
return new MillisecondsTimePoint(dto.startTime).equals(newStartTime);
}
@Override
public Pair<Boolean, Boolean> setFinishingAndEndTime(RaceLogSetFinishingAndFinishTimeDTO dto) {
TimePoint newFinsihingTime = getService().setFinishingTime(dto.leaderboardName, dto.raceColumnName,
dto.fleetName, dto.authorName, dto.authorPriority,
dto.passId, new MillisecondsTimePoint(dto.finishingTime));
TimePoint newEndTime = getService().setEndTime(dto.leaderboardName, dto.raceColumnName,
dto.fleetName, dto.authorName, dto.authorPriority,
dto.passId, new MillisecondsTimePoint(dto.finishTime));
return new Pair<Boolean, Boolean>(new MillisecondsTimePoint(dto.finishingTime).equals(newFinsihingTime),
new MillisecondsTimePoint(dto.finishTime).equals(newEndTime));
}
@Override
public void setTrackingTimes(RaceLogSetTrackingTimesDTO dto) throws NotFoundException {
@@ -5246,6 +5261,17 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
}
return new com.sap.sse.common.Util.Triple<Date, Integer, RacingProcedureType>(result.getA() == null ? null : result.getA().asDate(), result.getB(), result.getC());
}
@Override
public com.sap.sse.common.Util.Triple<Date, Date, Integer> getFinishingAndFinishTime(String leaderboardName, String raceColumnName, String fleetName) {
com.sap.sse.common.Util.Triple<TimePoint, TimePoint, Integer> result = getService().getFinishingAndFinishTime(leaderboardName, raceColumnName, fleetName);
if (result == null) {
return null;
}
return new com.sap.sse.common.Util.Triple<>(result.getA() == null ? null : result.getA().asDate(),
result.getB() == null ? null : result.getB().asDate(), result.getC());
}
@Override
public Iterable<String> getAllIgtimiAccountEmailAddresses() {
@@ -0,0 +1,26 @@
package com.sap.sailing.gwt.ui.shared;
import java.util.Date;
import com.google.gwt.user.client.rpc.IsSerializable;
/**
* DTO holding all information to set a new start time on a specific race.
*/
public class RaceLogSetFinishingAndFinishTimeDTO implements IsSerializable {
public String leaderboardName;
public String raceColumnName;
public String fleetName;
public int passId;
public String authorName;
public Integer authorPriority;
public Date finishTime;
public Date finishingTime;
@Override
public String toString() {
return "RaceLogSetEndTimeDTO [leaderboardName=" + leaderboardName + ", raceColumnName=" + raceColumnName
+ ", fleetName=" + fleetName + ", passId=" + passId + ", authorName=" + authorName + ", authorPriority="
+ authorPriority + ", finishTime=" + finishTime + ", endTime=" + finishingTime + "]";
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 160 B

@@ -91,6 +91,7 @@ import com.sap.sse.common.TypeBasedServiceFinderFactory;
import com.sap.sse.common.Util;
import com.sap.sse.common.Util.Pair;
import com.sap.sse.common.Util.Triple;
import com.sap.sse.common.impl.MillisecondsTimePoint;
import com.sap.sse.common.search.KeywordQuery;
import com.sap.sse.common.search.Result;
import com.sap.sse.common.search.Searchable;
@@ -550,12 +551,47 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch
*/
TimePoint setStartTimeAndProcedure(String leaderboardName, String raceColumnName, String fleetName, String authorName,
int authorPriority, int passId, TimePoint logicalTimePoint, TimePoint startTime, RacingProcedureType racingProcedure);
/**
* Forces a new end time identified by the passed parameters.
* @param leaderboardName name of the RaceLog's leaderboard.
* @param raceColumnName name of the RaceLog's column
* @param fleetName name of the RaceLog's fleet
* @param authorName name of the {@link AbstractLogEventAuthor} the {@link RaceLogStartTimeEvent} will be created with
* @param authorPriority priority of the author.
* @param passId Pass identifier of the new start time event.
* @param logicalTimePoint logical {@link TimePoint} of the new event.
* @return
*/
TimePoint setEndTime(String leaderboardName, String raceColumnName, String fleetName, String authorName,
int authorPriority, int passId, TimePoint logicalTimePoint);
/**
* Forces a new finishing time identified by the passed parameters.
* @param leaderboardName name of the RaceLog's leaderboard.
* @param raceColumnName name of the RaceLog's column
* @param fleetName name of the RaceLog's fleet
* @param authorName name of the {@link AbstractLogEventAuthor} the {@link RaceLogStartTimeEvent} will be created with
* @param authorPriority priority of the author.
* @param passId Pass identifier of the new start time event.
* @param logicalTimePoint logical {@link TimePoint} of the new event.
* @return
*/
TimePoint setFinishingTime(String leaderboardName, String raceColumnName, String fleetName, String authorName,
Integer authorPriority, int passId, MillisecondsTimePoint millisecondsTimePoint);
/**
* Gets the start time, pass identifier and racing procedure for the queried race. Start time might be <code>null</code>.
*/
Util.Triple<TimePoint, Integer, RacingProcedureType> getStartTimeAndProcedure(String leaderboardName, String raceColumnName, String fleetName);
/**
* Gets the finishing and finish times as well as the pass identifier for the queried race. The first TimePoint is the
* finishing time, the second on is the finish time. Finishing and/or finish times might be <code>null</code>.
*/
com.sap.sse.common.Util.Triple<TimePoint, TimePoint, Integer> getFinishingAndFinishTime(
String leaderboardName, String raceColumnName, String fleetName);
MongoObjectFactory getMongoObjectFactory();
DomainObjectFactory getDomainObjectFactory();
@@ -54,7 +54,10 @@ import com.sap.sailing.domain.abstractlog.race.RaceLog;
import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor;
import com.sap.sailing.domain.abstractlog.race.SimpleRaceLogIdentifier;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.FinishedTimeFinder;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.FinishingTimeFinder;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver;
import com.sap.sailing.domain.abstractlog.race.impl.RaceLogRaceStatusEventImpl;
import com.sap.sailing.domain.abstractlog.race.state.RaceState;
import com.sap.sailing.domain.abstractlog.race.state.ReadonlyRaceState;
import com.sap.sailing.domain.abstractlog.race.state.impl.RaceStateImpl;
@@ -116,6 +119,7 @@ import com.sap.sailing.domain.common.dto.RegattaCreationParametersDTO;
import com.sap.sailing.domain.common.dto.SeriesCreationParametersDTO;
import com.sap.sailing.domain.common.impl.DataImportProgressImpl;
import com.sap.sailing.domain.common.media.MediaTrack;
import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.domain.common.tracking.GPSFix;
import com.sap.sailing.domain.common.tracking.GPSFixMoving;
@@ -3480,6 +3484,38 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes
}
return result;
}
@Override
public TimePoint setEndTime(String leaderboardName, String raceColumnName, String fleetName,
String authorName, int authorPriority, int passId, TimePoint logicalTimePoint) {
RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName);
Leaderboard leaderboard = getLeaderboardByName(leaderboardName);
final TimePoint result;
if (leaderboard instanceof HasRegattaLike && raceLog != null) {
LogEventAuthorImpl author = new LogEventAuthorImpl(authorName, authorPriority);
raceLog.add(new RaceLogRaceStatusEventImpl(logicalTimePoint, author, raceLog.getCurrentPassId(), RaceLogRaceStatus.FINISHED));
result = new FinishedTimeFinder(raceLog).analyze();
} else {
result = null;
}
return result;
}
@Override
public TimePoint setFinishingTime(String leaderboardName, String raceColumnName, String fleetName,
String authorName, Integer authorPriority, int passId, MillisecondsTimePoint logicalTimePoint) {
RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName);
Leaderboard leaderboard = getLeaderboardByName(leaderboardName);
final TimePoint result;
if (leaderboard instanceof HasRegattaLike && raceLog != null) {
LogEventAuthorImpl author = new LogEventAuthorImpl(authorName, authorPriority);
raceLog.add(new RaceLogRaceStatusEventImpl(logicalTimePoint, author, raceLog.getCurrentPassId(), RaceLogRaceStatus.FINISHING));
result = new FinishingTimeFinder(raceLog).analyze();
} else {
result = null;
}
return result;
}
public RaceLog getRaceLog(String leaderboardName, String raceColumnName, String fleetName) {
Leaderboard leaderboard = getLeaderboardByName(leaderboardName);
@@ -3508,6 +3544,22 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes
}
return result;
}
@Override
public com.sap.sse.common.Util.Triple<TimePoint, TimePoint, Integer> getFinishingAndFinishTime(
String leaderboardName, String raceColumnName, String fleetName) {
RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName);
Leaderboard leaderboard = getLeaderboardByName(leaderboardName);
final Triple<TimePoint, TimePoint, Integer> result;
if (leaderboard instanceof HasRegattaLike && raceLog != null) {
ReadonlyRaceState state = ReadonlyRaceStateImpl.create(/* race log resolver */ this, raceLog);
result = new com.sap.sse.common.Util.Triple<>(state.getFinishingTime(), state.getFinishedTime(),
raceLog.getCurrentPassId());
} else {
result = null;
}
return result;
}
private Iterable<WindTrackerFactory> getWindTrackerFactories() {
final Set<WindTrackerFactory> result;
@@ -4092,4 +4144,5 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes
public AnniversaryRaceDeterminator getAnniversaryRaceDeterminator() {
return anniversaryRaceDeterminator;
}
}
@@ -22,6 +22,14 @@
<h2 class="releaseHeadline">Release Notes - Administration Console</h2>
<div class="innerContent">
<h2 class="articleSubheadline">November 2017</h2>
<ul class="bulletList">
<li>In addition to the "Set start time" dialog there's now a "Set finishing and end time dialog".
This dialog makes it possible to set the finishing as well as the end time in the RaceLog.
It is intended to be used in cases where a race wasn't correctly finished using the race management app.
</li>
</ul>
<h2 class="articleSubheadline">September 2017</h2>
<ul class="bulletList">
<li>Authentication for Igtimi accounts is now possible with an OAuth process.