# default racing procedure and default course designer configurable for regtattas

This commit is contained in:
Lukas Niemeier
2013-11-16 16:32:30 +01:00
parent ae6cc75b1c
commit 58efde4c15
47 changed files with 663 additions and 136 deletions
@@ -0,0 +1,26 @@
package com.sap.sailing.domain.common;
import java.util.ArrayList;
import java.util.List;
/**
* Used to decided which Course Designer to pick.
*
* When modifying these values also check res/preferences.xml of racecommittee.app!
*/
public enum CourseDesignerMode {
UNKNOWN,
BY_NAME, // O2, O3, I2,...
BY_MAP, // Map-based Course Designer
BY_MARKS; // ESS
public static CourseDesignerMode[] validValues() {
List<CourseDesignerMode> validValues = new ArrayList<CourseDesignerMode>();
for (CourseDesignerMode type : values()) {
if (type != UNKNOWN) {
validValues.add(type);
}
}
return validValues.toArray(new CourseDesignerMode[0]);
}
}
@@ -28,7 +28,7 @@ public enum RacingProcedureType {
public static RacingProcedureType[] validValues() {
List<RacingProcedureType> validValues = new ArrayList<RacingProcedureType>();
for (RacingProcedureType type : values()) {
if (type != RacingProcedureType.UNKNOWN) {
if (type != UNKNOWN) {
validValues.add(type);
}
}
@@ -55,6 +55,7 @@ import com.sap.sailing.domain.base.impl.SeriesImpl;
import com.sap.sailing.domain.base.impl.VenueImpl;
import com.sap.sailing.domain.base.impl.WaypointImpl;
import com.sap.sailing.domain.common.Color;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.MarkType;
import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.domain.common.NauticalSide;
@@ -903,7 +904,24 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
courseArea = baseDomainFactory.getExistingCourseAreaById(courseAreaUuid);
}
// Let's set these values to something other then null, this way old regattas will gain this field.
RacingProcedureType procedureType = RacingProcedureType.UNKNOWN;
CourseDesignerMode designerMode = CourseDesignerMode.UNKNOWN;
if (dbRegatta.containsField(FieldNames.REGATTA_DEFAULT_RACING_PROCEDURE.name())) {
procedureType = RacingProcedureType.valueOf(
dbRegatta.get(FieldNames.REGATTA_DEFAULT_RACING_PROCEDURE.name()).toString());
}
if (dbRegatta.containsField(FieldNames.REGATTA_DEFAULT_COURSE_DESIGNER.name())) {
designerMode = CourseDesignerMode.valueOf(
dbRegatta.get(FieldNames.REGATTA_DEFAULT_COURSE_DESIGNER.name()).toString());
}
result = new RegattaImpl(raceLogStore, baseName, boatClass, series, /* persistent */ true, loadScoringScheme(dbRegatta), id, courseArea);
result.setDefaultRacingProcedureType(procedureType);
result.setDefaultCourseDesignerMode(designerMode);
}
return result;
}
@@ -18,6 +18,8 @@ public enum FieldNames {
REGATTA_ID,
REGATTA_BASE_NAME,
REGATTA_SERIES,
REGATTA_DEFAULT_RACING_PROCEDURE,
REGATTA_DEFAULT_COURSE_DESIGNER,
SERIES_NAME,
SERIES_IS_MEDAL,
SERIES_STARTS_WITH_ZERO_SCORE,
@@ -475,6 +475,12 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
} else {
dbRegatta.put(FieldNames.COURSE_AREA_ID.name(), null);
}
if (regatta.getDefaultRacingProcedureType() != null) {
dbRegatta.put(FieldNames.REGATTA_DEFAULT_RACING_PROCEDURE.name(), regatta.getDefaultRacingProcedureType().name());
}
if (regatta.getDefaultCourseDesignerMode() != null) {
dbRegatta.put(FieldNames.REGATTA_DEFAULT_COURSE_DESIGNER.name(), regatta.getDefaultCourseDesignerMode().name());
}
regattasCollection.update(query, dbRegatta, /* upsrt */ true, /* multi */ false);
}
@@ -1,12 +0,0 @@
package com.sap.sailing.domain.base;
/**
* Used to decided which Course Designer to pick.
*
* When modifying these values also check res/preferences.xml of racecommittee.app!
*/
public enum CourseDesignerMode {
BY_NAME, // O2, O3, I2,...
BY_MAP, // Map-based Course Designer
BY_MARKS // ESS
}
@@ -2,8 +2,8 @@ package com.sap.sailing.domain.base.racegroup;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.CourseArea;
import com.sap.sailing.domain.base.CourseDesignerMode;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.Named;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
@@ -2,9 +2,9 @@ package com.sap.sailing.domain.base.racegroup.impl;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.CourseArea;
import com.sap.sailing.domain.base.CourseDesignerMode;
import com.sap.sailing.domain.base.racegroup.RaceGroup;
import com.sap.sailing.domain.base.racegroup.SeriesWithRows;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.impl.NamedImpl;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
@@ -15,16 +15,17 @@ public class RaceGroupImpl extends NamedImpl implements RaceGroup {
private final BoatClass boatClass;
private final CourseArea courseArea;
private final Iterable<SeriesWithRows> series;
private final RacingProcedureType defaultRacingProcedureType;
private final CourseDesignerMode defaultCourseDesignerMode;
public RaceGroupImpl(
String name,
BoatClass boatClass,
CourseArea courseArea,
Iterable<SeriesWithRows> series) {
public RaceGroupImpl(String name, BoatClass boatClass, CourseArea courseArea, Iterable<SeriesWithRows> series,
RacingProcedureType defaultRacingProcedureType, CourseDesignerMode defaultCourseDesignerMode) {
super(name);
this.boatClass = boatClass;
this.courseArea = courseArea;
this.series = series;
this.defaultRacingProcedureType = defaultRacingProcedureType;
this.defaultCourseDesignerMode = defaultCourseDesignerMode;
}
public CourseArea getDefaultCourseArea() {
@@ -41,14 +42,12 @@ public class RaceGroupImpl extends NamedImpl implements RaceGroup {
@Override
public RacingProcedureType getDefaultRacingProcedureType() {
// TODO Add field and store
return RacingProcedureType.GateStart;
return defaultRacingProcedureType;
}
@Override
public CourseDesignerMode getDefaultCourseDesignerMode() {
// TODO Add field and store
return CourseDesignerMode.BY_NAME;
return defaultCourseDesignerMode;
}
}
@@ -2,6 +2,7 @@ package com.sap.sailing.domain.racelog;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
public interface RaceLogStartProcedureChangedEvent extends RaceLogEvent {
RacingProcedureType getStartProcedureType();
@@ -35,6 +35,12 @@ import com.sap.sailing.domain.tracking.Wind;
public class RaceStateImpl implements RaceState, RaceLogChangedListener {
/**
* When trying to initialize a {@link RaceStateImpl} with an initial {@link RacingProcedureType}
* of {@link RacingProcedureType#UNKNOWN} the value of this field will be used instead.
*/
private final static RacingProcedureType FallbackInitialProcedureType = RacingProcedureType.RRS26;
private final RaceLog raceLog;
private final RaceLogEventAuthor author;
private final RaceLogEventFactory factory;
@@ -87,7 +93,11 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener {
this.confirmedFinishPositioningListAnalyzer = new ConfirmedFinishPositioningListFinder(raceLog);
this.courseDesignerAnalyzer = new LastPublishedCourseDesignFinder(raceLog);
this.cachedRacingProcedureType = initalRacingProcedureType;
if (initalRacingProcedureType == RacingProcedureType.UNKNOWN) {
this.cachedRacingProcedureType = FallbackInitialProcedureType;
} else {
this.cachedRacingProcedureType = initalRacingProcedureType;
}
this.cachedRaceStatus = RaceLogRaceStatus.UNKNOWN;
this.cachedPassId = raceLog.getCurrentPassId();
this.cachedIsPositionedCompetitorsConfirmed = false;
@@ -18,6 +18,7 @@ import com.sap.sailing.domain.base.RegattaListener;
import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.base.Sideline;
import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.Distance;
import com.sap.sailing.domain.common.NoWindException;
import com.sap.sailing.domain.common.Position;
@@ -29,6 +30,7 @@ import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.WindSource;
import com.sap.sailing.domain.common.WindSourceType;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.domain.leaderboard.ScoringScheme;
import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.tracking.CourseDesignChangedListener;
@@ -430,6 +432,30 @@ public class MockedTrackedRace implements DynamicTrackedRace {
// TODO Auto-generated method stub
return null;
}
@Override
public RacingProcedureType getDefaultRacingProcedureType() {
// TODO Auto-generated method stub
return null;
}
@Override
public void setDefaultRacingProcedureType(RacingProcedureType type) {
// TODO Auto-generated method stub
}
@Override
public CourseDesignerMode getDefaultCourseDesignerMode() {
// TODO Auto-generated method stub
return null;
}
@Override
public void setDefaultCourseDesignerMode(CourseDesignerMode mode) {
// TODO Auto-generated method stub
}
};
}
@@ -1,9 +1,11 @@
package com.sap.sailing.domain.base;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.Named;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.RegattaIdentifier;
import com.sap.sailing.domain.common.WithID;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.domain.leaderboard.ScoringScheme;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.domain.tracking.TrackedRegatta;
@@ -31,6 +33,28 @@ public interface Regatta extends Named, WithID {
*/
void setDefaultCourseArea(CourseArea newCourseArea);
/**
* Gets the default {@link RacingProcedureType} of this {@link Regatta}'s races.
*/
public RacingProcedureType getDefaultRacingProcedureType();
/**
* Sets the default {@link RacingProcedureType} for this {@link Regatta}'s races.
* @param mode the {@link RacingProcedureType}
*/
public void setDefaultRacingProcedureType(RacingProcedureType type);
/**
* Gets the default {@link CourseDesignerMode} of this {@link Regatta}'s races.
*/
public CourseDesignerMode getDefaultCourseDesignerMode();
/**
* Sets the default {@link CourseDesignerMode} for this {@link Regatta}'s races.
* @param mode the {@link CourseDesignerMode}
*/
public void setDefaultCourseDesignerMode(CourseDesignerMode mode);
/**
* A regatta consists of one or more series.
*
@@ -19,12 +19,14 @@ import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.RegattaListener;
import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.LeaderboardNameConstants;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.RegattaIdentifier;
import com.sap.sailing.domain.common.RegattaName;
import com.sap.sailing.domain.common.RegattaNameAndRaceName;
import com.sap.sailing.domain.common.impl.NamedImpl;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.domain.leaderboard.ResultDiscardingRule;
import com.sap.sailing.domain.leaderboard.ScoringScheme;
import com.sap.sailing.domain.racelog.RaceLogEvent;
@@ -50,8 +52,9 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene
private final Serializable id;
private transient RaceLogStore raceLogStore;
// Can be changed...
private CourseArea defaultCourseArea;
private RacingProcedureType defaultRacingProcedureType;
private CourseDesignerMode defaultCourseDesignerMode;
/**
* Regattas may be constructed as implicit default regattas in which case they won't need to be stored
@@ -108,7 +111,9 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene
}
this.persistent = persistent;
this.scoringScheme = scoringScheme;
this.defaultCourseArea = courseArea;
this.defaultCourseArea = courseArea;
this.defaultRacingProcedureType = RacingProcedureType.UNKNOWN;
this.defaultCourseDesignerMode = CourseDesignerMode.UNKNOWN;
}
private void registerRaceLogsOnRaceColumns(Series series) {
@@ -357,6 +362,26 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene
this.defaultCourseArea = newCourseArea;
}
@Override
public RacingProcedureType getDefaultRacingProcedureType() {
return defaultRacingProcedureType;
}
@Override
public void setDefaultRacingProcedureType(RacingProcedureType type) {
defaultRacingProcedureType = type;
}
@Override
public CourseDesignerMode getDefaultCourseDesignerMode() {
return defaultCourseDesignerMode;
}
@Override
public void setDefaultCourseDesignerMode(CourseDesignerMode mode) {
defaultCourseDesignerMode = mode;
}
/**
* @return whether this regatta defines its local per-series result discarding rules; if so, any leaderboard based
* on the regatta has to respect this and has to use a result discarding rule implementation that
@@ -1,24 +1,30 @@
package com.sap.sailing.domain.masterdataimport;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
public class RegattaMasterData {
private String id;
private String baseName;
private String defaultCourseAreaId;
private RacingProcedureType defaultRacingProcedureType;
private CourseDesignerMode defaultCourseDesignerMode;
private String boatClassName;
private String scoringSchemeType;
private Iterable<SeriesMasterData> series;
private boolean isPersistent;
private String regattaName;
private Iterable<String> raceIds;
public RegattaMasterData(String id, String baseName, String defaultCourseAreaId, String boatClassName,
String scoringSchemeType, Iterable<SeriesMasterData> series, boolean isPersistent, String regattaName,
Iterable<String> raceIds) {
Iterable<String> raceIds, RacingProcedureType procedureType, CourseDesignerMode designerMode) {
this.id = id;
this.baseName = baseName;
this.defaultCourseAreaId = defaultCourseAreaId;
this.defaultRacingProcedureType = procedureType;
this.defaultCourseDesignerMode = designerMode;
this.boatClassName = boatClassName;
this.scoringSchemeType = scoringSchemeType;
this.series = series;
@@ -43,6 +49,14 @@ public class RegattaMasterData {
return defaultCourseAreaId;
}
public RacingProcedureType getDefaultRacingProcedureType() {
return defaultRacingProcedureType;
}
public CourseDesignerMode getDefaultCourseDesignerMode() {
return defaultCourseDesignerMode;
}
public String getBoatClassName() {
return boatClassName;
}
@@ -17,6 +17,7 @@ import com.sap.sailing.domain.base.RegattaListener;
import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.base.Sideline;
import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.Distance;
import com.sap.sailing.domain.common.NoWindException;
import com.sap.sailing.domain.common.Position;
@@ -28,6 +29,7 @@ import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.WindSource;
import com.sap.sailing.domain.common.WindSourceType;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.domain.leaderboard.ScoringScheme;
import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.tracking.CourseDesignChangedListener;
@@ -431,6 +433,30 @@ public class MockedTrackedRace implements DynamicTrackedRace {
// TODO Auto-generated method stub
return null;
}
@Override
public RacingProcedureType getDefaultRacingProcedureType() {
// TODO Auto-generated method stub
return null;
}
@Override
public void setDefaultRacingProcedureType(RacingProcedureType type) {
// TODO Auto-generated method stub
}
@Override
public CourseDesignerMode getDefaultCourseDesignerMode() {
// TODO Auto-generated method stub
return null;
}
@Override
public void setDefaultCourseDesignerMode(CourseDesignerMode mode) {
// TODO Auto-generated method stub
}
};
}
@@ -19,12 +19,14 @@ import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionModel;
import com.google.gwt.view.client.SingleSelectionModel;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.RegattaIdentifier;
import com.sap.sailing.domain.common.RegattaName;
import com.sap.sailing.domain.common.ScoringSchemeType;
import com.sap.sailing.domain.common.dto.FleetDTO;
import com.sap.sailing.domain.common.dto.RaceColumnDTO;
import com.sap.sailing.domain.common.dto.RaceColumnInSeriesDTO;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.gwt.ui.client.DataEntryDialog.DialogCallback;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.RegattaRefresher;
@@ -49,6 +51,8 @@ public class RegattaDetailsComposite extends Composite {
private final Label boatClassName;
private final Label scoringSystem;
private final Label defaultCourseArea;
private final Label defaultRacingProcedureType;
private final Label defaultCourseDesignerMode;
private final SelectionModel<SeriesDTO> seriesSelectionModel;
private final CellTable<SeriesDTO> seriesTable;
@@ -66,7 +70,7 @@ public class RegattaDetailsComposite extends Composite {
mainPanel = new CaptionPanel(stringMessages.regatta());
VerticalPanel vPanel = new VerticalPanel();
mainPanel.add(vPanel);
Grid grid = new Grid(4, 2);
Grid grid = new Grid(6, 2);
vPanel.add(grid);
regattaName = new Label();
grid.setWidget(0 , 0, new Label(stringMessages.regattaName() + ":"));
@@ -77,9 +81,15 @@ public class RegattaDetailsComposite extends Composite {
defaultCourseArea = new Label();
grid.setWidget(2 , 0, new Label(stringMessages.courseArea() + ":"));
grid.setWidget(2 , 1, defaultCourseArea);
defaultRacingProcedureType = new Label();
grid.setWidget(3, 0, new Label("Procedure:"));
grid.setWidget(3, 1, defaultRacingProcedureType);;
defaultCourseDesignerMode = new Label();
grid.setWidget(4, 0, new Label("Course Designer:"));
grid.setWidget(4, 1, defaultCourseDesignerMode);;
scoringSystem = new Label();
grid.setWidget(3 , 0, new Label(stringMessages.scoringSystem() + ":"));
grid.setWidget(3 , 1, scoringSystem);
grid.setWidget(5 , 0, new Label(stringMessages.scoringSystem() + ":"));
grid.setWidget(5 , 1, scoringSystem);
seriesTable = createRegattaSeriesTable();
seriesSelectionModel = new SingleSelectionModel<SeriesDTO>();
seriesSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
@@ -315,6 +325,18 @@ public class RegattaDetailsComposite extends Composite {
regattaName.setText(regatta.getName());
boatClassName.setText(regatta.boatClass != null ? regatta.boatClass.getName() : "");
defaultCourseArea.setText(regatta.defaultCourseAreaIdAsString == null ? "" : regatta.defaultCourseAreaName);
RacingProcedureType procedureType = regatta.defaultRacingProcedureType;
if (procedureType == null || procedureType == RacingProcedureType.UNKNOWN) {
defaultRacingProcedureType.setText(stringMessages.none());
} else {
defaultRacingProcedureType.setText(procedureType.toString());
}
CourseDesignerMode designerMode = regatta.defaultCourseDesignerMode;
if (designerMode == null || designerMode == CourseDesignerMode.UNKNOWN) {
defaultCourseDesignerMode.setText(stringMessages.none());
} else {
defaultCourseDesignerMode.setText(designerMode.toString());
}
ScoringSchemeType scoringScheme = regatta.scoringScheme;
String scoringSystemText = scoringScheme == null ? "" : ScoringSchemeTypeFormatter.format(scoringScheme, stringMessages);
scoringSystem.setText(scoringSystemText);
@@ -262,7 +262,9 @@ public class RegattaListComposite extends Composite implements RegattaDisplayer
private void commitEditedRegatta(final RegattaDTO editedRegatta) {
final RegattaIdentifier regattaName = new RegattaName(editedRegatta.getName());
sailingService.updateRegatta(regattaName, editedRegatta.defaultCourseAreaIdAsString, new AsyncCallback<Void>() {
sailingService.updateRegatta(regattaName, editedRegatta.defaultCourseAreaIdAsString,
editedRegatta.defaultRacingProcedureType, editedRegatta.defaultCourseDesignerMode,
new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error trying to update regatta " + editedRegatta.getName() + ": " + caught.getMessage());
@@ -3,13 +3,21 @@ package com.sap.sailing.gwt.ui.adminconsole;
import java.util.Collection;
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.VerticalPanel;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.EventDTO;
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
public class RegattaWithSeriesAndFleetsEditDialog extends RegattaWithSeriesAndFleetsDialog {
protected ListBox racingProcedureListBox;
protected ListBox designerModeEntryListBox;
public RegattaWithSeriesAndFleetsEditDialog(RegattaDTO regatta, Collection<RegattaDTO> existingRegattas,
List<EventDTO> existingEvents, StringMessages stringMessages, DialogCallback<RegattaDTO> callback) {
super(regatta, existingEvents, stringMessages.editRegatta(), stringMessages.ok(), stringMessages,
@@ -19,6 +27,30 @@ public class RegattaWithSeriesAndFleetsEditDialog extends RegattaWithSeriesAndFl
scoringSchemeListBox.setEnabled(false);
sailingEventsListBox.setEnabled(true);
courseAreaListBox.setEnabled(true);
racingProcedureListBox = createListBox(false);
for (RacingProcedureType type : RacingProcedureType.values()) {
if (type == RacingProcedureType.UNKNOWN) {
racingProcedureListBox.addItem(stringMessages.none(), type.name());
} else {
racingProcedureListBox.addItem(type.name(), type.name());
}
if (type == regatta.defaultRacingProcedureType) {
racingProcedureListBox.setSelectedIndex(racingProcedureListBox.getItemCount() - 1);
}
}
designerModeEntryListBox = createListBox(false);
for (CourseDesignerMode mode : CourseDesignerMode.values()) {
if (mode == CourseDesignerMode.UNKNOWN) {
designerModeEntryListBox.addItem(stringMessages.none(), mode.name());
} else {
designerModeEntryListBox.addItem(mode.name(), mode.name());
}
if (mode == regatta.defaultCourseDesignerMode) {
designerModeEntryListBox.setSelectedIndex(designerModeEntryListBox.getItemCount() - 1);
}
}
}
@Override
@@ -29,7 +61,37 @@ public class RegattaWithSeriesAndFleetsEditDialog extends RegattaWithSeriesAndFl
@Override
protected void setupAdditionalWidgetsOnPanel(VerticalPanel panel) {
// nothing yet
Grid formGrid = new Grid(2, 2);
formGrid.setWidget(0, 0, new Label(stringMessages.racingProcedure() + ":"));
formGrid.setWidget(0, 1, racingProcedureListBox);
formGrid.setWidget(1, 0, new Label(stringMessages.courseDesignerMode() + ":"));
formGrid.setWidget(1, 1, designerModeEntryListBox);
panel.add(formGrid);
}
@Override
protected RegattaDTO getResult() {
RegattaDTO regatta = super.getResult();
regatta.defaultRacingProcedureType = getSelectedDefaultRacingProcedureType();
regatta.defaultCourseDesignerMode = getSelectedDefaultCourseDesignerModeType();
return regatta;
}
private CourseDesignerMode getSelectedDefaultCourseDesignerModeType() {
int index = designerModeEntryListBox.getSelectedIndex();
if (index >= 0) {
return CourseDesignerMode.valueOf(designerModeEntryListBox.getValue(index));
}
return null;
}
protected RacingProcedureType getSelectedDefaultRacingProcedureType() {
int index = racingProcedureListBox.getSelectedIndex();
if (index >= 0) {
return RacingProcedureType.valueOf(racingProcedureListBox.getValue(index));
}
return null;
}
}
@@ -9,6 +9,7 @@ import java.util.Set;
import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.DetailType;
import com.sap.sailing.domain.common.MasterDataImportObjectCreationCount;
import com.sap.sailing.domain.common.MaxPointsReason;
@@ -29,6 +30,7 @@ import com.sap.sailing.domain.common.dto.RaceDTO;
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.RacingProcedureType;
import com.sap.sailing.gwt.ui.shared.BulkScoreCorrectionDTO;
import com.sap.sailing.gwt.ui.shared.CompactRaceMapDataDTO;
import com.sap.sailing.gwt.ui.shared.CompetitorsRaceDataDTO;
@@ -156,7 +158,7 @@ public interface SailingService extends RemoteService {
void removeRegattas(Collection<RegattaIdentifier> regattas);
void updateRegatta(RegattaIdentifier regattaIdentifier, String defaultCourseAreaId);
void updateRegatta(RegattaIdentifier regattaIdentifier, String defaultCourseAreaId, RacingProcedureType defaultRacingProcedureType, CourseDesignerMode defaultCourseDesignerMode);
List<RaceColumnInSeriesDTO> addRaceColumnsToSeries(RegattaIdentifier regattaIdentifier, String seriesName, List<String> columnNames);
@@ -8,6 +8,7 @@ import java.util.Map;
import java.util.Set;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.DetailType;
import com.sap.sailing.domain.common.MasterDataImportObjectCreationCount;
import com.sap.sailing.domain.common.MaxPointsReason;
@@ -29,6 +30,7 @@ import com.sap.sailing.domain.common.dto.RaceDTO;
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.RacingProcedureType;
import com.sap.sailing.gwt.ui.shared.BulkScoreCorrectionDTO;
import com.sap.sailing.gwt.ui.shared.CompactRaceMapDataDTO;
import com.sap.sailing.gwt.ui.shared.CompetitorsRaceDataDTO;
@@ -427,7 +429,7 @@ public interface SailingServiceAsync {
void getEventByIdAsString(String eventIdAsString, AsyncCallback<EventDTO> asyncCallback);
void updateRegatta(RegattaIdentifier regattaIdentifier, String defaultCourseAreaId, AsyncCallback<Void> callback);
void updateRegatta(RegattaIdentifier regattaIdentifier, String defaultCourseAreaId, RacingProcedureType defaultRacingProcedureType, CourseDesignerMode defaultCourseDesignerMode, AsyncCallback<Void> callback);
void getBuildVersion(AsyncCallback<String> callback);
@@ -837,4 +837,8 @@ public interface StringMessages extends Messages {
String maximumRoundsForCourse();
String resultsMailRecipient();
String deviceConfiguration();
String none();
String courseDesignerMode();
String racingProcedure();
}
@@ -828,4 +828,7 @@ allowedCourseAreas=Allowed Course Areas
minimumRoundsForCourse=Minimum Rounds for Course
maximumRoundsForCourse=Maximum Rounds for Course
resultsMailRecipient=Results Mail Recipient
deviceConfiguration=Device Configuration
deviceConfiguration=Device Configuration
none=None
courseDesignerMode=Course Designer
racingProcedure=Racing Procedure
@@ -824,4 +824,7 @@ allowedCourseAreas=Erlaubte Rennbahnen
minimumRoundsForCourse=Minimale Rundenanzahl
maximumRoundsForCourse=Maximale Rundenanzahl
resultsMailRecipient=Empfänger der Ergebnislisten
deviceConfiguration=Device Configuration
deviceConfiguration=Device Configuration
none=Keine
courseDesignerMode=Kursdesigner
racingProcedure=Rennregeln
@@ -75,6 +75,7 @@ import com.sap.sailing.domain.base.impl.RegattaImpl;
import com.sap.sailing.domain.base.impl.SeriesImpl;
import com.sap.sailing.domain.common.Bearing;
import com.sap.sailing.domain.common.CountryCode;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.DetailType;
import com.sap.sailing.domain.common.Distance;
import com.sap.sailing.domain.common.LeaderboardNameConstants;
@@ -626,6 +627,8 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
regattaDTO.defaultCourseAreaIdAsString = regatta.getDefaultCourseArea().getId().toString();
regattaDTO.defaultCourseAreaName = regatta.getDefaultCourseArea().getName();
}
regattaDTO.defaultRacingProcedureType = regatta.getDefaultRacingProcedureType();
regattaDTO.defaultCourseDesignerMode = regatta.getDefaultCourseDesignerMode();
return regattaDTO;
}
@@ -2789,9 +2792,11 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
}
@Override
public void updateRegatta(RegattaIdentifier regattaName, String defaultCourseAreaId) {
public void updateRegatta(RegattaIdentifier regattaName, String defaultCourseAreaId,
RacingProcedureType defaultRacingProcedureType, CourseDesignerMode defaultCourseDesignerMode) {
UUID courseAreaUuid = convertIdentifierStringToUuid(defaultCourseAreaId);
getService().apply(new UpdateSpecificRegatta(regattaName, courseAreaUuid));
getService().apply(new UpdateSpecificRegatta(regattaName, courseAreaUuid,
defaultRacingProcedureType, defaultCourseDesignerMode));
}
@Override
@@ -3,12 +3,14 @@ package com.sap.sailing.gwt.ui.shared;
import java.util.Date;
import java.util.List;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.RegattaIdentifier;
import com.sap.sailing.domain.common.RegattaName;
import com.sap.sailing.domain.common.ScoringSchemeType;
import com.sap.sailing.domain.common.dto.BoatClassDTO;
import com.sap.sailing.domain.common.dto.NamedDTO;
import com.sap.sailing.domain.common.dto.RaceDTO;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
public class RegattaDTO extends NamedDTO {
private static final long serialVersionUID = -4594784946348402759L;
@@ -21,6 +23,8 @@ public class RegattaDTO extends NamedDTO {
public ScoringSchemeType scoringScheme;
public String defaultCourseAreaIdAsString;
public String defaultCourseAreaName;
public RacingProcedureType defaultRacingProcedureType;
public CourseDesignerMode defaultCourseDesignerMode;
public RegattaDTO() {}
@@ -35,6 +35,7 @@ import com.sap.sailing.domain.base.impl.RaceDefinitionImpl;
import com.sap.sailing.domain.base.impl.RegattaImpl;
import com.sap.sailing.domain.base.impl.SeriesImpl;
import com.sap.sailing.domain.base.impl.VenueImpl;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.domain.common.RaceIdentifier;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
@@ -42,6 +43,7 @@ import com.sap.sailing.domain.common.RegattaNameAndRaceName;
import com.sap.sailing.domain.common.ScoringSchemeType;
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.RegattaLeaderboard;
import com.sap.sailing.domain.leaderboard.ScoringScheme;
@@ -130,6 +132,27 @@ public class TestStoringAndLoadingEventsAndRegattas extends AbstractMongoDBTest
assertEquals(loadedRegatta.getDefaultCourseArea().getId(), courseArea.getId());
assertEquals(loadedRegatta.getDefaultCourseArea().getName(), courseArea.getName());
}
@Test
public void testLoadStoreRegattaDefaultProcedureAndCourseDesigner() {
final RacingProcedureType type = RacingProcedureType.GateStart;
final CourseDesignerMode mode = CourseDesignerMode.BY_MAP;
BoatClass boatClass = DomainFactory.INSTANCE.getOrCreateBoatClass("ESS40", false);
Regatta regatta = createRegattaAndAddRaceColumns(1, 1, "RR", boatClass, false,
DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.HIGH_POINT));
regatta.setDefaultRacingProcedureType(type);
regatta.setDefaultCourseDesignerMode(mode);
MongoObjectFactory mof = PersistenceFactory.INSTANCE.getMongoObjectFactory(getMongoService());
mof.storeRegatta(regatta);
DomainObjectFactory dof = PersistenceFactory.INSTANCE.getDomainObjectFactory(getMongoService(), DomainFactory.INSTANCE);
Regatta loadedRegatta = dof.loadRegatta(regatta.getName(), null);
assertEquals(type, loadedRegatta.getDefaultRacingProcedureType());
assertEquals(mode, loadedRegatta.getDefaultCourseDesignerMode());
}
@Test
public void testLoadStoreSimpleRegattaLeaderboard() {
@@ -9,6 +9,8 @@ import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.domain.masterdataimport.RaceColumnMasterData;
import com.sap.sailing.domain.masterdataimport.RegattaMasterData;
import com.sap.sailing.domain.masterdataimport.SeriesMasterData;
@@ -38,7 +40,19 @@ public class RegattaMasterDataJsonDeserializer implements JsonDeserializer<Regat
boolean isPersistent = (Boolean) object.get(RegattaMasterDataJsonSerializer.FIELD_IS_PERSISTENT);
Iterable<SeriesMasterData> series = deserializeSeries((JSONArray) object.get(RegattaMasterDataJsonSerializer.FIELD_SERIES));
Iterable<String> raceIds = deserializeRaceIds((JSONArray) object.get(RegattaMasterDataJsonSerializer.FIELD_REGATTA_RACE_IDS));
return new RegattaMasterData(id, baseName, defaultCourseAreaId, boatClassName, scoringSchemeType, series, isPersistent, regattaName, raceIds);
RacingProcedureType procedureType = null;
String defaultRacingProcedureTypeValue = (String) object.get(RegattaMasterDataJsonSerializer.FIELD_DEFAULT_RACING_PROCEDURE_TYPE);
if (defaultRacingProcedureTypeValue != null) {
procedureType = RacingProcedureType.valueOf(defaultRacingProcedureTypeValue);
}
CourseDesignerMode designerMode = null;
String defaultCourseDesignerModeValue = (String) object.get(RegattaMasterDataJsonSerializer.FIELD_DEFAULT_COURSE_DESIGNER_MODE);
if (defaultCourseDesignerModeValue != null) {
designerMode = CourseDesignerMode.valueOf(defaultCourseDesignerModeValue);
}
return new RegattaMasterData(id, baseName, defaultCourseAreaId, boatClassName, scoringSchemeType, series, isPersistent, regattaName, raceIds, procedureType, designerMode);
}
private Iterable<String> deserializeRaceIds(JSONArray jsonArray) {
@@ -10,6 +10,8 @@ import com.sap.sailing.domain.base.CourseArea;
import com.sap.sailing.domain.base.racegroup.RaceGroup;
import com.sap.sailing.domain.base.racegroup.SeriesWithRows;
import com.sap.sailing.domain.base.racegroup.impl.RaceGroupImpl;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.Helpers;
@@ -17,38 +19,47 @@ import com.sap.sailing.server.gateway.serialization.racegroup.impl.RaceGroupJson
import com.sap.sailing.server.gateway.serialization.racegroup.impl.SeriesWithRowsOfRaceGroupSerializer;
public class RaceGroupDeserializer implements JsonDeserializer<RaceGroup> {
private JsonDeserializer<BoatClass> boatClassDeserializer;
private JsonDeserializer<SeriesWithRows> seriesDeserializer;
public RaceGroupDeserializer(
JsonDeserializer<BoatClass> boatClassDeserializer,
JsonDeserializer<SeriesWithRows> seriesDeserializer) {
this.boatClassDeserializer = boatClassDeserializer;
this.seriesDeserializer = seriesDeserializer;
}
private JsonDeserializer<BoatClass> boatClassDeserializer;
private JsonDeserializer<SeriesWithRows> seriesDeserializer;
public RaceGroup deserialize(JSONObject object)
throws JsonDeserializationException {
String name = object.get(RaceGroupJsonSerializer.FIELD_NAME).toString();
BoatClass boatClass = null;
CourseArea courseArea = null;
if (object.containsKey(RaceGroupJsonSerializer.FIELD_COURSE_AREA)) {
// TODO: deserialize CourseArea ...
}
if (object.containsKey(RaceGroupJsonSerializer.FIELD_BOAT_CLASS)) {
boatClass = boatClassDeserializer.deserialize(
Helpers.getNestedObjectSafe(object, RaceGroupJsonSerializer.FIELD_BOAT_CLASS));
}
Collection<SeriesWithRows> series = new ArrayList<SeriesWithRows>();
for (Object seriesObject : Helpers.getNestedArraySafe(
object,
SeriesWithRowsOfRaceGroupSerializer.FIELD_SERIES)) {
JSONObject seriesJson = Helpers.toJSONObjectSafe(seriesObject);
series.add(seriesDeserializer.deserialize(seriesJson));
}
return new RaceGroupImpl(name, boatClass, courseArea, series);
}
public RaceGroupDeserializer(JsonDeserializer<BoatClass> boatClassDeserializer,
JsonDeserializer<SeriesWithRows> seriesDeserializer) {
this.boatClassDeserializer = boatClassDeserializer;
this.seriesDeserializer = seriesDeserializer;
}
public RaceGroup deserialize(JSONObject object) throws JsonDeserializationException {
String name = object.get(RaceGroupJsonSerializer.FIELD_NAME).toString();
BoatClass boatClass = null;
CourseArea courseArea = null;
RacingProcedureType procedure = RacingProcedureType.UNKNOWN;
CourseDesignerMode designer = CourseDesignerMode.UNKNOWN;
if (object.containsKey(RaceGroupJsonSerializer.FIELD_COURSE_AREA)) {
// TODO: deserialize CourseArea ...
}
if (object.containsKey(RaceGroupJsonSerializer.FIELD_BOAT_CLASS)) {
boatClass = boatClassDeserializer.deserialize(Helpers.getNestedObjectSafe(object,
RaceGroupJsonSerializer.FIELD_BOAT_CLASS));
}
if (object.containsKey(RaceGroupJsonSerializer.FIELD_DEFAULT_RACING_PROCEDURE)) {
procedure = RacingProcedureType.valueOf(
object.get(RaceGroupJsonSerializer.FIELD_DEFAULT_RACING_PROCEDURE).toString());
}
if (object.containsKey(RaceGroupJsonSerializer.FIELD_DEFAULT_COURSE_DESIGNER)) {
designer = CourseDesignerMode.valueOf(
object.get(RaceGroupJsonSerializer.FIELD_DEFAULT_COURSE_DESIGNER).toString());
}
Collection<SeriesWithRows> series = new ArrayList<SeriesWithRows>();
for (Object seriesObject : Helpers.getNestedArraySafe(object, SeriesWithRowsOfRaceGroupSerializer.FIELD_SERIES)) {
JSONObject seriesJson = Helpers.toJSONObjectSafe(seriesObject);
series.add(seriesDeserializer.deserialize(seriesJson));
}
return new RaceGroupImpl(name, boatClass, courseArea, series, procedure, designer);
}
}
@@ -12,7 +12,9 @@ import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.base.RaceColumnInSeries;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.RegattaName;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.domain.leaderboard.ResultDiscardingRule;
import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
@@ -25,6 +27,8 @@ public class RegattaMasterDataJsonSerializer implements JsonSerializer<Regatta>
public static final String FIELD_REGATTAS = "regattas";
public static final String FIELD_BOAT_CLASS_NAME = "boatClass";
public static final String FIELD_DEFAULT_COURSE_AREA_ID = "defaultCourseAreaId";
public static final String FIELD_DEFAULT_RACING_PROCEDURE_TYPE = "defaultRacingProcedureType";
public static final String FIELD_DEFAULT_COURSE_DESIGNER_MODE = "defaultCourseDesignerMode";
public static final String FIELD_SCORING_SCHEME_TYPE = "scoringSchemeType";
public static final String FIELD_SERIES = "series";
public static final String FIELD_RACE_COLUMNS = "raceColumns";
@@ -63,6 +67,18 @@ public class RegattaMasterDataJsonSerializer implements JsonSerializer<Regatta>
} else {
result.put(FIELD_DEFAULT_COURSE_AREA_ID, null);
}
RacingProcedureType procedureType = regatta.getDefaultRacingProcedureType();
if (procedureType != null) {
result.put(FIELD_DEFAULT_RACING_PROCEDURE_TYPE, procedureType.name());
} else {
result.put(FIELD_DEFAULT_RACING_PROCEDURE_TYPE, null);
}
CourseDesignerMode designerMode = regatta.getDefaultCourseDesignerMode();
if (designerMode != null) {
result.put(FIELD_DEFAULT_COURSE_DESIGNER_MODE, designerMode.name());
} else {
result.put(FIELD_DEFAULT_COURSE_DESIGNER_MODE, null);
}
result.put(FIELD_SCORING_SCHEME_TYPE, regatta.getScoringScheme().getType().toString());
result.put(FIELD_SERIES, createJsonArrayForSeries(regatta.getSeries()));
result.put(FIELD_IS_PERSISTENT, regatta.isPersistent());
@@ -13,6 +13,8 @@ public class RaceGroupJsonSerializer extends ExtendableJsonSerializer<RaceGroup>
public static final String FIELD_NAME = "name";
public static final String FIELD_COURSE_AREA = "courseArea";
public static final String FIELD_BOAT_CLASS = "boatClass";
public static final String FIELD_DEFAULT_RACING_PROCEDURE = "defaultProcedure";
public static final String FIELD_DEFAULT_COURSE_DESIGNER = "defaultCourseDesigner";
private JsonSerializer<BoatClass> boatClassSerializer;
private JsonSerializer<CourseArea> courseAreaSerializer;
@@ -39,6 +41,14 @@ public class RaceGroupJsonSerializer extends ExtendableJsonSerializer<RaceGroup>
if (object.getBoatClass() != null) {
result.put(FIELD_BOAT_CLASS, boatClassSerializer.serialize(object.getBoatClass()));
}
if (object.getDefaultRacingProcedureType() != null) {
result.put(FIELD_DEFAULT_RACING_PROCEDURE, object.getDefaultRacingProcedureType().name());
}
if (object.getDefaultCourseDesignerMode() != null) {
result.put(FIELD_DEFAULT_COURSE_DESIGNER, object.getDefaultCourseDesignerMode().name());
}
return result;
}
@@ -12,6 +12,7 @@ import com.sap.sailing.domain.base.CourseArea;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.base.RaceColumnInSeries;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.base.impl.SeriesImpl;
import com.sap.sailing.domain.base.racegroup.RaceCell;
@@ -22,7 +23,9 @@ import com.sap.sailing.domain.base.racegroup.impl.RaceCellImpl;
import com.sap.sailing.domain.base.racegroup.impl.RaceGroupImpl;
import com.sap.sailing.domain.base.racegroup.impl.RaceRowImpl;
import com.sap.sailing.domain.base.racegroup.impl.SeriesWithRowsImpl;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.LeaderboardNameConstants;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.RegattaLeaderboard;
@@ -40,15 +43,21 @@ public class RaceGroupFactory {
String name = leaderboard.getName();
CourseArea courseArea = leaderboard.getDefaultCourseArea();
BoatClass boatClass = null;
RacingProcedureType defaultProcedureType = RacingProcedureType.UNKNOWN;
CourseDesignerMode defaultCourseDesignerMode = CourseDesignerMode.UNKNOWN;
if (leaderboard instanceof RegattaLeaderboard) {
boatClass = ((RegattaLeaderboard) leaderboard).getRegatta().getBoatClass();
Regatta regatta = ((RegattaLeaderboard) leaderboard).getRegatta();
boatClass = regatta.getBoatClass();
defaultProcedureType = regatta.getDefaultRacingProcedureType();
defaultCourseDesignerMode = regatta.getDefaultCourseDesignerMode();
}
Iterable<SeriesWithRows> series = getSeries(leaderboard);
return new RaceGroupImpl(name, boatClass, courseArea, series);
return new RaceGroupImpl(name, boatClass, courseArea, series,
defaultProcedureType, defaultCourseDesignerMode);
}
public Iterable<SeriesWithRows> getSeries(Leaderboard leaderboard) {
@@ -22,9 +22,11 @@ import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.base.impl.FleetImpl;
import com.sap.sailing.domain.base.impl.SeriesImpl;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.RegattaName;
import com.sap.sailing.domain.common.ScoringSchemeType;
import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
public class RegattaReplicationTest extends AbstractServerReplicationTest {
@Test
@@ -35,17 +37,21 @@ public class RegattaReplicationTest extends AbstractServerReplicationTest {
final UUID regattaId = UUID.randomUUID();
Regatta masterRegatta = master.createRegatta(baseEventName, boatClassName, regattaId, series,
/* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null);
Thread.sleep(1000);
Regatta replicatedRegatta = replica.getRegatta(new RegattaName(masterRegatta.getName()));
assertNotNull(replicatedRegatta);
assertTrue(replicatedRegatta.isPersistent());
assertTrue(Util.isEmpty((replicatedRegatta.getSeries())));
assertNull(replicatedRegatta.getDefaultCourseArea());
assertTrue(regattaId.equals(replicatedRegatta.getId()));
assertEquals(masterRegatta.getDefaultRacingProcedureType(), replicatedRegatta.getDefaultRacingProcedureType());
assertEquals(masterRegatta.getDefaultCourseDesignerMode(), replicatedRegatta.getDefaultCourseDesignerMode());
}
@Test
public void testUpdateSpecificRegattaReplication() throws InterruptedException {
public void testUpdateSpecificRegattaReplicationForCourseArea() throws InterruptedException {
Regatta replicatedRegatta;
final UUID alphaCourseAreaId = UUID.randomUUID();
@@ -60,7 +66,7 @@ public class RegattaReplicationTest extends AbstractServerReplicationTest {
/* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), currentCourseAreaId);
// Test for 'null'
master.updateRegatta(new RegattaName(masterRegatta.getName()), currentCourseAreaId);
master.updateRegatta(new RegattaName(masterRegatta.getName()), currentCourseAreaId, null, null);
Thread.sleep(1000);
replicatedRegatta = replica.getRegatta(new RegattaName(masterRegatta.getName()));
assertNotNull(replicatedRegatta);
@@ -68,7 +74,7 @@ public class RegattaReplicationTest extends AbstractServerReplicationTest {
// Test for 'alpha'
currentCourseAreaId = alphaCourseAreaId;
master.updateRegatta(new RegattaName(masterRegatta.getName()), currentCourseAreaId);
master.updateRegatta(new RegattaName(masterRegatta.getName()), currentCourseAreaId, null, null);
Thread.sleep(1000);
replicatedRegatta = replica.getRegatta(new RegattaName(masterRegatta.getName()));
assertNotNull(replicatedRegatta);
@@ -76,7 +82,7 @@ public class RegattaReplicationTest extends AbstractServerReplicationTest {
// Test for 'tv'
currentCourseAreaId = tvCourseAreaId;
master.updateRegatta(new RegattaName(masterRegatta.getName()), currentCourseAreaId);
master.updateRegatta(new RegattaName(masterRegatta.getName()), currentCourseAreaId, null, null);
Thread.sleep(1000);
replicatedRegatta = replica.getRegatta(new RegattaName(masterRegatta.getName()));
assertNotNull(replicatedRegatta);
@@ -84,12 +90,43 @@ public class RegattaReplicationTest extends AbstractServerReplicationTest {
// Test back to 'null'
currentCourseAreaId = null;
master.updateRegatta(new RegattaName(masterRegatta.getName()), currentCourseAreaId);
master.updateRegatta(new RegattaName(masterRegatta.getName()), currentCourseAreaId, null, null);
Thread.sleep(1000);
replicatedRegatta = replica.getRegatta(new RegattaName(masterRegatta.getName()));
assertNotNull(replicatedRegatta);
assertNull(replicatedRegatta.getDefaultCourseArea());
}
@Test
public void testUpdateSpecificRegattaReplicationForProcedureAndCourseDesigner() throws InterruptedException {
Regatta replicatedRegatta;
final UUID alphaCourseAreaId = UUID.randomUUID();
Event event = master.addEvent("Event", "Venue", ".", true, UUID.randomUUID());
master.addCourseArea(event.getId(), "Alpha", alphaCourseAreaId);
UUID currentCourseAreaId = null;
Regatta masterRegatta = master.createRegatta("RR", "49er", UUID.randomUUID(), Collections.<Series>emptyList(),
true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), currentCourseAreaId);
// Test for 'null'
master.updateRegatta(new RegattaName(masterRegatta.getName()), currentCourseAreaId, null, null);
Thread.sleep(1000);
replicatedRegatta = replica.getRegatta(new RegattaName(masterRegatta.getName()));
assertNotNull(replicatedRegatta);
assertNull(replicatedRegatta.getDefaultRacingProcedureType());
assertNull(replicatedRegatta.getDefaultCourseDesignerMode());
// Test for values
master.updateRegatta(new RegattaName(masterRegatta.getName()), currentCourseAreaId,
RacingProcedureType.ESS, CourseDesignerMode.BY_MARKS);
Thread.sleep(1000);
replicatedRegatta = replica.getRegatta(new RegattaName(masterRegatta.getName()));
assertNotNull(replicatedRegatta);
assertEquals(masterRegatta.getDefaultRacingProcedureType(), replicatedRegatta.getDefaultRacingProcedureType());
assertEquals(masterRegatta.getDefaultCourseDesignerMode(), replicatedRegatta.getDefaultCourseDesignerMode());
}
@Test
public void testDefaultRegattaReplication() throws InterruptedException {
@@ -1,5 +1,7 @@
package com.sap.sailing.server.test;
import static org.junit.Assert.*;
import java.io.IOException;
import java.io.Serializable;
import java.net.MalformedURLException;
@@ -45,12 +47,14 @@ import com.sap.sailing.domain.base.impl.NationalityImpl;
import com.sap.sailing.domain.base.impl.PersonImpl;
import com.sap.sailing.domain.base.impl.SeriesImpl;
import com.sap.sailing.domain.base.impl.TeamImpl;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.MasterDataImportObjectCreationCount;
import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.common.impl.Util.Triple;
import com.sap.sailing.domain.common.media.MediaTrack;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
import com.sap.sailing.domain.leaderboard.ScoringScheme;
@@ -78,6 +82,8 @@ public class MasterDataImportTest {
private static final String TEST_GROUP_NAME = "testGroup";
private static final String TEST_EVENT_NAME = "testEvent";
private static final String TEST_REGATTA_NAME = "testRegatta";
private static final String TEST_BOAT_CLASS_NAME = "29er";
private static final String TEST_LEADERBOARD_NAME = "testRegatta (29er)";
private static final String TEST_GROUP_NAME2 = "testGroup2";
@@ -166,7 +172,7 @@ public class MasterDataImportTest {
fleets.add(new FleetImpl("testFleet2"));
series.add(new SeriesImpl("testSeries", false, fleets, emptyRaceColumnNamesList, sourceService));
UUID regattaUUID = UUID.randomUUID();
Regatta regatta = sourceService.createRegatta("testRegatta", "29er", regattaUUID, series, true, new LowPoint(),
Regatta regatta = sourceService.createRegatta(TEST_REGATTA_NAME, TEST_BOAT_CLASS_NAME, regattaUUID, series, true, new LowPoint(),
courseAreaUUID);
event.addRegatta(regatta);
for (String name : raceColumnNames) {
@@ -334,7 +340,7 @@ public class MasterDataImportTest {
fleets.add(new FleetImpl("testFleet2"));
series.add(new SeriesImpl("testSeries", false, fleets, emptyRaceColumnNamesList, sourceService));
UUID regattaUUID = UUID.randomUUID();
Regatta regatta = sourceService.createRegatta("testRegatta", "29er", regattaUUID, series, true, new LowPoint(),
Regatta regatta = sourceService.createRegatta(TEST_REGATTA_NAME, TEST_BOAT_CLASS_NAME, regattaUUID, series, true, new LowPoint(),
courseAreaUUID);
event.addRegatta(regatta);
for (String name : raceColumnNames) {
@@ -489,7 +495,7 @@ public class MasterDataImportTest {
fleets.add(new FleetImpl("testFleet2"));
series.add(new SeriesImpl("testSeries", false, fleets, emptyRaceColumnNamesList, sourceService));
UUID regattaUUID = UUID.randomUUID();
Regatta regatta = sourceService.createRegatta("testRegatta", "29er", regattaUUID, series, true, new LowPoint(),
Regatta regatta = sourceService.createRegatta(TEST_REGATTA_NAME, TEST_BOAT_CLASS_NAME, regattaUUID, series, true, new LowPoint(),
courseAreaUUID);
event.addRegatta(regatta);
for (String name : raceColumnNames) {
@@ -620,7 +626,7 @@ public class MasterDataImportTest {
fleets.add(new FleetImpl("testFleet2"));
series.add(new SeriesImpl("testSeries", false, fleets, emptyRaceColumnNamesList, sourceService));
UUID regattaUUID = UUID.randomUUID();
Regatta regatta = sourceService.createRegatta("testRegatta", "29er", regattaUUID, series, true, new LowPoint(),
Regatta regatta = sourceService.createRegatta(TEST_REGATTA_NAME, TEST_BOAT_CLASS_NAME, regattaUUID, series, true, new LowPoint(),
courseAreaUUID);
event.addRegatta(regatta);
for (String name : raceColumnNames) {
@@ -717,7 +723,7 @@ public class MasterDataImportTest {
FleetImpl testFleet1NotToOverride = new FleetImpl("testFleet1");
fleetsNotToOverride.add(testFleet1NotToOverride);
seriesNotToOverride.add(new SeriesImpl("testSeries", false, fleetsNotToOverride, emptyRaceColumnNamesList, destService));
Regatta regattaNotToOverride = destService.createRegatta("testRegatta", "29er", regattaUUID, seriesNotToOverride, true, new LowPoint(),
Regatta regattaNotToOverride = destService.createRegatta(TEST_REGATTA_NAME, TEST_BOAT_CLASS_NAME, regattaUUID, seriesNotToOverride, true, new LowPoint(),
courseAreaUUID);
event.addRegatta(regattaNotToOverride);
for (String name : raceColumnNamesNotToOverride) {
@@ -796,7 +802,7 @@ public class MasterDataImportTest {
fleets.add(new FleetImpl("testFleet2"));
series.add(new SeriesImpl("testSeries", false, fleets, emptyRaceColumnNamesList, sourceService));
UUID regattaUUID = UUID.randomUUID();
Regatta regatta = sourceService.createRegatta("testRegatta", "29er", regattaUUID, series, true, new LowPoint(),
Regatta regatta = sourceService.createRegatta(TEST_REGATTA_NAME, TEST_BOAT_CLASS_NAME, regattaUUID, series, true, new LowPoint(),
courseAreaUUID);
event.addRegatta(regatta);
for (String name : raceColumnNames) {
@@ -893,7 +899,7 @@ public class MasterDataImportTest {
FleetImpl testFleet1ToOverride = new FleetImpl("testFleet1");
fleetsToOverride.add(testFleet1ToOverride);
seriesToOverride.add(new SeriesImpl("testSeries", false, fleetsToOverride, emptyRaceColumnNamesList, destService));
Regatta regattaToOverride = destService.createRegatta("testRegatta", "29er", regattaUUID, seriesToOverride, true, new LowPoint(),
Regatta regattaToOverride = destService.createRegatta(TEST_REGATTA_NAME, TEST_BOAT_CLASS_NAME, regattaUUID, seriesToOverride, true, new LowPoint(),
courseAreaUUID);
event.addRegatta(regattaToOverride);
for (String name : raceColumnNamesToOverride) {
@@ -951,6 +957,49 @@ public class MasterDataImportTest {
}
@Test
public void testMasterDataImportForRegattaDefaultProcedureAndDesigner() throws MalformedURLException, IOException, InterruptedException {
RacingEventService sourceService = new RacingEventServiceImpl();
Regatta regatta = sourceService.createRegatta(TEST_REGATTA_NAME, TEST_BOAT_CLASS_NAME, UUID.randomUUID(),
new ArrayList<Series>(), true, new LowPoint(), null);
// Let's use the setters directly because we are not testing replication
regatta.setDefaultRacingProcedureType(RacingProcedureType.GateStart);
regatta.setDefaultCourseDesignerMode(CourseDesignerMode.BY_MARKS);
Leaderboard leaderboard = sourceService.addRegattaLeaderboard(regatta.getRegattaIdentifier(),
"testDisplayName", new int[] { 1, 2, 3, 4 });
List<String> leaderboardNames = new ArrayList<String>();
leaderboardNames.add(leaderboard.getName());
sourceService.addLeaderboardGroup(TEST_GROUP_NAME, "testGroupDesc", false, leaderboardNames, null, null);
// Serialize
TopLevelMasterDataSerializer serializer = new TopLevelMasterDataSerializer(
sourceService.getLeaderboardGroups(), sourceService.getAllEvents(), sourceService.getPersistentRegattasForRaceIDs(),
sourceService.getAllMediaTracks());
Set<String> names = new HashSet<String>();
names.add(TEST_GROUP_NAME);
JSONObject masterDataOverallObject = serializer.serialize(names);
Assert.assertNotNull(masterDataOverallObject);
// Delete all data above from the database, to allow recreating all of it on target server
deleteCreatedDataFromDatabase();
RacingEventService destService = new RacingEventServiceImplMock();
// Deserialization copied from SailingServiceImpl
DomainFactory domainFactory = DomainFactory.INSTANCE;
MasterDataImporter importer = new MasterDataImporter(domainFactory, destService);
importer.importMasterData(masterDataOverallObject.toString(), false);
Regatta importedRegatta = destService.getRegattaByName(regatta.getName());
assertNotNull(importedRegatta.getDefaultRacingProcedureType());
assertNotNull(importedRegatta.getDefaultCourseDesignerMode());
assertEquals(regatta.getDefaultRacingProcedureType(), importedRegatta.getDefaultRacingProcedureType());
assertEquals(regatta.getDefaultCourseDesignerMode(), importedRegatta.getDefaultCourseDesignerMode());
}
@Test
public void testMasterDataImportForRegattaWithoutCourseArea() throws MalformedURLException, IOException, InterruptedException {
// Setup source service
@@ -969,7 +1018,7 @@ public class MasterDataImportTest {
fleets.add(new FleetImpl("testFleet2"));
series.add(new SeriesImpl("testSeries", false, fleets, emptyRaceColumnNamesList, sourceService));
UUID regattaUUID = UUID.randomUUID();
Regatta regatta = sourceService.createRegatta("testRegatta", "29er", regattaUUID, series, true, new LowPoint(),
Regatta regatta = sourceService.createRegatta(TEST_REGATTA_NAME, TEST_BOAT_CLASS_NAME, regattaUUID, series, true, new LowPoint(),
null);
for (String name : raceColumnNames) {
series.get(0).addRaceColumn(name, sourceService);
@@ -1091,7 +1140,7 @@ public class MasterDataImportTest {
fleets.add(new FleetImpl("testFleet2"));
series.add(new SeriesImpl("testSeries", false, fleets, emptyRaceColumnNamesList, sourceService));
UUID regattaUUID = UUID.randomUUID();
Regatta regatta = sourceService.createRegatta("testRegatta", "29er", regattaUUID, series, true, new LowPoint(),
Regatta regatta = sourceService.createRegatta(TEST_REGATTA_NAME, TEST_BOAT_CLASS_NAME, regattaUUID, series, true, new LowPoint(),
courseAreaUUID);
event.addRegatta(regatta);
for (String name : raceColumnNames) {
@@ -1265,7 +1314,7 @@ public class MasterDataImportTest {
fleets.add(new FleetImpl("testFleet2"));
series.add(new SeriesImpl("testSeries", false, fleets, emptyRaceColumnNamesList, sourceService));
UUID regattaUUID = UUID.randomUUID();
Regatta regatta = sourceService.createRegatta("testRegatta", "29er", regattaUUID, series, true, new LowPoint(),
Regatta regatta = sourceService.createRegatta(TEST_REGATTA_NAME, TEST_BOAT_CLASS_NAME, regattaUUID, series, true, new LowPoint(),
courseAreaUUID);
event.addRegatta(regatta);
for (String name : raceColumnNames) {
@@ -27,6 +27,7 @@ import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.base.configuration.DeviceConfiguration;
import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier;
import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.RaceFetcher;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.RegattaFetcher;
@@ -38,6 +39,7 @@ import com.sap.sailing.domain.common.dto.RaceColumnDTO;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.common.impl.Util.Triple;
import com.sap.sailing.domain.common.media.MediaTrack;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
@@ -265,7 +267,7 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch
*/
Regatta createRegatta(String regattaBaseName, String boatClassName, Serializable id, Iterable<? extends Series> series, boolean persistent, ScoringScheme scoringScheme, Serializable defaultCourseAreaId);
Regatta updateRegatta(RegattaIdentifier regattaIdentifier, Serializable newDefaultCourseAreaId);
Regatta updateRegatta(RegattaIdentifier regattaIdentifier, Serializable newDefaultCourseAreaId, RacingProcedureType newDefaultRacingProcedureType, CourseDesignerMode newDefaultCourseDesignerMode);
/**
* Adds <code>raceDefinition</code> to the {@link Regatta} such that it will appear in {@link Regatta#getAllRaces()}
@@ -50,6 +50,7 @@ import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher;
import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMapImpl;
import com.sap.sailing.domain.base.impl.EventImpl;
import com.sap.sailing.domain.base.impl.RegattaImpl;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.LeaderboardNameConstants;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.RegattaIdentifier;
@@ -67,6 +68,7 @@ import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.common.impl.Util.Triple;
import com.sap.sailing.domain.common.media.MediaTrack;
import com.sap.sailing.domain.common.media.MediaTrack.MimeType;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard;
import com.sap.sailing.domain.leaderboard.FlexibleRaceColumn;
import com.sap.sailing.domain.leaderboard.Leaderboard;
@@ -1191,17 +1193,32 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
}
@Override
public Regatta updateRegatta(RegattaIdentifier regattaIdentifier, Serializable newDefaultCourseAreaId) {
public Regatta updateRegatta(RegattaIdentifier regattaIdentifier, Serializable newDefaultCourseAreaId,
RacingProcedureType newDefaultRacingProcedureType, CourseDesignerMode newDefaultCourseDesignerMode) {
// We're not doing any renaming of the regatta itself, therefore we don't have to sync on the maps.
Regatta regatta = getRegatta(regattaIdentifier);
synchronized (regatta) {
boolean isDirty = false;
CourseArea newCourseArea = getCourseArea(newDefaultCourseAreaId);
if (newCourseArea != regatta.getDefaultCourseArea()) {
regatta.setDefaultCourseArea(newCourseArea);
isDirty = true;
}
if (newDefaultRacingProcedureType != regatta.getDefaultRacingProcedureType()) {
regatta.setDefaultRacingProcedureType(newDefaultRacingProcedureType);
isDirty = true;
}
if (newDefaultCourseDesignerMode != regatta.getDefaultCourseDesignerMode()) {
regatta.setDefaultCourseDesignerMode(newDefaultCourseDesignerMode);
isDirty = true;
}
if (isDirty) {
mongoObjectFactory.storeRegatta(regatta);
}
replicate(new UpdateSpecificRegatta(regattaIdentifier, newDefaultCourseAreaId));
replicate(new UpdateSpecificRegatta(regattaIdentifier, newDefaultCourseAreaId,
newDefaultRacingProcedureType, newDefaultCourseDesignerMode));
}
return regatta;
}
@@ -315,6 +315,8 @@ public class ImportMasterDataOperation extends
UUID.fromString(id), series, isPersistent,
baseDomainFactory.createScoringScheme(ScoringSchemeType.valueOf(scoringSchemeType)),
courseAreaUUID).getA();
createdRegatta.setDefaultRacingProcedureType(singleRegattaData.getDefaultRacingProcedureType());
createdRegatta.setDefaultCourseDesignerMode(singleRegattaData.getDefaultCourseDesignerMode());
toState.setPersistentRegattaForRaceIDs(createdRegatta, singleRegattaData.getRaceIds(), override);
creationCount.addOneRegatta(createdRegatta.getId().toString());
}
@@ -3,7 +3,9 @@ package com.sap.sailing.server.operationaltransformation;
import java.io.Serializable;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.RegattaIdentifier;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.server.RacingEventService;
import com.sap.sailing.server.RacingEventServiceOperation;
@@ -12,15 +14,21 @@ public class UpdateSpecificRegatta extends AbstractRacingEventServiceOperation<R
private final RegattaIdentifier regattaIdentifier;
private final Serializable newDefaultCourseAreaId;
private final RacingProcedureType newDefaultRacingProcedureType;
private final CourseDesignerMode newDefaultCourseDesignerMode;
public UpdateSpecificRegatta(RegattaIdentifier regattaIdentifier, Serializable newDefaultCourseAreaId) {
public UpdateSpecificRegatta(RegattaIdentifier regattaIdentifier, Serializable newDefaultCourseAreaId,
RacingProcedureType newDefaultRacingProcedureType, CourseDesignerMode newDefaultCourseDesignerMode) {
this.regattaIdentifier = regattaIdentifier;
this.newDefaultCourseAreaId = newDefaultCourseAreaId;
this.newDefaultRacingProcedureType = newDefaultRacingProcedureType;
this.newDefaultCourseDesignerMode = newDefaultCourseDesignerMode;
}
@Override
public Regatta internalApplyTo(RacingEventService toState) throws Exception {
return toState.updateRegatta(regattaIdentifier, newDefaultCourseAreaId);
return toState.updateRegatta(regattaIdentifier, newDefaultCourseAreaId,
newDefaultRacingProcedureType, newDefaultCourseDesignerMode);
}
@Override
@@ -244,6 +244,7 @@
<string name="loading_configuration">Lade Konfiguration...</string>
<string name="loading_configuration_failed">Fehler beim Laden der Konfiguration.</string>
<string name="loading_configuration_not_found">Für dieses Gerät existiert keine Konfiguration auf dem Server.</string>
<string name="loading_configuration_succeded">Konfiguration vom Server übernommen.</string>
</resources>
@@ -276,6 +276,7 @@
<string name="loading_configuration">Loading configuration...</string>
<string name="loading_configuration_failed">There was an error loading the configuration.</string>
<string name="loading_configuration_not_found">There was no remote configuration found for this device.</string>
<string name="loading_configuration_succeded">Remote configuration applied.</string>
<string name="gate_launch_stops_after">Gate Launch stops after %dmin</string>
@@ -8,6 +8,7 @@ import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.provider.Settings.Secure;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.domain.racelog.RaceLogEventAuthor;
import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl;
@@ -50,12 +51,12 @@ public class AppPreferences {
}
public void setSendingActive(boolean activate) {
preferences.edit().putBoolean(PREFERENCE_SENDING_ACTIVE, activate).apply();
preferences.edit().putBoolean(PREFERENCE_SENDING_ACTIVE, activate).commit();
}
public void setAuthor(RaceLogEventAuthor author) {
preferences.edit().putString(PREFERENCE_AUTHOR_NAME, author.getName()).apply();
preferences.edit().putInt(PREFERENCE_AUTHOR_PRIORITY, author.getPriority()).apply();
preferences.edit().putString(PREFERENCE_AUTHOR_NAME, author.getName()).commit();
preferences.edit().putInt(PREFERENCE_AUTHOR_PRIORITY, author.getPriority()).commit();
}
public RaceLogEventAuthor getAuthor() {
@@ -74,7 +75,7 @@ public class AppPreferences {
public void setBoatClass(BoatClassType boatClass) {
String boatClassString = boatClass.name();
preferences.edit().putString(PREFERENCE_BOAT_CLASS, boatClassString).apply();
preferences.edit().putString(PREFERENCE_BOAT_CLASS, boatClassString).commit();
}
public CourseLayouts getCourseLayout() {
@@ -94,7 +95,7 @@ public class AppPreferences {
public void setCourseLayout(CourseLayouts courseLayout) {
String courseLayoutString = courseLayout.name();
preferences.edit().putString(PREFERENCE_COURSE_LAYOUT, courseLayoutString).apply();
preferences.edit().putString(PREFERENCE_COURSE_LAYOUT, courseLayoutString).commit();
}
public NumberOfRounds getNumberOfRounds() {
@@ -106,7 +107,7 @@ public class AppPreferences {
public void setNumberOfRounds(NumberOfRounds numberOfRounds) {
String numberOfRoundsString = numberOfRounds.name();
preferences.edit().putString(PREFERENCE_NUMBER_OF_ROUNDS, numberOfRoundsString).apply();
preferences.edit().putString(PREFERENCE_NUMBER_OF_ROUNDS, numberOfRoundsString).commit();
}
public double getWindBearingFromDirection() {
@@ -116,7 +117,7 @@ public class AppPreferences {
public void setWindBearingFromDirection(double enteredWindBearing) {
long windBearingAsLong = Double.doubleToLongBits(enteredWindBearing);
preferences.edit().putLong(PREFERENCE_WIND_BEARING, windBearingAsLong).apply();
preferences.edit().putLong(PREFERENCE_WIND_BEARING, windBearingAsLong).commit();
}
public double getWindSpeed() {
@@ -126,11 +127,11 @@ public class AppPreferences {
public void setWindSpeed(double enteredWindSpeed) {
long windSpeedAsLong = Double.doubleToLongBits(enteredWindSpeed);
preferences.edit().putLong(PREFERENCE_WIND_SPEED, windSpeedAsLong).apply();
preferences.edit().putLong(PREFERENCE_WIND_SPEED, windSpeedAsLong).commit();
}
public List<String> getManagedCourseAreaNames() {
String value = preferences.getString(context.getString(R.string.preference_course_areas_key), "");
String value = preferences.getString(key(R.string.preference_course_areas_key), "");
String[] managedCourseAreas = value.split(",");
for (int i = 0; i < managedCourseAreas.length; i++) {
managedCourseAreas[i] = managedCourseAreas[i].trim();
@@ -146,12 +147,12 @@ public class AppPreferences {
}
preferences
.edit()
.putString(context.getString(R.string.preference_course_areas_key),
.putString(key(R.string.preference_course_areas_key),
builder.substring(0, builder.length() - 1)).commit();
}
public String getServerBaseURL() {
String value = preferences.getString(context.getString(R.string.preference_server_url_key), "");
String value = preferences.getString(key(R.string.preference_server_url_key), "");
if (value.equals("")) {
return "http://localhost:8889";
}
@@ -159,37 +160,69 @@ public class AppPreferences {
}
public String getMailRecipient() {
return preferences.getString(context.getString(R.string.preference_mail_key), "");
return preferences.getString(key(R.string.preference_mail_key), "");
}
public void setMailRecipient(String mail) {
preferences.edit().putString(context.getString(R.string.preference_mail_key), mail).commit();
preferences.edit().putString(key(R.string.preference_mail_key), mail).commit();
}
public int getMinRounds() {
return preferences.getInt(context.getString(R.string.preference_course_designer_by_name_min_rounds_key), 0);
return preferences.getInt(key(R.string.preference_course_designer_by_name_min_rounds_key), 0);
}
public void setMinRounds(int minRounds) {
preferences.edit().putInt(context.getString(R.string.preference_course_designer_by_name_min_rounds_key), minRounds).commit();
preferences.edit().putInt(key(R.string.preference_course_designer_by_name_min_rounds_key), minRounds).commit();
}
public int getMaxRounds() {
return preferences.getInt(context.getString(R.string.preference_course_designer_by_name_max_rounds_key), 0);
return preferences.getInt(key(R.string.preference_course_designer_by_name_max_rounds_key), 0);
}
public void setMaxRounds(int maxRounds) {
preferences.edit().putInt(context.getString(R.string.preference_course_designer_by_name_max_rounds_key), maxRounds).commit();
preferences.edit().putInt(key(R.string.preference_course_designer_by_name_max_rounds_key), maxRounds).commit();
}
public boolean isDefaultRacingProcedureTypeOverridden() {
return preferences.getBoolean(key(R.string.preference_racing_procedure_is_overridden_key), false);
}
public void setDefaultRacingProcedureTypeOverridden(boolean isOverridden) {
preferences.edit().putBoolean(key(R.string.preference_racing_procedure_is_overridden_key), isOverridden).commit();
}
public RacingProcedureType getDefaultStartProcedureType() {
String defaultStartProcedureType = preferences.getString(
context.getString(R.string.preference_racing_procedure_override_key), "");
public RacingProcedureType getDefaultRacingProcedureType() {
String defaultStartProcedureType = preferences.getString(key(R.string.preference_racing_procedure_override_key), "");
return RacingProcedureType.valueOf(defaultStartProcedureType);
}
public void setDefaultRacingProcedureType(RacingProcedureType type) {
preferences.edit().putString(key(R.string.preference_racing_procedure_override_key), type.name()).commit();
}
public boolean isDefaultCourseDesignerModeOverridden() {
return preferences.getBoolean(key(R.string.preference_course_designer_is_overridden_key), false);
}
public void setDefaultCourseDesignerModeOverridden(boolean isOverridden) {
preferences.edit().putBoolean(key(R.string.preference_course_designer_is_overridden_key), isOverridden).commit();
}
public CourseDesignerMode getDefaultCourseDesignerMode() {
String mode = preferences.getString(key(R.string.preference_course_designer_override_key), "");
return CourseDesignerMode.valueOf(mode);
}
public void setDefaultCourseDesignerMode(CourseDesignerMode mode) {
preferences.edit().putString(key(R.string.preference_course_designer_override_key), mode.name()).commit();
}
public String getAndroidIdentifier() {
return Secure.getString(context.getContentResolver(), Secure.ANDROID_ID);
}
private String key(int keyId) {
return context.getString(keyId);
}
}
@@ -31,6 +31,7 @@ import com.sap.sailing.domain.base.racegroup.RaceGroup;
import com.sap.sailing.domain.base.racegroup.SeriesWithRows;
import com.sap.sailing.domain.base.racegroup.impl.RaceGroupImpl;
import com.sap.sailing.domain.base.racegroup.impl.SeriesWithRowsImpl;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
@@ -75,7 +76,7 @@ public class OfflineDataManager extends DataManager {
SeriesWithRows qualifying = new SeriesWithRowsImpl("Qualifying", false, null);
SeriesWithRows medal = new SeriesWithRowsImpl("Medal", true, null);
RaceGroup raceGroup = new RaceGroupImpl("ESS", new BoatClassImpl("X40", false), null, Arrays.asList(qualifying,
medal));
medal), RacingProcedureType.RRS26, CourseDesignerMode.BY_NAME);
List<Competitor> competitors = new ArrayList<Competitor>();
competitors.add(new CompetitorImpl(UUID.randomUUID(), "SAP Extreme Sailing Team", null, null));
@@ -99,7 +100,7 @@ public class OfflineDataManager extends DataManager {
ManagedRace q1 = new ManagedRaceImpl(
new ManagedRaceIdentifierImpl("A.B", new FleetImpl("A"), qualifying, raceGroup),
new RaceStateImpl(log, AppPreferences.on(context).getAuthor(), RaceLogEventFactory.INSTANCE, RacingProcedureType.ESS, configuration));
new RaceStateImpl(log, AppPreferences.on(context).getAuthor(), RaceLogEventFactory.INSTANCE, RacingProcedureType.RRS26, configuration));
log = new RaceLogImpl(UUID.randomUUID());
/*
@@ -109,7 +110,7 @@ public class OfflineDataManager extends DataManager {
ManagedRace q2 = new ManagedRaceImpl(
new ManagedRaceIdentifierImpl("B", new FleetImpl("A.A"), qualifying, raceGroup),
new RaceStateImpl(log, AppPreferences.on(context).getAuthor(), RaceLogEventFactory.INSTANCE, RacingProcedureType.ESS, configuration));
new RaceStateImpl(log, AppPreferences.on(context).getAuthor(), RaceLogEventFactory.INSTANCE, RacingProcedureType.RRS26, configuration));
log = new RaceLogImpl(UUID.randomUUID());
/*
@@ -118,7 +119,7 @@ public class OfflineDataManager extends DataManager {
*/
ManagedRace q3 = new ManagedRaceImpl(
new ManagedRaceIdentifierImpl("Q3", new FleetImpl("Default"), qualifying, raceGroup),
new RaceStateImpl(log, AppPreferences.on(context).getAuthor(), RaceLogEventFactory.INSTANCE, RacingProcedureType.ESS, configuration));
new RaceStateImpl(log, AppPreferences.on(context).getAuthor(), RaceLogEventFactory.INSTANCE, RacingProcedureType.RRS26, configuration));
/*
* ManagedRace m1 = new ManagedRaceImpl( new ManagedRaceIdentifierImpl( "M1", new FleetImpl("Default"), medal,
* raceGroup), null);
@@ -32,7 +32,10 @@ public class StoredDeviceConfigurationImpl extends DeviceConfigurationImpl imple
public StoredDeviceConfiguration load() {
getRacingProceduresConfiguration().load();
// TODO implement loading from AppPreferences
setAllowedCourseAreaNames(preferences.getManagedCourseAreaNames());
setMinimumRoundsForCourse(preferences.getMinRounds());
setMaximumRoundsForCourse(preferences.getMaxRounds());
setResultsMailRecipient(preferences.getMailRecipient());
return this;
}
@@ -1,5 +1,6 @@
package com.sap.sailing.racecommittee.app.ui.activities;
import java.io.FileNotFoundException;
import java.io.Serializable;
import android.app.Fragment;
@@ -126,10 +127,17 @@ public class LoginActivity extends BaseActivity implements EventSelectedListener
public void onLoadFailed(Exception reason) {
setProgressBarIndeterminateVisibility(false);
progressDialog.dismiss();
Toast.makeText(getApplicationContext(), getString(R.string.loading_configuration_failed),
Toast.LENGTH_LONG).show();
ExLog.ex(TAG, reason);
if (reason instanceof FileNotFoundException) {
Toast.makeText(getApplicationContext(), getString(R.string.loading_configuration_not_found),
Toast.LENGTH_LONG).show();
ExLog.w(TAG, String.format("There seems to be no configuration for this device: %s",
reason.toString()));
} else {
Toast.makeText(getApplicationContext(), getString(R.string.loading_configuration_failed),
Toast.LENGTH_LONG).show();
ExLog.ex(TAG, reason);
}
showCourseAreaListFragment(eventId);
}
@@ -6,6 +6,7 @@ import android.os.Bundle;
import com.sap.sailing.domain.racelog.state.RaceState;
import com.sap.sailing.racecommittee.app.AppConstants;
import com.sap.sailing.racecommittee.app.AppPreferences;
import com.sap.sailing.racecommittee.app.data.OnlineDataManager;
import com.sap.sailing.racecommittee.app.domain.ManagedRace;
import com.sap.sailing.racecommittee.app.utils.TickListener;
@@ -33,10 +34,12 @@ public abstract class RaceFragment extends LoggableFragment implements TickListe
}
private ManagedRace managedRace;
protected AppPreferences preferences;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
preferences = AppPreferences.on(getActivity());
Serializable raceId = getArguments().getSerializable(AppConstants.RACE_ID_KEY);
managedRace = OnlineDataManager.create(getActivity()).getDataStore().getRace(raceId);
@@ -15,7 +15,6 @@ import android.widget.Button;
import android.widget.TextView;
import com.sap.sailing.domain.base.CourseBase;
import com.sap.sailing.domain.base.CourseDesignerMode;
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.racelog.analyzing.impl.LastWindFixFinder;
@@ -156,8 +155,7 @@ public class RaceInfoFragment extends RaceFragment implements RaceInfoListener {
}
private void showCourseDesignDialog() {
CourseDesignerMode mode = getRace().getRaceGroup().getDefaultCourseDesignerMode();
RaceDialogFragment fragment = CourseDesignerChooser.choose(getActivity(), mode);
RaceDialogFragment fragment = CourseDesignerChooser.choose(preferences, getRace());
fragment.setArguments(getRecentArguments());
fragment.show(getFragmentManager(), "courseDesignDialogFragment");
}
@@ -8,7 +8,7 @@ import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
import com.sap.sailing.domain.base.CourseDesignerMode;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.racecommittee.app.R;
public class CourseDesignerPreferenceFragment extends BasePreferenceFragment {
@@ -30,7 +30,7 @@ public class CourseDesignerPreferenceFragment extends BasePreferenceFragment {
List<CharSequence> entries = new ArrayList<CharSequence>();
List<CharSequence> entryValues = new ArrayList<CharSequence>();
for (CourseDesignerMode type : CourseDesignerMode.values()) {
for (CourseDesignerMode type : CourseDesignerMode.validValues()) {
entries.add(type.toString());
entryValues.add(type.name());
}
@@ -1,17 +1,23 @@
package com.sap.sailing.racecommittee.app.utils;
import android.content.Context;
import com.sap.sailing.domain.base.CourseDesignerMode;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.racecommittee.app.AppPreferences;
import com.sap.sailing.racecommittee.app.domain.ManagedRace;
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.RaceDialogFragment;
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.coursedesign.ByNameCourseDesignDialog;
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.coursedesign.ByMapCourseDesignDialog;
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.coursedesign.ByNameCourseDesignDialog;
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.coursedesign.ESSCourseDesignDialog;
public class CourseDesignerChooser {
public static RaceDialogFragment choose(Context context, CourseDesignerMode mode) {
// TODO check override in user settings
public static RaceDialogFragment choose(AppPreferences preferences, ManagedRace race) {
CourseDesignerMode mode;
if (preferences.isDefaultCourseDesignerModeOverridden()) {
mode = preferences.getDefaultCourseDesignerMode();
} else {
mode = race.getRaceGroup().getDefaultCourseDesignerMode();
}
switch (mode) {
case BY_MAP:
return new ByMapCourseDesignDialog();
@@ -19,6 +25,7 @@ public class CourseDesignerChooser {
return new ESSCourseDesignDialog();
case BY_NAME:
default:
// might be UNKNOWN... let's take this one
return new ByNameCourseDesignDialog();
}
}