mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-08 21:30:57 +00:00
first tiny successful test for storing / loading regatta
This commit is contained in:
1 parent
abf1166429
commit
81fd84e08e
18 files changed
+327
-140
No files matched your search
+20
-19
@@ -51,7 +51,6 @@ import com.sap.sailing.domain.leaderboard.RaceColumn;
|
||||
import com.sap.sailing.domain.leaderboard.SettableScoreCorrection;
|
||||
import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule;
|
||||
import com.sap.sailing.domain.leaderboard.impl.LeaderboardGroupImpl;
|
||||
import com.sap.sailing.domain.leaderboard.impl.RaceColumnImpl;
|
||||
import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl;
|
||||
import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl;
|
||||
import com.sap.sailing.domain.persistence.DomainObjectFactory;
|
||||
@@ -452,41 +451,43 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
|
||||
private Series loadSeries(DBObject dbSeries) {
|
||||
String name = (String) dbSeries.get(FieldNames.SERIES_NAME.name());
|
||||
boolean isFleetsOrdered = (Boolean) dbSeries.get(FieldNames.SERIES_IS_FLEETS_ORDERED.name());
|
||||
boolean isMedal = (Boolean) dbSeries.get(FieldNames.SERIES_IS_MEDAL.name());
|
||||
final BasicDBList dbFleets = (BasicDBList) dbSeries.get(FieldNames.SERIES_FLEETS.name());
|
||||
Map<String, Fleet> fleetsByName = loadFleets(dbFleets);
|
||||
BasicDBList dbRaceColumns = (BasicDBList) dbSeries.get(FieldNames.SERIES_RACE_COLUMNS.name());
|
||||
Iterable<? extends RaceColumn> raceColumns = loadRaceColumns(dbRaceColumns, fleetsByName);
|
||||
Series result = new SeriesImpl(name, isFleetsOrdered, fleetsByName.values(), raceColumns);
|
||||
return result;
|
||||
Iterable<String> raceColumnNames = loadRaceColumnNames(dbRaceColumns, fleetsByName);
|
||||
Series series = new SeriesImpl(name, isFleetsOrdered, isMedal, fleetsByName.values(), raceColumnNames);
|
||||
loadRaceColumnRaceLinks(dbRaceColumns, series);
|
||||
return series;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param fleetsByName used to ensure the {@link RaceColumn#getFleets()} points to the same {@link Fleet} objects also
|
||||
* used in the {@link Series#getFleets()} collection.
|
||||
*/
|
||||
private Iterable<? extends RaceColumn> loadRaceColumns(BasicDBList dbRaceColumns, Map<String, Fleet> fleetsByName) {
|
||||
List<RaceColumn> result = new ArrayList<RaceColumn>();
|
||||
private Iterable<String> loadRaceColumnNames(BasicDBList dbRaceColumns, Map<String, Fleet> fleetsByName) {
|
||||
List<String> result = new ArrayList<String>();
|
||||
for (Object o : dbRaceColumns) {
|
||||
DBObject dbRaceColumn = (DBObject) o;
|
||||
result.add(loadRaceColumn(dbRaceColumn, fleetsByName));
|
||||
result.add((String) dbRaceColumn.get(FieldNames.LEADERBOARD_COLUMN_NAME.name()));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private RaceColumn loadRaceColumn(DBObject dbRaceColumn, Map<String, Fleet> fleetsByName) {
|
||||
String name = (String) dbRaceColumn.get(FieldNames.LEADERBOARD_COLUMN_NAME.name());
|
||||
boolean medalRace = (Boolean) dbRaceColumn.get(FieldNames.LEADERBOARD_IS_MEDAL_RACE_COLUMN.name());
|
||||
RaceColumn raceColumn = new RaceColumnImpl(name, medalRace, fleetsByName.values());
|
||||
Map<String, RaceIdentifier> raceIdentifiersPerFleetName = loadRaceIdentifiers(dbRaceColumn);
|
||||
for (Map.Entry<String, RaceIdentifier> e : raceIdentifiersPerFleetName.entrySet()) {
|
||||
// null key for "default" fleet is not acceptable here
|
||||
if (e.getKey() == null) {
|
||||
logger.warning("Ignoring null fleet name while loading RaceColumn "+name);
|
||||
} else {
|
||||
raceColumn.setRaceIdentifier(fleetsByName.get(e.getKey()), e.getValue());
|
||||
private void loadRaceColumnRaceLinks(BasicDBList dbRaceColumns, Series series) {
|
||||
for (Object o : dbRaceColumns) {
|
||||
DBObject dbRaceColumn = (DBObject) o;
|
||||
String name = (String) dbRaceColumn.get(FieldNames.LEADERBOARD_COLUMN_NAME.name());
|
||||
Map<String, RaceIdentifier> raceIdentifiersPerFleetName = loadRaceIdentifiers(dbRaceColumn);
|
||||
for (Map.Entry<String, RaceIdentifier> e : raceIdentifiersPerFleetName.entrySet()) {
|
||||
// null key for "default" fleet is not acceptable here
|
||||
if (e.getKey() == null) {
|
||||
logger.warning("Ignoring null fleet name while loading RaceColumn " + name);
|
||||
} else {
|
||||
series.getRaceColumnByName(name).setRaceIdentifier(series.getFleetByName(e.getKey()), e.getValue());
|
||||
}
|
||||
}
|
||||
}
|
||||
return raceColumn;
|
||||
}
|
||||
|
||||
private Map<String, Fleet> loadFleets(BasicDBList dbFleets) {
|
||||
|
||||
+1
@@ -15,6 +15,7 @@ public enum FieldNames {
|
||||
REGATTA_BASE_NAME,
|
||||
REGATTA_SERIES,
|
||||
SERIES_NAME,
|
||||
SERIES_IS_MEDAL,
|
||||
SERIES_IS_FLEETS_ORDERED,
|
||||
SERIES_FLEETS,
|
||||
SERIES_RACE_COLUMNS,
|
||||
|
||||
+1
@@ -317,6 +317,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
|
||||
DBObject dbSeries = new BasicDBObject();
|
||||
dbSeries.put(FieldNames.SERIES_NAME.name(), s.getName());
|
||||
dbSeries.put(FieldNames.SERIES_IS_FLEETS_ORDERED.name(), s.isFleetsOrdered());
|
||||
dbSeries.put(FieldNames.SERIES_IS_MEDAL.name(), s.isMedal());
|
||||
BasicDBList dbFleets = new BasicDBList();
|
||||
for (Fleet fleet : s.getFleets()) {
|
||||
dbFleets.add(storeFleet(fleet));
|
||||
|
||||
@@ -26,10 +26,22 @@ public interface Series extends Named {
|
||||
*/
|
||||
Iterable<? extends RaceColumn> getRaceColumns();
|
||||
|
||||
RaceColumn getRaceColumnByName(String columnName);
|
||||
|
||||
/**
|
||||
* Tells whether the fleets returned by {@link #getFleets()} have a relevant ordering. This is the case particularly
|
||||
* for final series with fleets such as "Gold" and "Silver" but usually not for qualification series with fleets such
|
||||
* as "Yellow" and "Blue" which don't have an ordering, particularly for ranking considerations.
|
||||
*/
|
||||
boolean isFleetsOrdered();
|
||||
|
||||
/**
|
||||
* Tells whether this is the "last" / "medal" race series, usually having only one race. This may have implications
|
||||
* on the scoring scheme (usually, medal races scores are doubled and cannot be discarded).
|
||||
*/
|
||||
boolean isMedal();
|
||||
|
||||
void setIsMedal(boolean isMedal);
|
||||
|
||||
Fleet getFleetByName(String fleetName);
|
||||
}
|
||||
+92
@@ -0,0 +1,92 @@
|
||||
package com.sap.sailing.domain.base.impl;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.base.Fleet;
|
||||
import com.sap.sailing.domain.common.RaceIdentifier;
|
||||
import com.sap.sailing.domain.common.impl.Util;
|
||||
import com.sap.sailing.domain.common.impl.Util.Pair;
|
||||
import com.sap.sailing.domain.leaderboard.RaceColumn;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
|
||||
public abstract class AbstractRaceColumn implements RaceColumn {
|
||||
private static final long serialVersionUID = -7801617988982540470L;
|
||||
|
||||
private final Map<Fleet, TrackedRace> trackedRaces;
|
||||
private String name;
|
||||
private final Map<Fleet, RaceIdentifier> raceIdentifiers;
|
||||
|
||||
public AbstractRaceColumn(String name) {
|
||||
this.name = name;
|
||||
this.trackedRaces = new HashMap<Fleet, TrackedRace>();
|
||||
this.raceIdentifiers = new HashMap<Fleet, RaceIdentifier>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public TrackedRace getTrackedRace(Fleet fleet) {
|
||||
return trackedRaces.get(fleet);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTrackedRace(Fleet fleet, TrackedRace trackedRace) {
|
||||
this.trackedRaces.put(fleet, trackedRace);
|
||||
this.setRaceIdentifier(fleet, trackedRace == null ? null : trackedRace.getRaceIdentifier());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setName(String newName) {
|
||||
this.name = newName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Pair<Competitor, RaceColumn> getKey(Competitor competitor) {
|
||||
return new Pair<Competitor, RaceColumn>(competitor, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public RaceIdentifier getRaceIdentifier(Fleet fleet) {
|
||||
return raceIdentifiers.get(fleet);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setRaceIdentifier(Fleet fleet, RaceIdentifier raceIdentifier) {
|
||||
this.raceIdentifiers.put(fleet, raceIdentifier);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void releaseTrackedRace(Fleet fleet) {
|
||||
trackedRaces.remove(fleet);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Fleet getFleetByName(String fleetName) {
|
||||
for (Fleet fleet : getFleets()) {
|
||||
if (fleet.getName().equals(fleetName)) {
|
||||
return fleet;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasTrackedRaces() {
|
||||
return !trackedRaces.isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public TrackedRace getTrackedRace(Competitor competitor) {
|
||||
for (TrackedRace trackedRace : trackedRaces.values()) {
|
||||
if (Util.contains(trackedRace.getRace().getCompetitors(), competitor)) {
|
||||
return trackedRace;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
package com.sap.sailing.domain.base.impl;
|
||||
|
||||
import com.sap.sailing.domain.base.Fleet;
|
||||
import com.sap.sailing.domain.base.Series;
|
||||
|
||||
/**
|
||||
* Obtains flees and medal information from the {@link Series} to which it is connected at construction time.
|
||||
*
|
||||
* @author Axel Uhl (D043530)
|
||||
*
|
||||
*/
|
||||
public class RaceColumnInSeries extends AbstractRaceColumn {
|
||||
private static final long serialVersionUID = -2199678838624406645L;
|
||||
private final Series series;
|
||||
|
||||
public RaceColumnInSeries(String name, Series series) {
|
||||
super(name);
|
||||
this.series = series;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<? extends Fleet> getFleets() {
|
||||
return series.getFleets();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isMedalRace() {
|
||||
return series.isMedal();
|
||||
}
|
||||
}
|
||||
@@ -16,7 +16,6 @@ import com.sap.sailing.domain.base.Series;
|
||||
import com.sap.sailing.domain.common.RegattaIdentifier;
|
||||
import com.sap.sailing.domain.common.RegattaName;
|
||||
import com.sap.sailing.domain.common.impl.NamedImpl;
|
||||
import com.sap.sailing.domain.leaderboard.RaceColumn;
|
||||
|
||||
public class RegattaImpl extends NamedImpl implements Regatta {
|
||||
private static final long serialVersionUID = 6509564189552478869L;
|
||||
@@ -30,7 +29,7 @@ public class RegattaImpl extends NamedImpl implements Regatta {
|
||||
*/
|
||||
public RegattaImpl(String baseName, BoatClass boatClass) {
|
||||
this(baseName, boatClass, Collections.singletonList(new SeriesImpl("Default", /* isFleetsOrdered */true,
|
||||
Collections.singletonList(new FleetImpl("Default")), new ArrayList<RaceColumn>())));
|
||||
/* isMedal */ false, Collections.singletonList(new FleetImpl("Default")), /* race column names */ new ArrayList<String>())));
|
||||
}
|
||||
|
||||
public RegattaImpl(String baseName, BoatClass boatClass, Iterable<? extends Series> series) {
|
||||
|
||||
@@ -1,5 +1,10 @@
|
||||
package com.sap.sailing.domain.base.impl;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.sap.sailing.domain.base.Fleet;
|
||||
import com.sap.sailing.domain.base.Series;
|
||||
import com.sap.sailing.domain.common.impl.NamedImpl;
|
||||
@@ -8,14 +13,24 @@ import com.sap.sailing.domain.leaderboard.RaceColumn;
|
||||
public class SeriesImpl extends NamedImpl implements Series {
|
||||
private static final long serialVersionUID = -1640404303144907381L;
|
||||
private final boolean isFleetsOrdered;
|
||||
private final Iterable<? extends Fleet> fleets;
|
||||
private final Iterable<? extends RaceColumn> raceColumns;
|
||||
private final Map<String, Fleet> fleetsByName;
|
||||
private final Iterable<RaceColumnInSeries> raceColumns;
|
||||
private boolean isMedal;
|
||||
|
||||
public SeriesImpl(String name, boolean isFleetsOrdered, Iterable<? extends Fleet> fleets, Iterable<? extends RaceColumn> raceColumns) {
|
||||
public SeriesImpl(String name, boolean isFleetsOrdered, boolean isMedal, Iterable<? extends Fleet> fleets, Iterable<String> raceColumnNames) {
|
||||
super(name);
|
||||
this.isFleetsOrdered = isFleetsOrdered;
|
||||
this.fleets = fleets;
|
||||
this.raceColumns = raceColumns;
|
||||
this.fleetsByName = new HashMap<String, Fleet>();
|
||||
for (Fleet fleet : fleets) {
|
||||
this.fleetsByName.put(fleet.getName(), fleet);
|
||||
}
|
||||
List<RaceColumnInSeries> myRaceColumns = new ArrayList<RaceColumnInSeries>();
|
||||
for (String raceColumnName : raceColumnNames) {
|
||||
RaceColumnInSeries raceColumn = new RaceColumnInSeries(raceColumnName, this);
|
||||
myRaceColumns.add(raceColumn);
|
||||
}
|
||||
this.raceColumns = myRaceColumns;
|
||||
this.isMedal = isMedal;
|
||||
}
|
||||
|
||||
public boolean isFleetsOrdered() {
|
||||
@@ -23,7 +38,12 @@ public class SeriesImpl extends NamedImpl implements Series {
|
||||
}
|
||||
|
||||
public Iterable<? extends Fleet> getFleets() {
|
||||
return fleets;
|
||||
return fleetsByName.values();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Fleet getFleetByName(String fleetName) {
|
||||
return fleetsByName.get(fleetName);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -31,4 +51,23 @@ public class SeriesImpl extends NamedImpl implements Series {
|
||||
return raceColumns;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RaceColumn getRaceColumnByName(String columnName) {
|
||||
for (RaceColumn raceColumn : raceColumns) {
|
||||
if (raceColumn.getName().equals(columnName)) {
|
||||
return raceColumn;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isMedal() {
|
||||
return isMedal;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setIsMedal(boolean isMedal) {
|
||||
this.isMedal = isMedal;
|
||||
}
|
||||
}
|
||||
+2
@@ -62,4 +62,6 @@ public interface FlexibleLeaderboard extends Leaderboard {
|
||||
|
||||
void removeRaceColumn(String columnName);
|
||||
|
||||
void updateIsMedalRace(String raceName, boolean isMedalRace);
|
||||
|
||||
}
|
||||
Executable
+5
@@ -0,0 +1,5 @@
|
||||
package com.sap.sailing.domain.leaderboard;
|
||||
|
||||
public interface FlexibleRaceColumn extends RaceColumn {
|
||||
void setIsMedalRace(boolean isMedalRace);
|
||||
}
|
||||
@@ -200,8 +200,6 @@ public interface Leaderboard extends Named {
|
||||
*/
|
||||
boolean considerForDiscarding(RaceColumn raceInLeaderboard, TimePoint timePoint);
|
||||
|
||||
void updateIsMedalRace(String raceName, boolean isMedalRace);
|
||||
|
||||
public void setResultDiscardingRule(ThresholdBasedResultDiscardingRule discardingRule);
|
||||
|
||||
Competitor getCompetitorByIdAsString(String idAsString);
|
||||
|
||||
@@ -27,7 +27,7 @@ public interface RaceColumn extends Named {
|
||||
/**
|
||||
* @return the fleets for each of which this column has a single race and therefore optionally a {@link TrackedRace}
|
||||
*/
|
||||
Iterable<Fleet> getFleets();
|
||||
Iterable<? extends Fleet> getFleets();
|
||||
|
||||
Fleet getFleetByName(String fleetName);
|
||||
|
||||
@@ -85,8 +85,6 @@ public interface RaceColumn extends Named {
|
||||
*/
|
||||
boolean isMedalRace();
|
||||
|
||||
void setIsMedalRace(boolean isMedalRace);
|
||||
|
||||
void setName(String newName);
|
||||
|
||||
/**
|
||||
|
||||
-12
@@ -330,18 +330,6 @@ public abstract class AbstractLeaderboardImpl implements Leaderboard {
|
||||
displayNames.put(competitor, displayName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateIsMedalRace(String raceName, boolean isMedalRace) {
|
||||
RaceColumn race = null;
|
||||
for (RaceColumn r : getRaceColumns()) {
|
||||
if (r.getName().equals(raceName))
|
||||
race = r;
|
||||
}
|
||||
if (race != null) {
|
||||
race.setIsMedalRace(isMedalRace);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setResultDiscardingRule(ThresholdBasedResultDiscardingRule discardingRule) {
|
||||
this.resultDiscardingRule = discardingRule;
|
||||
|
||||
+26
-8
@@ -9,6 +9,7 @@ import java.util.logging.Logger;
|
||||
import com.sap.sailing.domain.base.Fleet;
|
||||
import com.sap.sailing.domain.base.impl.FleetImpl;
|
||||
import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard;
|
||||
import com.sap.sailing.domain.leaderboard.FlexibleRaceColumn;
|
||||
import com.sap.sailing.domain.leaderboard.RaceColumn;
|
||||
import com.sap.sailing.domain.leaderboard.SettableScoreCorrection;
|
||||
import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule;
|
||||
@@ -26,17 +27,17 @@ public class FlexibleLeaderboardImpl extends AbstractLeaderboardImpl implements
|
||||
|
||||
protected static final Fleet defaultFleet = new FleetImpl("Default");
|
||||
private static final long serialVersionUID = -5708971849158747846L;
|
||||
private final List<RaceColumn> races;
|
||||
private final List<FlexibleRaceColumn> races;
|
||||
|
||||
public FlexibleLeaderboardImpl(String name, SettableScoreCorrection scoreCorrection,
|
||||
ThresholdBasedResultDiscardingRule resultDiscardingRule) {
|
||||
super(name, scoreCorrection, resultDiscardingRule);
|
||||
this.races = new ArrayList<RaceColumn>();
|
||||
this.races = new ArrayList<FlexibleRaceColumn>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public RaceColumn addRaceColumn(String name, boolean medalRace, Fleet... fleets) {
|
||||
RaceColumn column = getRaceColumnByName(name);
|
||||
FlexibleRaceColumn column = getRaceColumnByName(name);
|
||||
if (column != null) {
|
||||
final String msg = "Trying to create race column with duplicate name "+name+" in leaderboard +"+getName();
|
||||
logger.severe(msg);
|
||||
@@ -47,6 +48,11 @@ public class FlexibleLeaderboardImpl extends AbstractLeaderboardImpl implements
|
||||
return column;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FlexibleRaceColumn getRaceColumnByName(String columnName) {
|
||||
return (FlexibleRaceColumn) super.getRaceColumnByName(columnName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Fleet getFleet(String fleetName) {
|
||||
Fleet result;
|
||||
@@ -70,7 +76,7 @@ public class FlexibleLeaderboardImpl extends AbstractLeaderboardImpl implements
|
||||
|
||||
@Override
|
||||
public RaceColumn addRace(TrackedRace race, String columnName, boolean medalRace, Fleet fleet) {
|
||||
RaceColumn column = getRaceColumnByName(columnName);
|
||||
FlexibleRaceColumn column = getRaceColumnByName(columnName);
|
||||
if (column == null) {
|
||||
column = createRaceColumn(columnName, medalRace);
|
||||
races.add(column);
|
||||
@@ -95,8 +101,8 @@ public class FlexibleLeaderboardImpl extends AbstractLeaderboardImpl implements
|
||||
|
||||
@Override
|
||||
public void moveRaceColumnUp(String name) {
|
||||
RaceColumn race = null;
|
||||
for (RaceColumn r : races) {
|
||||
FlexibleRaceColumn race = null;
|
||||
for (FlexibleRaceColumn r : races) {
|
||||
if (r.getName().equals(name)) {
|
||||
race = r;
|
||||
}
|
||||
@@ -115,8 +121,8 @@ public class FlexibleLeaderboardImpl extends AbstractLeaderboardImpl implements
|
||||
|
||||
@Override
|
||||
public void moveRaceColumnDown(String name) {
|
||||
RaceColumn race = null;
|
||||
for (RaceColumn r : races) {
|
||||
FlexibleRaceColumn race = null;
|
||||
for (FlexibleRaceColumn r : races) {
|
||||
if (r.getName().equals(name)) {
|
||||
race = r;
|
||||
}
|
||||
@@ -136,4 +142,16 @@ public class FlexibleLeaderboardImpl extends AbstractLeaderboardImpl implements
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateIsMedalRace(String raceName, boolean isMedalRace) {
|
||||
FlexibleRaceColumn race = null;
|
||||
for (FlexibleRaceColumn r : races) {
|
||||
if (r.getName().equals(raceName))
|
||||
race = r;
|
||||
}
|
||||
if (race != null) {
|
||||
race.setIsMedalRace(isMedalRace);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
+4
-81
@@ -1,17 +1,10 @@
|
||||
package com.sap.sailing.domain.leaderboard.impl;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.base.Fleet;
|
||||
import com.sap.sailing.domain.common.RaceIdentifier;
|
||||
import com.sap.sailing.domain.common.impl.Util;
|
||||
import com.sap.sailing.domain.common.impl.Util.Pair;
|
||||
import com.sap.sailing.domain.leaderboard.RaceColumn;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
import com.sap.sailing.domain.base.impl.AbstractRaceColumn;
|
||||
import com.sap.sailing.domain.leaderboard.FlexibleRaceColumn;
|
||||
|
||||
public class RaceColumnImpl implements RaceColumn {
|
||||
public class RaceColumnImpl extends AbstractRaceColumn implements FlexibleRaceColumn {
|
||||
private static final long serialVersionUID = -7801617988982540470L;
|
||||
|
||||
/**
|
||||
@@ -19,17 +12,12 @@ public class RaceColumnImpl implements RaceColumn {
|
||||
* {@link #trackedRaces} and {@link #raceIdentifiers}.
|
||||
*/
|
||||
private final Iterable<Fleet> fleets;
|
||||
private final Map<Fleet, TrackedRace> trackedRaces;
|
||||
private boolean medalRace;
|
||||
private String name;
|
||||
private final Map<Fleet, RaceIdentifier> raceIdentifiers;
|
||||
|
||||
public RaceColumnImpl(String name, boolean medalRace, Iterable<Fleet> fleets) {
|
||||
this.name = name;
|
||||
super(name);
|
||||
this.medalRace = medalRace;
|
||||
this.fleets = fleets;
|
||||
this.trackedRaces = new HashMap<Fleet, TrackedRace>();
|
||||
this.raceIdentifiers = new HashMap<Fleet, RaceIdentifier>();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -37,79 +25,14 @@ public class RaceColumnImpl implements RaceColumn {
|
||||
return medalRace;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TrackedRace getTrackedRace(Fleet fleet) {
|
||||
return trackedRaces.get(fleet);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTrackedRace(Fleet fleet, TrackedRace trackedRace) {
|
||||
this.trackedRaces.put(fleet, trackedRace);
|
||||
this.setRaceIdentifier(fleet, trackedRace == null ? null : trackedRace.getRaceIdentifier());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setName(String newName) {
|
||||
this.name = newName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Pair<Competitor, RaceColumn> getKey(Competitor competitor) {
|
||||
return new Pair<Competitor, RaceColumn>(competitor, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setIsMedalRace(boolean isMedalRace) {
|
||||
this.medalRace = isMedalRace;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RaceIdentifier getRaceIdentifier(Fleet fleet) {
|
||||
return raceIdentifiers.get(fleet);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setRaceIdentifier(Fleet fleet, RaceIdentifier raceIdentifier) {
|
||||
this.raceIdentifiers.put(fleet, raceIdentifier);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void releaseTrackedRace(Fleet fleet) {
|
||||
trackedRaces.remove(fleet);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<Fleet> getFleets() {
|
||||
return fleets;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Fleet getFleetByName(String fleetName) {
|
||||
for (Fleet fleet : getFleets()) {
|
||||
if (fleet.getName().equals(fleetName)) {
|
||||
return fleet;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasTrackedRaces() {
|
||||
return !trackedRaces.isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public TrackedRace getTrackedRace(Competitor competitor) {
|
||||
for (TrackedRace trackedRace : trackedRaces.values()) {
|
||||
if (Util.contains(trackedRace.getRace().getCompetitors(), competitor)) {
|
||||
return trackedRace;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
+8
@@ -10,14 +10,18 @@ import com.mongodb.DB;
|
||||
import com.mongodb.Mongo;
|
||||
import com.mongodb.MongoException;
|
||||
import com.sap.sailing.mongodb.MongoDBConfiguration;
|
||||
import com.sap.sailing.mongodb.MongoDBService;
|
||||
|
||||
public abstract class AbstractMongoDBTest {
|
||||
protected Mongo mongo;
|
||||
protected DB db;
|
||||
private final MongoDBConfiguration dbConfiguration;
|
||||
private MongoDBService service;
|
||||
|
||||
public AbstractMongoDBTest() {
|
||||
dbConfiguration = MongoDBConfiguration.getDefaultTestConfiguration();
|
||||
service = MongoDBService.INSTANCE;
|
||||
service.setConfiguration(getDBConfiguration());
|
||||
}
|
||||
|
||||
protected MongoDBConfiguration getDBConfiguration() {
|
||||
@@ -36,4 +40,8 @@ public abstract class AbstractMongoDBTest {
|
||||
db = mongo.getDB(getDBConfiguration().getDatabaseName());
|
||||
assertNotNull(db);
|
||||
}
|
||||
|
||||
protected MongoDBService getMongoService() {
|
||||
return service;
|
||||
}
|
||||
}
|
||||
+76
-5
@@ -3,19 +3,29 @@ package com.sap.sailing.mongodb.test;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sailing.domain.base.BoatClass;
|
||||
import com.sap.sailing.domain.base.CourseArea;
|
||||
import com.sap.sailing.domain.base.DomainFactory;
|
||||
import com.sap.sailing.domain.base.Event;
|
||||
import com.sap.sailing.domain.base.Fleet;
|
||||
import com.sap.sailing.domain.base.Regatta;
|
||||
import com.sap.sailing.domain.base.Series;
|
||||
import com.sap.sailing.domain.base.Venue;
|
||||
import com.sap.sailing.domain.base.impl.CourseAreaImpl;
|
||||
import com.sap.sailing.domain.base.impl.EventImpl;
|
||||
import com.sap.sailing.domain.base.impl.FleetImpl;
|
||||
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.impl.Util;
|
||||
import com.sap.sailing.domain.persistence.DomainObjectFactory;
|
||||
import com.sap.sailing.domain.persistence.MongoFactory;
|
||||
import com.sap.sailing.domain.persistence.MongoObjectFactory;
|
||||
import com.sap.sailing.mongodb.MongoDBService;
|
||||
|
||||
public class TestStoringAndLoadingEventsAndRegattas extends AbstractMongoDBTest {
|
||||
@Test
|
||||
@@ -28,13 +38,11 @@ public class TestStoringAndLoadingEventsAndRegattas extends AbstractMongoDBTest
|
||||
CourseArea courseArea = new CourseAreaImpl(courseAreaName);
|
||||
venue.addCourseArea(courseArea);
|
||||
}
|
||||
MongoDBService service = MongoDBService.INSTANCE;
|
||||
service.setConfiguration(getDBConfiguration());
|
||||
MongoObjectFactory mof = MongoFactory.INSTANCE.getMongoObjectFactory(service);
|
||||
MongoObjectFactory mof = MongoFactory.INSTANCE.getMongoObjectFactory(getMongoService());
|
||||
Event event = new EventImpl(eventName, venue);
|
||||
mof.storeEvent(event);
|
||||
|
||||
DomainObjectFactory dof = MongoFactory.INSTANCE.getDomainObjectFactory(service);
|
||||
DomainObjectFactory dof = MongoFactory.INSTANCE.getDomainObjectFactory(getMongoService());
|
||||
Event loadedEvent = dof.loadEvent(eventName);
|
||||
assertNotNull(loadedEvent);
|
||||
assertEquals(eventName, loadedEvent.getName());
|
||||
@@ -47,4 +55,67 @@ public class TestStoringAndLoadingEventsAndRegattas extends AbstractMongoDBTest
|
||||
assertEquals(courseAreaNames[i++], loadedCourseArea.getName());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLoadStoreSimpleRegatta() {
|
||||
final int numberOfQualifyingRaces = 5;
|
||||
final int numberOfFinalRaces = 7;
|
||||
final String regattaBaseName = "Kieler Woche";
|
||||
BoatClass boatClass = DomainFactory.INSTANCE.getOrCreateBoatClass("29erXX", /* typicallyStartsUpwind */ true);
|
||||
Regatta regatta = createRegatta(numberOfQualifyingRaces, numberOfFinalRaces, regattaBaseName, boatClass);
|
||||
MongoObjectFactory mof = MongoFactory.INSTANCE.getMongoObjectFactory(getMongoService());
|
||||
mof.storeRegatta(regatta);
|
||||
|
||||
DomainObjectFactory dof = MongoFactory.INSTANCE.getDomainObjectFactory(getMongoService());
|
||||
Regatta loadedRegatta = dof.loadRegatta(regatta.getName());
|
||||
assertEquals(regattaBaseName, loadedRegatta.getBaseName());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLoadStoreRegattaWithFleetsEnsuringIdenticalFleetsInSeriesAndRaceColumns() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
private Regatta createRegatta(final int numberOfQualifyingRaces, final int numberOfFinalRaces,
|
||||
final String regattaBaseName, BoatClass boatClass) {
|
||||
List<Series> series = new ArrayList<Series>();
|
||||
|
||||
// -------- qualifying series ------------
|
||||
List<Fleet> qualifyingFleets = new ArrayList<Fleet>();
|
||||
qualifyingFleets.add(new FleetImpl("Yellow"));
|
||||
qualifyingFleets.add(new FleetImpl("Blue"));
|
||||
List<String> qualifyingRaceColumnNames = new ArrayList<String>();
|
||||
for (int i=1; i<=numberOfQualifyingRaces; i++) {
|
||||
qualifyingRaceColumnNames.add("Q"+i);
|
||||
}
|
||||
Series qualifyingSeries = new SeriesImpl("Qualifying", /* isFleetsOrdered */false, /* isMedal */false,
|
||||
qualifyingFleets, qualifyingRaceColumnNames);
|
||||
series.add(qualifyingSeries);
|
||||
|
||||
// -------- final series ------------
|
||||
List<Fleet> finalFleets = new ArrayList<Fleet>();
|
||||
finalFleets.add(new FleetImpl("Gold"));
|
||||
finalFleets.add(new FleetImpl("Silver"));
|
||||
List<String> finalRaceColumnNames = new ArrayList<String>();
|
||||
for (int i=1; i<=numberOfFinalRaces; i++) {
|
||||
finalRaceColumnNames.add("F"+i);
|
||||
}
|
||||
Series finalSeries = new SeriesImpl("Final", /* isFleetsOrdered */ true, /* isMedal */ false, finalFleets, finalRaceColumnNames);
|
||||
series.add(finalSeries);
|
||||
|
||||
// ------------ medal --------------
|
||||
List<Fleet> medalFleets = new ArrayList<Fleet>();
|
||||
medalFleets.add(new FleetImpl("Medal"));
|
||||
List<String> medalRaceColumnNames = new ArrayList<String>();
|
||||
for (int i=1; i<=numberOfFinalRaces; i++) {
|
||||
medalRaceColumnNames.add("M");
|
||||
}
|
||||
Series medalSeries = new SeriesImpl("Medal", /* isFleetsOrdered */ true, /* isMedal */ true, medalFleets, medalRaceColumnNames);
|
||||
series.add(medalSeries);
|
||||
|
||||
Regatta regatta = new RegattaImpl(regattaBaseName, boatClass, series);
|
||||
return regatta;
|
||||
}
|
||||
|
||||
}
|
||||
+3
-2
@@ -1,5 +1,6 @@
|
||||
package com.sap.sailing.server.operationaltransformation;
|
||||
|
||||
import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard;
|
||||
import com.sap.sailing.domain.leaderboard.Leaderboard;
|
||||
import com.sap.sailing.server.RacingEventService;
|
||||
import com.sap.sailing.server.RacingEventServiceOperation;
|
||||
@@ -28,8 +29,8 @@ public class UpdateIsMedalRace extends AbstractLeaderboardColumnOperation<Void>
|
||||
@Override
|
||||
public Void internalApplyTo(RacingEventService toState) {
|
||||
Leaderboard leaderboard = toState.getLeaderboardByName(getLeaderboardName());
|
||||
if (leaderboard != null) {
|
||||
leaderboard.updateIsMedalRace(getColumnName(), isMedalRace);
|
||||
if (leaderboard != null && leaderboard instanceof FlexibleLeaderboard) {
|
||||
((FlexibleLeaderboard) leaderboard).updateIsMedalRace(getColumnName(), isMedalRace);
|
||||
toState.updateStoredLeaderboard(leaderboard);
|
||||
} else {
|
||||
throw new IllegalArgumentException("Leaderboard named " + getLeaderboardName() + " not found");
|
||||
|
||||
Reference in new issue
Block a user