Merge branch 'master' into racecommittee_integrated

Conflicts:
	java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/GwtTestCaseColumnToggling.java
	java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/TestColumnSwapping.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractLeaderboardDialog.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/FlexibleLeaderboardCreateDialog.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/FlexibleLeaderboardEditDialog.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardDescriptor.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLeaderboardCreateDialog.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLeaderboardDialog.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLeaderboardEditDialog.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java
	java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndLoadingEventsAndRegattas.java
	java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/DelayedLeaderboardCorrectionsReplicationTest.java
	java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/PrematureOperationReceiptTest.java
	java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/ServerReplicationTest.java
	java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/TrackRaceReplicationTest.java
	java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/LeaderboardDiscardingRulesTest.java
	java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/OperationalTransformationTest.java
	java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java
	java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java
	java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/CreateFlexibleLeaderboard.java
	java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/CreateRegattaLeaderboard.java
This commit is contained in:
Armin Zamani committed 2013-03-03 17:40:51 +01:00
commit 79a39ef402
26 files changed
+173 -100

No files matched your search

@@ -103,7 +103,7 @@ public class GwtTestCaseColumnToggling extends GWTTestCase {
}
private void createLeaderboard(){
service.createFlexibleLeaderboard(LEADERBOARD_NAME, new int[] { 1, 2 }, ScoringSchemeType.LOW_POINT, null,
service.createFlexibleLeaderboard(LEADERBOARD_NAME, null, new int[] { 1, 2 }, ScoringSchemeType.LOW_POINT, null,
new AsyncCallback<StrippedLeaderboardDTO>() {
@Override
public void onSuccess(StrippedLeaderboardDTO result) {
@@ -40,7 +40,15 @@ public class TestColumnSwapping {
public void prepareColumnSwapping() {
service = new SailingServiceImplMock();
int[] disc = { 5, 8, 9, 0, 7, 5, 43 };
service.createFlexibleLeaderboard(LEADERBOARDNAME, disc, ScoringSchemeType.LOW_POINT, null);
service.createFlexibleLeaderboard(LEADERBOARDNAME, null, disc, ScoringSchemeType.LOW_POINT, null);
service.addColumnToLeaderboard("Race1", LEADERBOARDNAME, true);
service.addColumnToLeaderboard("Race2", LEADERBOARDNAME, true);
service.addColumnToLeaderboard("Race3", LEADERBOARDNAME, true);
leglist = new ArrayList<String>();
leglist.add("Race1");
leglist.add("Race2");
leglist.add("Race3");
leaderboardCreationDate = new Date();
try {
// get Leaderboard with name and current date
leaderboardOriginalDTO = new LeaderboardDTO(null, null, /* higherScoreIsBetter */ false);
@@ -64,7 +72,14 @@ public class TestColumnSwapping {
sailingService = new SailingServiceImplMock();
assertNotNull("Sailingservice != NULL", sailingService);
int td[] = { 5, 8 };
sailingService.createFlexibleLeaderboard(TEST_LEADERBOARD_NAME, td, ScoringSchemeType.LOW_POINT, null);
sailingService.createFlexibleLeaderboard(TEST_LEADERBOARD_NAME, null, td, ScoringSchemeType.LOW_POINT, null);
for (int i = 0; i < races.length; i++)
sailingService.addColumnToLeaderboard(races[i], TEST_LEADERBOARD_NAME, isMedalRace[i]);
sailingService.moveLeaderboardColumnDown(TEST_LEADERBOARD_NAME, races[0]);
sailingService.moveLeaderboardColumnDown(TEST_LEADERBOARD_NAME, races[0]);
sailingService.moveLeaderboardColumnUp(TEST_LEADERBOARD_NAME, races[2]);
sailingService.updateIsMedalRace(TEST_LEADERBOARD_NAME, races[0], true);
sailingService.updateIsMedalRace(TEST_LEADERBOARD_NAME, races[2], false);
try {
for (int i = 0; i < races.length; i++)
sailingService.addColumnToLeaderboard(races[i], TEST_LEADERBOARD_NAME, isMedalRace[i]);
@@ -15,26 +15,25 @@ public abstract class AbstractLeaderboardDialog extends DataEntryDialog<Leaderbo
protected final StringMessages stringMessages;
protected TextBox nameTextBox;
protected TextBox displayNameTextBox;
protected LeaderboardDescriptor leaderboard;
protected LeaderboardDescriptor leaderboardDescriptor;
protected LongBox[] discardThresholdBoxes;
protected static final int MAX_NUMBER_OF_DISCARDED_RESULTS = 4;
public AbstractLeaderboardDialog(String title, LeaderboardDescriptor leaderboardDTO, StringMessages stringConstants,
public AbstractLeaderboardDialog(String title, LeaderboardDescriptor leaderboardDescriptor, StringMessages stringConstants,
Validator<LeaderboardDescriptor> validator, DialogCallback<LeaderboardDescriptor> callback) {
super(title, null, stringConstants.ok(), stringConstants.cancel(), validator, callback);
this.stringMessages = stringConstants;
this.leaderboard = leaderboardDTO;
this.leaderboardDescriptor = leaderboardDescriptor;
}
@Override
protected LeaderboardDescriptor getResult() {
int[] discardThresholdsBoxContents = getDiscardThresholds(discardThresholdBoxes);
leaderboard.setName(nameTextBox.getValue());
leaderboard.setDisplayName(displayNameTextBox.getValue().trim().isEmpty() ? null : displayNameTextBox.getValue());
leaderboard.setDiscardThresholds(discardThresholdsBoxContents);
return leaderboard;
leaderboardDescriptor.setName(nameTextBox.getValue());
leaderboardDescriptor.setDisplayName(displayNameTextBox.getValue().trim().isEmpty() ? null : displayNameTextBox.getValue());
leaderboardDescriptor.setDiscardThresholds(discardThresholdsBoxContents);
return leaderboardDescriptor;
}
protected static int[] getDiscardThresholds(LongBox[] discardThresholdBoxes) {
@@ -14,6 +14,9 @@ public class FlexibleLeaderboardCreateDialog extends FlexibleLeaderboardDialog {
super(stringMessages.createFlexibleLeaderboard(), new LeaderboardDescriptor(), stringMessages, existingEvents, errorReporter, new FlexibleLeaderboardDialog.LeaderboardParameterValidator(stringMessages, existingLeaderboards), callback);
nameTextBox = createTextBox(null);
displayNameTextBox = createTextBox(null);
nameTextBox.setVisibleLength(50);
displayNameTextBox.setVisibleLength(50);
scoringSchemeListBox = createScoringSchemeListBox(this, stringMessages);
sailingEventsListBox = createSailingEventListBox();
discardThresholdBoxes = initEmptyDiscardThresholdBoxes(this);
@@ -22,6 +22,9 @@ public class FlexibleLeaderboardEditDialog extends FlexibleLeaderboardDialog {
nameTextBox = createTextBox(leaderboard.getName());
displayNameTextBox = createTextBox(leaderboard.getDisplayName());
scoringSchemeListBox = createListBox(false);
nameTextBox.setVisibleLength(50);
displayNameTextBox.setVisibleLength(50);
int j = 0;
for (ScoringSchemeType scoringSchemeType: ScoringSchemeType.values()) {
scoringSchemeListBox.addItem(ScoringSchemeTypeFormatter.format(scoringSchemeType, stringConstants));
@@ -940,7 +940,7 @@ public class LeaderboardConfigPanel extends FormPanel implements RegattaDisplaye
@Override
public void ok(final LeaderboardDescriptor newLeaderboard) {
sailingService.createFlexibleLeaderboard(newLeaderboard.getName(), newLeaderboard.getDiscardThresholds(),
sailingService.createFlexibleLeaderboard(newLeaderboard.getName(), newLeaderboard.getDisplayName(), newLeaderboard.getDiscardThresholds(),
newLeaderboard.getScoringScheme(), newLeaderboard.getCourseAreaIdAsString(),
new AsyncCallback<StrippedLeaderboardDTO>() {
@Override
@@ -969,7 +969,7 @@ public class LeaderboardConfigPanel extends FormPanel implements RegattaDisplaye
@Override
public void ok(final LeaderboardDescriptor newLeaderboard) {
RegattaIdentifier regattaIdentifier = new RegattaName(newLeaderboard.getRegattaName());
sailingService.createRegattaLeaderboard(regattaIdentifier, newLeaderboard.getDiscardThresholds(),
sailingService.createRegattaLeaderboard(regattaIdentifier, newLeaderboard.getDisplayName(), newLeaderboard.getDiscardThresholds(),
new AsyncCallback<StrippedLeaderboardDTO>() {
@Override
public void onFailure(Throwable t) {
@@ -10,14 +10,6 @@ import com.sap.sailing.domain.common.ScoringSchemeType;
public class LeaderboardDescriptor {
private String name;
private String displayName;
public String getDisplayName() {
return displayName;
}
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
private ScoringSchemeType scoringScheme;
private int[] discardThresholds;
private String regattaName;
@@ -74,6 +66,14 @@ public class LeaderboardDescriptor {
public void setRegattaName(String regattaName) {
this.regattaName = regattaName;
}
public String getDisplayName() {
return displayName;
}
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
public String getCourseAreaIdAsString() {
return courseAreaIdAsString;
@@ -2,6 +2,8 @@ package com.sap.sailing.gwt.ui.adminconsole;
import java.util.Collection;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
@@ -16,11 +18,21 @@ public class RegattaLeaderboardCreateDialog extends RegattaLeaderboardDialog {
nameTextBox = createTextBox(null);
displayNameTextBox = createTextBox(null);
regattaListBox = createListBox(false);
regattaListBox.addItem(stringConstants.pleaseSelectARegatta());
for (RegattaDTO regatta : existingRegattas) {
regattaListBox.addItem(regatta.name);
}
// the name of the regatta leaderboard will be derived from the selected regatta
nameTextBox.setEnabled(false);
nameTextBox.setVisibleLength(50);
displayNameTextBox.setVisibleLength(50);
regattaListBox = createSortedRegattaListBox(existingRegattas, null);
regattaListBox.addChangeHandler(new ChangeHandler() {
public void onChange(ChangeEvent event) {
int selectedIndex = regattaListBox.getSelectedIndex();
if (selectedIndex > 0) {
nameTextBox.setText(regattaListBox.getValue(selectedIndex));
}
}
});
discardThresholdBoxes = initEmptyDiscardThresholdBoxes(this);
}
@@ -1,6 +1,9 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
@@ -32,7 +35,6 @@ public abstract class RegattaLeaderboardDialog extends AbstractLeaderboardDialog
@Override
public String getErrorMessage(LeaderboardDescriptor leaderboardToValidate) {
String errorMessage;
boolean nonEmpty = leaderboardToValidate.getName() != null && leaderboardToValidate.getName().length() > 0;
boolean discardThresholdsAscending = true;
for (int i = 1; i < leaderboardToValidate.getDiscardThresholds().length; i++) {
@@ -47,16 +49,14 @@ public abstract class RegattaLeaderboardDialog extends AbstractLeaderboardDialog
boolean unique = true;
for (StrippedLeaderboardDTO dao : existingLeaderboards) {
if(dao.name.equals(leaderboardToValidate.getName())){
if(dao.name.equals(leaderboardToValidate.getRegattaName())){
unique = false;
}
}
boolean regattaSelected = leaderboardToValidate.getRegattaName() != null ? true : false;
if (!nonEmpty) {
errorMessage = stringConstants.pleaseEnterAName();
} else if(!regattaSelected){
if(!regattaSelected){
errorMessage = stringConstants.pleaseSelectARegatta();
} else if(!unique){
errorMessage = stringConstants.leaderboardWithThisNameAlreadyExists();
@@ -75,6 +75,28 @@ public abstract class RegattaLeaderboardDialog extends AbstractLeaderboardDialog
this.existingRegattas = existingRegattas;
}
protected ListBox createSortedRegattaListBox(Collection<RegattaDTO> regattas, String preSelectedRegattaName) {
ListBox result = createListBox(false);
// sort the regatta names
List<String> sortedRegattaNames = new ArrayList<String>();
for (RegattaDTO regatta : existingRegattas) {
sortedRegattaNames.add(regatta.name);
}
Collections.sort(sortedRegattaNames);
result.addItem(stringMessages.pleaseSelectARegatta());
int i=1;
for (String regattaName : sortedRegattaNames) {
result.addItem(regattaName);
if (preSelectedRegattaName != null && regattaName.equals(preSelectedRegattaName)) {
result.setSelectedIndex(i);
}
i++;
}
return result;
}
@Override
protected LeaderboardDescriptor getResult() {
LeaderboardDescriptor leaderboard = super.getResult();
@@ -88,12 +110,12 @@ public abstract class RegattaLeaderboardDialog extends AbstractLeaderboardDialog
Grid formGrid = new Grid(3,3);
formGrid.setCellSpacing(3);
formGrid.setWidget(0, 0, createLabel(stringMessages.name()));
formGrid.setWidget(0, 1, nameTextBox);
formGrid.setWidget(1, 0, createLabel(stringMessages.displayName()));
formGrid.setWidget(1, 1, displayNameTextBox);
formGrid.setWidget(2, 0, createLabel(stringMessages.regatta()));
formGrid.setWidget(2, 1, regattaListBox);
formGrid.setWidget(0, 0, createLabel(stringMessages.regatta()));
formGrid.setWidget(0, 1, regattaListBox);
formGrid.setWidget(1, 0, createLabel(stringMessages.name()));
formGrid.setWidget(1, 1, nameTextBox);
formGrid.setWidget(2, 0, createLabel(stringMessages.displayName()));
formGrid.setWidget(2, 1, displayNameTextBox);
mainPanel.add(formGrid);
@@ -10,26 +10,19 @@ import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO;
public class RegattaLeaderboardEditDialog extends RegattaLeaderboardDialog {
public RegattaLeaderboardEditDialog(Collection<StrippedLeaderboardDTO> otherExistingLeaderboards, Collection<RegattaDTO> existingRegattas,
LeaderboardDescriptor leaderboard, StringMessages stringConstants, ErrorReporter errorReporter,
LeaderboardDescriptor leaderboardDescriptor, StringMessages stringConstants, ErrorReporter errorReporter,
DialogCallback<LeaderboardDescriptor> callback) {
super(stringConstants.editRegattaLeaderboard(), leaderboard, existingRegattas, stringConstants, errorReporter, new RegattaLeaderboardDialog.LeaderboardParameterValidator(
super(stringConstants.editRegattaLeaderboard(), leaderboardDescriptor, existingRegattas, stringConstants, errorReporter, new RegattaLeaderboardDialog.LeaderboardParameterValidator(
stringConstants, otherExistingLeaderboards), callback);
nameTextBox = createTextBox(leaderboard.getName());
displayNameTextBox = createTextBox(leaderboard.getDisplayName());
nameTextBox = createTextBox(leaderboardDescriptor.getName());
displayNameTextBox = createTextBox(leaderboardDescriptor.getDisplayName());
nameTextBox.setEnabled(false);
nameTextBox.setVisibleLength(50);
displayNameTextBox.setVisibleLength(50);
regattaListBox = createListBox(false);
regattaListBox.addItem(stringConstants.pleaseSelectARegatta());
int i=1;
for (RegattaDTO regatta : existingRegattas) {
regattaListBox.addItem(regatta.name);
if (regatta.name.equals(leaderboard.getRegattaName())) {
regattaListBox.setSelectedIndex(i);
}
i++;
}
regattaListBox = createSortedRegattaListBox(existingRegattas, leaderboardDescriptor.getRegattaName());
regattaListBox.setEnabled(false);
//TODO Preselect selected event and course area
discardThresholdBoxes = initPrefilledDiscardThresholdBoxes(leaderboard.getDiscardThresholds(), this);
discardThresholdBoxes = initPrefilledDiscardThresholdBoxes(leaderboardDescriptor.getDiscardThresholds(), this);
}
}
@@ -130,9 +130,10 @@ public interface SailingService extends RemoteService {
void updateLeaderboard(String leaderboardName, String newLeaderboardName, String newLeaderboardDisplayName, int[] newDiscardingThreasholds);
StrippedLeaderboardDTO createFlexibleLeaderboard(String leaderboardName, int[] discardThresholds, ScoringSchemeType scoringSchemeType, String courseAreaId);
StrippedLeaderboardDTO createFlexibleLeaderboard(String leaderboardName, int[] discardThresholds, ScoringSchemeType scoringSchemeType);
StrippedLeaderboardDTO createFlexibleLeaderboard(String leaderboardName, String leaderboardDisplayName, int[] discardThresholds, ScoringSchemeType scoringSchemeType, String courseAreaId);
StrippedLeaderboardDTO createRegattaLeaderboard(RegattaIdentifier regattaIdentifier, int[] discardThresholds);
StrippedLeaderboardDTO createRegattaLeaderboard(RegattaIdentifier regattaIdentifier, String leaderboardDisplayName, int[] discardThresholds);
void removeLeaderboard(String leaderboardName);
@@ -213,10 +213,11 @@ public interface SailingServiceAsync {
void updateLeaderboard(String leaderboardName, String newLeaderboardName, String newLeaderboardDisplayName,
int[] newDiscardingThreasholds, AsyncCallback<Void> callback);
void createFlexibleLeaderboard(String leaderboardName, int[] discardThresholds, ScoringSchemeType scoringSchemeType, String courseAreaId,
void createFlexibleLeaderboard(String leaderboardName, int[] discardThresholds, ScoringSchemeType scoringSchemeType,
void createFlexibleLeaderboard(String leaderboardName, String leaderboardDisplayName, int[] discardThresholds, ScoringSchemeType scoringSchemeType, String courseAreaId,
AsyncCallback<StrippedLeaderboardDTO> asyncCallback);
void createRegattaLeaderboard(RegattaIdentifier regattaIdentifier, int[] discardThresholds,
void createRegattaLeaderboard(RegattaIdentifier regattaIdentifier, String leaderboardDisplayName, int[] discardThresholds,
AsyncCallback<StrippedLeaderboardDTO> asyncCallback);
void removeLeaderboard(String leaderboardName, AsyncCallback<Void> asyncCallback);
@@ -452,4 +453,3 @@ public interface SailingServiceAsync {
void getPolarSheetData(String polarSheetId, int angle, int windSpeed, AsyncCallback<PolarSheetsHistogramData> wrapperCallback);
}
@@ -1995,10 +1995,10 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
}
@Override
public StrippedLeaderboardDTO createFlexibleLeaderboard(String leaderboardName, int[] discardThresholds, ScoringSchemeType scoringSchemeType,
public StrippedLeaderboardDTO createFlexibleLeaderboard(String leaderboardName, String leaderboardDisplayName, int[] discardThresholds, ScoringSchemeType scoringSchemeType,
String courseAreaId) {
UUID courseAreaUuid = convertIdentifierStringToUuid(courseAreaId);
return createStrippedLeaderboardDTO(getService().apply(new CreateFlexibleLeaderboard(leaderboardName, discardThresholds,
return createStrippedLeaderboardDTO(getService().apply(new CreateFlexibleLeaderboard(leaderboardName, leaderboardDisplayName, discardThresholds,
baseDomainFactory.createScoringScheme(scoringSchemeType), courseAreaUuid)), false);
}
@@ -2014,8 +2014,8 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
@Override
public StrippedLeaderboardDTO createRegattaLeaderboard(RegattaIdentifier regattaIdentifier, int[] discardThresholds) {
public StrippedLeaderboardDTO createRegattaLeaderboard(RegattaIdentifier regattaIdentifier, String leaderboardDisplayName, int[] discardThresholds) {
return createStrippedLeaderboardDTO(getService().apply(new CreateRegattaLeaderboard(regattaIdentifier, leaderboardDisplayName, discardThresholds)), false);
return createStrippedLeaderboardDTO(getService().apply(new CreateRegattaLeaderboard(regattaIdentifier, discardThresholds)), false);
}
@@ -3299,5 +3299,3 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
return histogramData;
}
}
@@ -145,7 +145,7 @@ public class TestStoringAndLoadingEventsAndRegattas extends AbstractMongoDBTest
Regatta regatta = res.createRegatta(regattaProxy.getBaseName(), regattaProxy.getBoatClass().getName(),
"123", regattaProxy.getSeries(), regattaProxy.isPersistent(), DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null);
addRaceColumns(numberOfQualifyingRaces, numberOfFinalRaces, regatta);
res.addRegattaLeaderboard(regatta.getRegattaIdentifier(), new int[] { 3, 5 });
res.addRegattaLeaderboard(regatta.getRegattaIdentifier(), null, new int[] { 3, 5 });
DomainObjectFactory dof = MongoFactory.INSTANCE.getDomainObjectFactory(getMongoService());
Regatta loadedRegatta = dof.loadRegatta(regatta.getName(), /* trackedRegattaRegistry */ null);
assertNotNull(loadedRegatta);
@@ -188,7 +188,7 @@ public class TestStoringAndLoadingEventsAndRegattas extends AbstractMongoDBTest
trackedRegatta[0] = new DynamicTrackedRegattaImpl(regatta);
addRaceColumns(numberOfQualifyingRaces, numberOfFinalRaces, regatta);
logColumnsInRegatta(regatta);
RegattaLeaderboard regattaLeaderboard = res.addRegattaLeaderboard(regatta.getRegattaIdentifier(), new int[] { 3, 5 });
RegattaLeaderboard regattaLeaderboard = res.addRegattaLeaderboard(regatta.getRegattaIdentifier(), null, new int[] { 3, 5 });
assertSame(regatta, regattaLeaderboard.getRegatta());
final RaceColumnInSeries q2 = regatta.getSeriesByName("Qualifying").getRaceColumnByName("Q2");
final Fleet yellow = q2.getFleetByName("Yellow");
@@ -74,7 +74,7 @@ public class DelayedLeaderboardCorrectionsReplicationTest extends AbstractServer
master = createRacingEventServiceWithOneMockedTrackedRace(q2YellowTrackedRace);
final String leaderboardName = "My new leaderboard";
final int[] discardThresholds = new int[] { 19, 44 };
CreateFlexibleLeaderboard createTestLeaderboard = new CreateFlexibleLeaderboard(leaderboardName, discardThresholds, new LowPoint(), null);
CreateFlexibleLeaderboard createTestLeaderboard = new CreateFlexibleLeaderboard(leaderboardName, null, discardThresholds, new LowPoint(), null);
assertNull(master.getLeaderboardByName(leaderboardName));
master.apply(createTestLeaderboard);
final Leaderboard masterLeaderboard = master.getLeaderboardByName(leaderboardName);
@@ -43,7 +43,7 @@ public class PrematureOperationReceiptTest extends AbstractServerReplicationTest
public void testRaceColumnInLeaderboardReplicationAfterInitialLoad() throws InterruptedException, ClassNotFoundException, IOException {
final String leaderboardName = "My new leaderboard";
final int[] discardThresholds = new int[] { 17, 23 };
CreateFlexibleLeaderboard createTestLeaderboard = new CreateFlexibleLeaderboard(leaderboardName, discardThresholds, new LowPoint(), null);
CreateFlexibleLeaderboard createTestLeaderboard = new CreateFlexibleLeaderboard(leaderboardName, null, discardThresholds, new LowPoint(), null);
assertNull(master.getLeaderboardByName(leaderboardName));
master.apply(createTestLeaderboard);
final Leaderboard masterLeaderboard = master.getLeaderboardByName(leaderboardName);
@@ -47,7 +47,7 @@ public class ServerReplicationTest extends AbstractServerReplicationTest {
final String leaderboardName = "My new leaderboard";
assertNull(replica.getLeaderboardByName(leaderboardName));
final int[] discardThresholds = new int[] { 17, 23 };
CreateFlexibleLeaderboard createTestLeaderboard = new CreateFlexibleLeaderboard(leaderboardName, discardThresholds, new LowPoint(), null);
CreateFlexibleLeaderboard createTestLeaderboard = new CreateFlexibleLeaderboard(leaderboardName, null, discardThresholds, new LowPoint(), null);
assertNull(master.getLeaderboardByName(leaderboardName));
master.apply(createTestLeaderboard);
final Leaderboard masterLeaderboard = master.getLeaderboardByName(leaderboardName);
@@ -122,7 +122,7 @@ public class TrackRaceReplicationTest extends AbstractServerReplicationTest {
@Test
public void testReassignmentToLeaderboardReplication() throws Exception {
final String leaderboardName = "Test Leaderboard";
Leaderboard masterLeaderboard = master.apply(new CreateFlexibleLeaderboard(leaderboardName, new int[0], new LowPoint(), null));
Leaderboard masterLeaderboard = master.apply(new CreateFlexibleLeaderboard(leaderboardName, null, new int[0], new LowPoint(), null));
final String columnName = "R1";
RaceColumn masterColumn = master.apply(new AddColumnToLeaderboard(columnName, leaderboardName, /* medalRace */ false));
final Fleet defaultFleet = masterLeaderboard.getFleet(null);
@@ -42,7 +42,7 @@ public class LeaderboardDiscardingRulesTest {
@Test
public void testDiscardingRules() {
racingEventService.removeLeaderboard(LEADERBOARDNAME);
racingEventService.addFlexibleLeaderboard(LEADERBOARDNAME, new int[] { 1, 4 }, new LowPoint(), null);
racingEventService.addFlexibleLeaderboard(LEADERBOARDNAME, null, new int[] { 1, 4 }, new LowPoint(), null);
FlexibleLeaderboard leaderboard = (FlexibleLeaderboard) racingEventService.getLeaderboardByName(LEADERBOARDNAME);
assertNotNull(leaderboard);
int[] discardingRulesNew = new int[] { 1, 5 };
@@ -62,7 +62,7 @@ public class LeaderboardDiscardingRulesTest {
@Test
public void testDiscardingRulesForMultipleEquallyBadRaces() throws NoWindException {
racingEventService.removeLeaderboard(LEADERBOARDNAME);
racingEventService.addFlexibleLeaderboard(LEADERBOARDNAME, new int[] { 1, 2 }, new LowPoint(), null);
racingEventService.addFlexibleLeaderboard(LEADERBOARDNAME, null, new int[] { 1, 2 }, new LowPoint(), null);
FlexibleLeaderboard leaderboard = (FlexibleLeaderboard) racingEventService.getLeaderboardByName(LEADERBOARDNAME);
assertNotNull(leaderboard);
BoatClass boatClass = DomainFactory.INSTANCE.getOrCreateBoatClass("29erXX", /* typicallyStartsUpwind */ true);
@@ -102,7 +102,7 @@ public class LeaderboardDiscardingRulesTest {
@Test
public void testDiscardingRulesForMultipleEquallyBadRacesWithHighPointScoringScheme() throws NoWindException {
racingEventService.removeLeaderboard(LEADERBOARDNAME);
racingEventService.addFlexibleLeaderboard(LEADERBOARDNAME, new int[] { 1, 2 }, new HighPoint(), null);
racingEventService.addFlexibleLeaderboard(LEADERBOARDNAME, null, new int[] { 1, 2 }, new HighPoint(), null);
FlexibleLeaderboard leaderboard = (FlexibleLeaderboard) racingEventService.getLeaderboardByName(LEADERBOARDNAME);
assertNotNull(leaderboard);
BoatClass boatClass = DomainFactory.INSTANCE.getOrCreateBoatClass("ESS40", /* typicallyStartsUpwind */ true);
@@ -147,7 +147,7 @@ public class LeaderboardDiscardingRulesTest {
@Test
public void testDiscardingRulesForMultipleEquallyBadRacesWithNonDiscardableDisqualification() throws NoWindException {
racingEventService.removeLeaderboard(LEADERBOARDNAME);
racingEventService.addFlexibleLeaderboard(LEADERBOARDNAME, new int[] { 1, 2 }, new LowPoint(), null);
racingEventService.addFlexibleLeaderboard(LEADERBOARDNAME, null, new int[] { 1, 2 }, new LowPoint(), null);
FlexibleLeaderboard leaderboard = (FlexibleLeaderboard) racingEventService.getLeaderboardByName(LEADERBOARDNAME);
assertNotNull(leaderboard);
BoatClass boatClass = DomainFactory.INSTANCE.getOrCreateBoatClass("29erXX", /* typicallyStartsUpwind */ true);
@@ -51,7 +51,7 @@ public class OperationalTransformationTest {
@Test
public void testAddLeaderboard() {
RacingEventServiceOperation<FlexibleLeaderboard> addLeaderboardOp = new CreateFlexibleLeaderboard(LEADERBOARDNAME, new int[] { 5 },
RacingEventServiceOperation<FlexibleLeaderboard> addLeaderboardOp = new CreateFlexibleLeaderboard(LEADERBOARDNAME,null, new int[] { 5 },
new LowPoint(), null);
server.apply(addLeaderboardOp);
server.waitForNotRunning();
@@ -238,9 +238,9 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch
*
* @return the leaderboard created
*/
FlexibleLeaderboard addFlexibleLeaderboard(String name, int[] discardThresholds, ScoringScheme scoringScheme, Serializable courseAreaId);
FlexibleLeaderboard addFlexibleLeaderboard(String leaderboardName, String leaderboardDisplayName, int[] discardThresholds, ScoringScheme scoringScheme, Serializable courseAreaId);
RegattaLeaderboard addRegattaLeaderboard(RegattaIdentifier regattaIdentifier, int[] discardThresholds);
RegattaLeaderboard addRegattaLeaderboard(RegattaIdentifier regattaIdentifier, String leaderboardDisplayName, int[] discardThresholds);
void removeLeaderboard(String leaderboardName);
@@ -6,6 +6,7 @@ import com.sap.sailing.operationaltransformation.Operation;
import com.sap.sailing.operationaltransformation.Transformer;
import com.sap.sailing.server.operationaltransformation.AddColumnToLeaderboard;
import com.sap.sailing.server.operationaltransformation.CreateFlexibleLeaderboard;
import com.sap.sailing.server.operationaltransformation.CreateRegattaLeaderboard;
import com.sap.sailing.server.operationaltransformation.MoveLeaderboardColumnDown;
import com.sap.sailing.server.operationaltransformation.MoveLeaderboardColumnUp;
import com.sap.sailing.server.operationaltransformation.RemoveLeaderboard;
@@ -56,9 +57,13 @@ public interface RacingEventServiceOperation<ResultType> extends Operation<Racin
RacingEventServiceOperation<?> transformRenameLeaderboardColumnServerOp(RenameLeaderboardColumn renameLeaderboardColumnServerOp);
RacingEventServiceOperation<?> transformAddLeaderboardClientOp(CreateFlexibleLeaderboard addLeaderboard);
RacingEventServiceOperation<?> transformAddFlexibleLeaderboardClientOp(CreateFlexibleLeaderboard addLeaderboard);
RacingEventServiceOperation<?> transformAddLeaderboardServerOp(CreateFlexibleLeaderboard addLeaderboard);
RacingEventServiceOperation<?> transformAddFlexibleLeaderboardServerOp(CreateFlexibleLeaderboard addLeaderboard);
RacingEventServiceOperation<?> transformAddRegattaLeaderboardClientOp(CreateRegattaLeaderboard addLeaderboard);
RacingEventServiceOperation<?> transformAddRegattaLeaderboardServerOp(CreateRegattaLeaderboard addLeaderboard);
RacingEventServiceOperation<?> transformRemoveLeaderboardClientOp(RemoveLeaderboard removeLeaderboard);
@@ -241,7 +241,7 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
// Add one default leaderboard that aggregates all races currently tracked by this service.
// This is more for debugging purposes than for anything else.
addFlexibleLeaderboard(LeaderboardNameConstants.DEFAULT_LEADERBOARD_NAME, new int[] { 5, 8 },
addFlexibleLeaderboard(LeaderboardNameConstants.DEFAULT_LEADERBOARD_NAME, null, new int[] { 5, 8 },
tractracDomainFactory.getBaseDomainFactory().createScoringScheme(ScoringSchemeType.LOW_POINT), null);
loadStoredRegattas();
loadRaceIDToRegattaAssociations();
@@ -317,7 +317,7 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
}
@Override
public FlexibleLeaderboard addFlexibleLeaderboard(String name, int[] discardThresholds, ScoringScheme scoringScheme,
public FlexibleLeaderboard addFlexibleLeaderboard(String leaderboardName, String leaderboardDisplayName, int[] discardThresholds, ScoringScheme scoringScheme,
Serializable courseAreaId) {
logger.info("adding flexible leaderboard "+name);
@@ -326,11 +326,12 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
mongoObjectFactory,
domainObjectFactory);
CourseArea courseArea = getCourseArea(courseAreaId);
FlexibleLeaderboard result = new FlexibleLeaderboardImpl(raceLogStore, name, new ScoreCorrectionImpl(), new ResultDiscardingRuleImpl(
FlexibleLeaderboard result = new FlexibleLeaderboardImpl(raceLogStore, leaderboardName, new ScoreCorrectionImpl(), new ResultDiscardingRuleImpl(
discardThresholds), scoringScheme, courseArea);
result.setDisplayName(leaderboardDisplayName);
synchronized (leaderboardsByName) {
if (getLeaderboardByName(name) != null) {
throw new IllegalArgumentException("Leaderboard with name "+name+" already exists");
if (getLeaderboardByName(leaderboardName) != null) {
throw new IllegalArgumentException("Leaderboard with name "+leaderboardName+" already exists");
}
addLeaderboard(result);
}
@@ -351,7 +352,7 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
}
@Override
public RegattaLeaderboard addRegattaLeaderboard(RegattaIdentifier regattaIdentifier, int[] discardThresholds) {
public RegattaLeaderboard addRegattaLeaderboard(RegattaIdentifier regattaIdentifier, String leaderboardDisplayName, int[] discardThresholds) {
Regatta regatta = getRegatta(regattaIdentifier);
logger.info("adding regatta leaderboard for regatta "
+ (regatta == null ? "null" : (regatta.getName() + " (" + regatta.hashCode() + ")")) + " to " + this);
@@ -359,6 +360,7 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
if (regatta != null) {
result = new RegattaLeaderboardImpl(regatta, new ScoreCorrectionImpl(), new ResultDiscardingRuleImpl(
discardThresholds));
result.setDisplayName(leaderboardDisplayName);
synchronized (leaderboardsByName) {
if (getLeaderboardByName(result.getName()) != null) {
throw new IllegalArgumentException("Leaderboard with name " + result.getName() + " already exists in "+this);
@@ -48,12 +48,22 @@ public abstract class AbstractRacingEventServiceOperation<ResultType> implements
}
@Override
public RacingEventServiceOperation<?> transformAddLeaderboardClientOp(CreateFlexibleLeaderboard addLeaderboard) {
public RacingEventServiceOperation<?> transformAddFlexibleLeaderboardClientOp(CreateFlexibleLeaderboard addLeaderboard) {
return addLeaderboard;
}
@Override
public RacingEventServiceOperation<?> transformAddLeaderboardServerOp(CreateFlexibleLeaderboard addLeaderboard) {
public RacingEventServiceOperation<?> transformAddFlexibleLeaderboardServerOp(CreateFlexibleLeaderboard addLeaderboard) {
return addLeaderboard;
}
@Override
public RacingEventServiceOperation<?> transformAddRegattaLeaderboardClientOp(CreateRegattaLeaderboard addLeaderboard) {
return addLeaderboard;
}
@Override
public RacingEventServiceOperation<?> transformAddRegattaLeaderboardServerOp(CreateRegattaLeaderboard addLeaderboard) {
return addLeaderboard;
}
@@ -13,10 +13,12 @@ public class CreateFlexibleLeaderboard extends AbstractLeaderboardOperation<Flex
private static final long serialVersionUID = 891352705068098580L;
private final int[] discardThresholds;
private final ScoringScheme scoringScheme;
private final String leaderboardDisplayName;
private final Serializable courseAreaId;
public CreateFlexibleLeaderboard(String leaderboardName, int[] discardThresholds, ScoringScheme scoringScheme, Serializable courseAreaId) {
public CreateFlexibleLeaderboard(String leaderboardName, String leaderboardDisplayName, int[] discardThresholds, ScoringScheme scoringScheme, Serializable courseAreaId) {
super(leaderboardName);
this.leaderboardDisplayName = leaderboardDisplayName;
this.discardThresholds = discardThresholds;
this.scoringScheme = scoringScheme;
this.courseAreaId = courseAreaId;
@@ -26,7 +28,7 @@ public class CreateFlexibleLeaderboard extends AbstractLeaderboardOperation<Flex
public FlexibleLeaderboard internalApplyTo(RacingEventService toState) {
FlexibleLeaderboard result = null;
if (toState.getLeaderboardByName(getLeaderboardName()) == null) {
result = toState.addFlexibleLeaderboard(getLeaderboardName(), discardThresholds, scoringScheme, courseAreaId);
result = toState.addFlexibleLeaderboard(getLeaderboardName(), leaderboardDisplayName, discardThresholds, scoringScheme, courseAreaId);
} else {
logger.warning("Cannot replicate creation of flexible leaderboard "+getLeaderboardName()+" because it already exists in the replica");
}
@@ -35,12 +37,11 @@ public class CreateFlexibleLeaderboard extends AbstractLeaderboardOperation<Flex
@Override
public RacingEventServiceOperation<?> transformClientOp(RacingEventServiceOperation<?> serverOp) {
return serverOp.transformAddLeaderboardClientOp(this);
return serverOp.transformAddFlexibleLeaderboardClientOp(this);
}
@Override
public RacingEventServiceOperation<?> transformServerOp(RacingEventServiceOperation<?> clientOp) {
return clientOp.transformAddLeaderboardServerOp(this);
return clientOp.transformAddFlexibleLeaderboardServerOp(this);
}
}
@@ -1,36 +1,45 @@
package com.sap.sailing.server.operationaltransformation;
import java.util.logging.Logger;
import com.sap.sailing.domain.common.RegattaIdentifier;
import com.sap.sailing.domain.common.RegattaName;
import com.sap.sailing.domain.leaderboard.RegattaLeaderboard;
import com.sap.sailing.server.RacingEventService;
import com.sap.sailing.server.RacingEventServiceOperation;
public class CreateRegattaLeaderboard extends AbstractRacingEventServiceOperation<RegattaLeaderboard> {
public class CreateRegattaLeaderboard extends AbstractLeaderboardOperation<RegattaLeaderboard> {
private static final Logger logger = Logger.getLogger(CreateRegattaLeaderboard.class.getName());
private static final long serialVersionUID = 891352705068098580L;
private final int[] discardThresholds;
private final RegattaIdentifier regattaIdentifier;
private final String leaderboardDisplayName;
public CreateRegattaLeaderboard(RegattaIdentifier regattaIdentifier, int[] discardThresholds) {
public CreateRegattaLeaderboard(RegattaIdentifier regattaIdentifier, String leaderboardDisplayName, int[] discardThresholds) {
super(((RegattaName) regattaIdentifier).getRegattaName());
this.leaderboardDisplayName = leaderboardDisplayName;
this.regattaIdentifier = regattaIdentifier;
this.discardThresholds = discardThresholds;
}
@Override
public RegattaLeaderboard internalApplyTo(RacingEventService toState) {
RegattaLeaderboard result = toState.addRegattaLeaderboard(regattaIdentifier, discardThresholds);
RegattaLeaderboard result = null;
if (toState.getLeaderboardByName(getLeaderboardName()) == null) {
result = toState.addRegattaLeaderboard(regattaIdentifier, leaderboardDisplayName, discardThresholds);
} else {
logger.warning("Cannot replicate creation of flexible leaderboard "+getLeaderboardName()+" because it already exists in the replica");
}
return result;
}
@Override
public RacingEventServiceOperation<?> transformClientOp(RacingEventServiceOperation<?> serverOp) {
// TODO
return null;
return serverOp.transformAddRegattaLeaderboardClientOp(this);
}
@Override
public RacingEventServiceOperation<?> transformServerOp(RacingEventServiceOperation<?> clientOp) {
// TODO
return null;
return clientOp.transformAddRegattaLeaderboardServerOp(this);
}
}