Added check in RaceColumnsInRegattaSeriesDialog to ensure unique raceColumn names in a regatta

This commit is contained in:
fmittag
2012-10-01 18:09:25 +02:00
parent 0b711db605
commit df5b746da1
9 changed files with 152 additions and 52 deletions
@@ -3,6 +3,7 @@ package com.sap.sailing.gwt.ui.adminconsole;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
@@ -39,51 +40,67 @@ public class RaceColumnInRegattaSeriesDialog extends DataEntryDialog<Pair<Series
private static class RaceDialogValidator implements Validator<Pair<SeriesDTO, List<RaceColumnDTO>>> {
private StringMessages stringConstants;
private RegattaDTO regatta;
public RaceDialogValidator(RegattaDTO regatta, StringMessages stringConstants) {
this.stringConstants = stringConstants;
this.regatta = regatta;
}
@Override
public String getErrorMessage(Pair<SeriesDTO, List<RaceColumnDTO>> valueToValidate) {
Set<String> raceColumnNamesOfOtherSeries = new HashSet<String>();
SeriesDTO seriesToValidate = valueToValidate.getA();
List<RaceColumnDTO> raceColumnsToValidate = valueToValidate.getB();
String errorMessage = null;
if(seriesToValidate == null) {
errorMessage = stringConstants.pleaseSelectASeries();
} else {
for (SeriesDTO seriesDTO: regatta.series) {
if(!seriesDTO.name.equals(seriesToValidate.name)) {
for(RaceColumnDTO raceColumn: seriesDTO.getRaceColumns()) {
raceColumnNamesOfOtherSeries.add(raceColumn.name);
}
}
}
SeriesDTO series = valueToValidate.getA();
if(series == null) {
errorMessage = "You must select a series";
}
if(errorMessage == null) {
List<RaceColumnDTO> raceColumnsToValidate = valueToValidate.getB();
int index = 0;
boolean raceColumnNameNotEmpty = true;
RaceColumnDTO wrongRaceColumn = null;
for (RaceColumnDTO raceColumn : raceColumnsToValidate) {
raceColumnNameNotEmpty = raceColumn.name != null && raceColumn.name.length() > 0;
if (!raceColumnNameNotEmpty) {
wrongRaceColumn = raceColumn;
break;
}
index++;
}
int index2 = 0;
boolean raceColumnUnique = true;
boolean raceColumnUniqueInSeries = true;
boolean raceColumnUniqueInRegatta = true;
HashSet<String> setToFindDuplicates = new HashSet<String>();
for (RaceColumnDTO raceColumn : raceColumnsToValidate) {
if (!setToFindDuplicates.add(raceColumn.name)) {
raceColumnUnique = false;
raceColumnUniqueInSeries = false;
wrongRaceColumn = raceColumn;
break;
}
index2++;
} else if(raceColumnNamesOfOtherSeries.contains(raceColumn.name)) {
raceColumnUniqueInRegatta = false;
wrongRaceColumn = raceColumn;
break;
}
}
if (!raceColumnNameNotEmpty) {
errorMessage = stringConstants.race() + " " + (index + 1) + ": "
errorMessage = stringConstants.race() + " " + wrongRaceColumn.name + ": "
+ stringConstants.pleaseEnterAName();
} else if (!raceColumnUnique) {
errorMessage = stringConstants.race() + " " + (index2 + 1) + ": "
} else if (!raceColumnUniqueInSeries) {
errorMessage = stringConstants.race() + " " + wrongRaceColumn.name + ": "
+ stringConstants.raceWithThisNameAlreadyExists();
} else if (!raceColumnUniqueInRegatta) {
errorMessage = stringConstants.race() + " " + wrongRaceColumn.name + ": "
+ stringConstants.raceWithThisNameAlreadyExistsInRegatta();
}
}
@@ -132,6 +149,7 @@ public class RaceColumnInRegattaSeriesDialog extends DataEntryDialog<Pair<Series
raceNameEntryFields.remove(index);
raceNameDeleteButtons.remove(index);
updateRaceColumnsGrid(additionalWidgetPanel);
validate();
}
});
return raceNameDeleteBtn;
@@ -240,6 +258,7 @@ public class RaceColumnInRegattaSeriesDialog extends DataEntryDialog<Pair<Series
createRaceNameDeleteButtonWidget();
}
updateRaceColumnsGrid(additionalWidgetPanel);
validate();
} else {
Window.alert("Please select a series first.");
}
@@ -48,6 +48,7 @@ import com.sap.sailing.gwt.ui.shared.EventDTO;
import com.sap.sailing.gwt.ui.shared.FleetDTO;
import com.sap.sailing.gwt.ui.shared.NamedDTO;
import com.sap.sailing.gwt.ui.shared.RaceColumnDTO;
import com.sap.sailing.gwt.ui.shared.RaceColumnInSeriesDTO;
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
import com.sap.sailing.gwt.ui.shared.SeriesDTO;
@@ -330,7 +331,7 @@ public class RegattaStructureManagementPanel extends SimplePanel implements Rega
}
}
sailingService.addColumnsToSeries(regattaIdentifier, series.name, raceColumnsToAdd, new AsyncCallback<Void>() {
sailingService.addRaceColumnsToSeries(regattaIdentifier, series.name, raceColumnsToAdd, new AsyncCallback<List<RaceColumnInSeriesDTO>>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error trying to add race columns "
@@ -340,12 +341,12 @@ public class RegattaStructureManagementPanel extends SimplePanel implements Rega
}
@Override
public void onSuccess(Void v) {
public void onSuccess(List<RaceColumnInSeriesDTO> raceColumns) {
regattaRefresher.fillRegattas();
}
});
sailingService.removeColumnsFromSeries(regattaIdentifier, series.name, raceColumnsToRemove, new AsyncCallback<Void>() {
sailingService.removeRaceColumnsFromSeries(regattaIdentifier, series.name, raceColumnsToRemove, new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error trying to remove race columns "
@@ -31,6 +31,7 @@ import com.sap.sailing.gwt.ui.shared.ManeuverDTO;
import com.sap.sailing.gwt.ui.shared.MultiCompetitorRaceDataDTO;
import com.sap.sailing.gwt.ui.shared.QuickRankDTO;
import com.sap.sailing.gwt.ui.shared.RaceBuoysDTO;
import com.sap.sailing.gwt.ui.shared.RaceColumnInSeriesDTO;
import com.sap.sailing.gwt.ui.shared.RaceDTO;
import com.sap.sailing.gwt.ui.shared.RaceMapDataDTO;
import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO;
@@ -141,19 +142,19 @@ public interface SailingService extends RemoteService {
void removeRegatta(RegattaIdentifier regattaIdentifier);
void addColumnsToSeries(RegattaIdentifier regattaIdentifier, String seriesName, List<String> columnNames);
List<RaceColumnInSeriesDTO> addRaceColumnsToSeries(RegattaIdentifier regattaIdentifier, String seriesName, List<String> columnNames);
void addColumnToSeries(RegattaIdentifier regattaIdentifier, String seriesName, String columnName);
RaceColumnInSeriesDTO addRaceColumnToSeries(RegattaIdentifier regattaIdentifier, String seriesName, String columnName);
void removeColumnsFromSeries(RegattaIdentifier regattaIdentifier, String seriesName, List<String> columnNames);
void removeRaceColumnsFromSeries(RegattaIdentifier regattaIdentifier, String seriesName, List<String> columnNames);
void removeColumnFromSeries(RegattaIdentifier regattaIdentifier, String seriesName, String columnName);
void removeRaceColumnFromSeries(RegattaIdentifier regattaIdentifier, String seriesName, String columnName);
void renameColumnInSeries(RegattaIdentifier regattaIdentifier, String seriesName, String oldColumnName, String newColumnName);
void renameRaceColumnInSeries(RegattaIdentifier regattaIdentifier, String seriesName, String oldColumnName, String newColumnName);
void moveColumnInSeriesUp(RegattaIdentifier regattaIdentifier, String seriesName, String columnName);
void moveRaceColumnInSeriesUp(RegattaIdentifier regattaIdentifier, String seriesName, String columnName);
void moveColumnInSeriesDown(RegattaIdentifier regattaIdentifier, String seriesName, String columnName);
void moveRaceColumnInSeriesDown(RegattaIdentifier regattaIdentifier, String seriesName, String columnName);
boolean connectTrackedRaceToLeaderboardColumn(String leaderboardName, String raceColumnName,
String fleetName, RegattaAndRaceIdentifier raceIdentifier);
@@ -24,6 +24,7 @@ import com.sap.sailing.gwt.ui.shared.ControlPointDTO;
import com.sap.sailing.gwt.ui.shared.CourseDTO;
import com.sap.sailing.gwt.ui.shared.EventDTO;
import com.sap.sailing.gwt.ui.shared.RaceBuoysDTO;
import com.sap.sailing.gwt.ui.shared.RaceColumnInSeriesDTO;
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
import com.sap.sailing.gwt.ui.shared.GPSFixDTO;
import com.sap.sailing.gwt.ui.shared.LeaderboardDTO;
@@ -370,30 +371,29 @@ public interface SailingServiceAsync {
void removeRegatta(RegattaIdentifier regattaIdentifier, AsyncCallback<Void> callback);
void addColumnToSeries(RegattaIdentifier regattaIdentifier, String seriesName, String columnName, AsyncCallback<Void> callback);
void addRaceColumnToSeries(RegattaIdentifier regattaIdentifier, String seriesName, String columnName,
AsyncCallback<RaceColumnInSeriesDTO> callback);
void removeColumnFromSeries(RegattaIdentifier regattaIdentifier, String seriesName, String columnName,
void removeRaceColumnFromSeries(RegattaIdentifier regattaIdentifier, String seriesName, String columnName,
AsyncCallback<Void> callback);
void renameColumnInSeries(RegattaIdentifier regattaIdentifier, String seriesName, String oldColumnName,
void renameRaceColumnInSeries(RegattaIdentifier regattaIdentifier, String seriesName, String oldColumnName,
String newColumnName, AsyncCallback<Void> callback);
void moveColumnInSeriesUp(RegattaIdentifier regattaIdentifier, String seriesName, String columnName,
void moveRaceColumnInSeriesUp(RegattaIdentifier regattaIdentifier, String seriesName, String columnName,
AsyncCallback<Void> callback);
void moveColumnInSeriesDown(RegattaIdentifier regattaIdentifier, String seriesName, String columnName,
void moveRaceColumnInSeriesDown(RegattaIdentifier regattaIdentifier, String seriesName, String columnName,
AsyncCallback<Void> callback);
void createRegatta(
String regattaName,
String boatClassName,
void createRegatta(String regattaName, String boatClassName,
LinkedHashMap<String, Pair<List<Triple<String, Integer, Color>>, Boolean>> seriesNamesWithFleetNamesAndFleetOrderingAndMedal,
boolean persistent, ScoringSchemeType scoringSchemeType, AsyncCallback<RegattaDTO> callback);
void addColumnsToSeries(RegattaIdentifier regattaIdentifier, String seriesName, List<String> columnNames,
AsyncCallback<Void> callback);
void addRaceColumnsToSeries(RegattaIdentifier regattaIdentifier, String seriesName, List<String> columnNames,
AsyncCallback<List<RaceColumnInSeriesDTO>> callback);
void removeColumnsFromSeries(RegattaIdentifier regattaIdentifier, String seriesName, List<String> columnNames,
void removeRaceColumnsFromSeries(RegattaIdentifier regattaIdentifier, String seriesName, List<String> columnNames,
AsyncCallback<Void> callback);
void getScoreCorrectionProviderDTOs(AsyncCallback<Iterable<ScoreCorrectionProviderDTO>> callback);
@@ -173,6 +173,7 @@ public interface StringMessages extends Messages {
String delete();
String showCharts();
String raceWithThisNameAlreadyExists();
String raceWithThisNameAlreadyExistsInRegatta();
String headUp();
String bearAway();
String tack();
@@ -403,4 +404,5 @@ public interface StringMessages extends Messages {
String isPublic();
String unsuppress();
String suppressedCompetitors();
String pleaseSelectASeries();
}
@@ -168,7 +168,8 @@ no3LetterCodes=Unable to find the IOC 3-letter-codes.
add=Add
delete=Delete
showCharts=Show charts
raceWithThisNameAlreadyExists=A race with that name already exists
raceWithThisNameAlreadyExists=A race with that name already exists.
raceWithThisNameAlreadyExistsInRegatta=A race with that name already exists in this regatta.
headUp=Head up
bearAway=Bear away
tack=Tack
@@ -403,5 +404,6 @@ suppress=Suppress
isPublic=Is public
suppress=Suppress
unsuppress=Unsuppress
suppressedCompetitors=Suppressed Competitors
suppressedCompetitors=Suppressed Competitors
pleaseSelectASeries=Please select a series.
@@ -170,7 +170,8 @@ no3LetterCodes=IOC 3-Buchstaben-Codes können nicht gefunden werden.
add=Hinzufügen
delete=Löschen
showCharts=Grafische Ansicht
raceWithThisNameAlreadyExists=Ein Rennen mit diesem Namen existiert schon
raceWithThisNameAlreadyExists=Ein Rennen mit diesem Namen existiert schon.
raceWithThisNameAlreadyExistsInRegatta=Ein Rennen mit diesem Namen existiert schon in der Regatta.
headUp=anluven
bearAway=abfallen
tack=Wende
@@ -405,4 +406,4 @@ isPublic=Öffentlich zugänglich
suppress=Entfernen
unsuppress=Wieder hinzufügen
suppressedCompetitors=Unterdrückte Wettkampfteilnehmer
pleaseSelectASeries=Bitte wählen Sie eine Serie aus.
@@ -152,6 +152,7 @@ import com.sap.sailing.gwt.ui.shared.PositionDTO;
import com.sap.sailing.gwt.ui.shared.QuickRankDTO;
import com.sap.sailing.gwt.ui.shared.RaceBuoysDTO;
import com.sap.sailing.gwt.ui.shared.RaceColumnDTO;
import com.sap.sailing.gwt.ui.shared.RaceColumnInSeriesDTO;
import com.sap.sailing.gwt.ui.shared.RaceDTO;
import com.sap.sailing.gwt.ui.shared.RaceMapDataDTO;
import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO;
@@ -2623,43 +2624,61 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
getService().apply(new RemoveRegatta(regattaIdentifier));
}
private RaceColumnInSeriesDTO convertToRaceColumnInSeriesDTO(RaceColumnInSeries raceColumnInSeries) {
RaceColumnInSeriesDTO raceColumnInSeriesDTO = new RaceColumnInSeriesDTO(raceColumnInSeries.getSeries().getName(),
raceColumnInSeries.getRegatta().getName());
raceColumnInSeriesDTO.name = raceColumnInSeries.getName();
raceColumnInSeriesDTO.setMedalRace(raceColumnInSeries.isMedalRace());
return raceColumnInSeriesDTO;
}
@Override
public void addColumnsToSeries(RegattaIdentifier regattaIdentifier, String seriesName, List<String> columnNames) {
public List<RaceColumnInSeriesDTO> addRaceColumnsToSeries(RegattaIdentifier regattaIdentifier, String seriesName, List<String> columnNames) {
List<RaceColumnInSeriesDTO> result = new ArrayList<RaceColumnInSeriesDTO>();
for(String columnName: columnNames) {
getService().apply(new AddColumnToSeries(regattaIdentifier, seriesName, columnName));
RaceColumnInSeries raceColumnInSeries = getService().apply(new AddColumnToSeries(regattaIdentifier, seriesName, columnName));
if(raceColumnInSeries != null) {
result.add(convertToRaceColumnInSeriesDTO(raceColumnInSeries));
}
}
return result;
}
@Override
public void addColumnToSeries(RegattaIdentifier regattaIdentifier, String seriesName, String columnName) {
getService().apply(new AddColumnToSeries(regattaIdentifier, seriesName, columnName));
public RaceColumnInSeriesDTO addRaceColumnToSeries(RegattaIdentifier regattaIdentifier, String seriesName, String columnName) {
RaceColumnInSeriesDTO result = null;
RaceColumnInSeries raceColumnInSeries = getService().apply(new AddColumnToSeries(regattaIdentifier, seriesName, columnName));
if(raceColumnInSeries != null) {
result = convertToRaceColumnInSeriesDTO(raceColumnInSeries);
}
return result;
}
@Override
public void removeColumnsFromSeries(RegattaIdentifier regattaIdentifier, String seriesName, List<String> columnNames) {
public void removeRaceColumnsFromSeries(RegattaIdentifier regattaIdentifier, String seriesName, List<String> columnNames) {
for(String columnName: columnNames) {
getService().apply(new RemoveColumnFromSeries(regattaIdentifier, seriesName, columnName));
}
}
@Override
public void removeColumnFromSeries(RegattaIdentifier regattaIdentifier, String seriesName, String columnName) {
public void removeRaceColumnFromSeries(RegattaIdentifier regattaIdentifier, String seriesName, String columnName) {
getService().apply(new RemoveColumnFromSeries(regattaIdentifier, seriesName, columnName));
}
@Override
public void renameColumnInSeries(RegattaIdentifier regattaIdentifier, String seriesName, String oldColumnName,
public void renameRaceColumnInSeries(RegattaIdentifier regattaIdentifier, String seriesName, String oldColumnName,
String newColumnName) {
getService().apply(new RenameColumnInSeries(regattaIdentifier, seriesName, oldColumnName, newColumnName));
}
@Override
public void moveColumnInSeriesUp(RegattaIdentifier regattaIdentifier, String seriesName, String columnName) {
public void moveRaceColumnInSeriesUp(RegattaIdentifier regattaIdentifier, String seriesName, String columnName) {
getService().apply(new MoveColumnInSeriesUp(regattaIdentifier, seriesName, columnName));
}
@Override
public void moveColumnInSeriesDown(RegattaIdentifier regattaIdentifier, String seriesName, String columnName) {
public void moveRaceColumnInSeriesDown(RegattaIdentifier regattaIdentifier, String seriesName, String columnName) {
getService().apply(new MoveColumnInSeriesDown(regattaIdentifier, seriesName, columnName));
}
@@ -0,0 +1,55 @@
package com.sap.sailing.gwt.ui.shared;
public class RaceColumnInSeriesDTO extends RaceColumnDTO {
private String seriesName;
private String regattaName;
// for GWT serialization
RaceColumnInSeriesDTO() {}
public RaceColumnInSeriesDTO(String seriesName, String regattaName) {
super();
this.seriesName = seriesName;
this.regattaName = regattaName;
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((regattaName == null) ? 0 : regattaName.hashCode());
result = prime * result + ((seriesName == null) ? 0 : seriesName.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!super.equals(obj))
return false;
if (getClass() != obj.getClass())
return false;
RaceColumnInSeriesDTO other = (RaceColumnInSeriesDTO) obj;
if (regattaName == null) {
if (other.regattaName != null)
return false;
} else if (!regattaName.equals(other.regattaName))
return false;
if (seriesName == null) {
if (other.seriesName != null)
return false;
} else if (!seriesName.equals(other.seriesName))
return false;
return true;
}
public String getSeriesName() {
return seriesName;
}
public String getRegattaName() {
return regattaName;
}
}