changed loading of competitors in competitorStore to load the old competitors with the contained boat

This commit is contained in:
Frank Mittag
2017-07-21 16:41:38 +02:00
parent 410df25f14
commit 9e9f5aeaec
10 changed files with 45 additions and 25 deletions
@@ -12,7 +12,7 @@ import com.mongodb.DBObject;
import com.sap.sailing.domain.abstractlog.race.RaceLog;
import com.sap.sailing.domain.abstractlog.regatta.RegattaLog;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CompetitorWithBoat;
import com.sap.sailing.domain.base.DomainFactory;
import com.sap.sailing.domain.base.Event;
import com.sap.sailing.domain.base.RaceDefinition;
@@ -131,7 +131,7 @@ public interface DomainObjectFactory {
/**
* Loads all competitors, and resolves them via the domain factory.
*/
Collection<Competitor> loadAllCompetitors();
Collection<CompetitorWithBoat> loadAllCompetitors();
/**
* Loads all boats, and resolves them via the domain factory.
@@ -127,6 +127,7 @@ import com.sap.sailing.domain.abstractlog.regatta.impl.RegattaLogImpl;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CompetitorWithBoat;
import com.sap.sailing.domain.base.ControlPoint;
import com.sap.sailing.domain.base.ControlPointWithTwoMarks;
import com.sap.sailing.domain.base.CourseArea;
@@ -223,7 +224,7 @@ import com.sap.sailing.domain.tracking.impl.WindTrackImpl;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.BoatJsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.CompetitorJsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.CompetitorWithBoatJsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.DeviceConfigurationJsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.Helpers;
import com.sap.sailing.server.gateway.deserialization.impl.RegattaConfigurationJsonDeserializer;
@@ -251,7 +252,7 @@ import com.sap.sse.util.ThreadPoolUtil;
public class DomainObjectFactoryImpl implements DomainObjectFactory {
private static final Logger logger = Logger.getLogger(DomainObjectFactoryImpl.class.getName());
private final CompetitorJsonDeserializer competitorDeserializer;
private final CompetitorWithBoatJsonDeserializer competitorWithBoatDeserializer;
private final BoatJsonDeserializer boatDeserializer;
private final DB database;
@@ -281,7 +282,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
this.raceTrackingConnectivityParamsServiceFinder = null;
}
this.baseDomainFactory = baseDomainFactory;
this.competitorDeserializer = CompetitorJsonDeserializer.create(baseDomainFactory);
this.competitorWithBoatDeserializer = CompetitorWithBoatJsonDeserializer.create(baseDomainFactory);
this.boatDeserializer = BoatJsonDeserializer.create(baseDomainFactory);
this.database = db;
}
@@ -2124,13 +2125,13 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
}
@Override
public Collection<Competitor> loadAllCompetitors() {
ArrayList<Competitor> result = new ArrayList<Competitor>();
public Collection<CompetitorWithBoat> loadAllCompetitors() {
ArrayList<CompetitorWithBoat> result = new ArrayList<>();
DBCollection collection = database.getCollection(CollectionNames.COMPETITORS.name());
try {
for (DBObject o : collection.find()) {
JSONObject json = Helpers.toJSONObjectSafe(new JSONParser().parse(JSON.serialize(o)));
Competitor c = competitorDeserializer.deserialize(json);
CompetitorWithBoat c = competitorWithBoatDeserializer.deserialize(json);
result.add(c);
}
} catch (Exception e) {
@@ -1,14 +1,9 @@
package com.sap.sailing.domain.base;
import com.sap.sse.datamining.annotations.Connector;
/**
* A competitor having an assigned boat
* This makes sense e.g. in the context of a race where a competitor needs a boat in order to compete
* @author fmittag
*
*/
public interface CompetitorWithBoat extends Competitor {
@Connector(messageKey = "Boat", ordinal = 10)
Boat getBoat();
public interface CompetitorWithBoat extends Competitor, WithBoat {
}
@@ -0,0 +1,11 @@
package com.sap.sailing.domain.base;
import com.sap.sse.datamining.annotations.Connector;
/**
* Something with a boat.
*/
public interface WithBoat {
@Connector(messageKey = "Boat", ordinal = 10)
Boat getBoat();
}
@@ -4,6 +4,11 @@ import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CompetitorAndBoat;
/**
* A utility class to hold a combination of a competitor and a boat
* @author Frank Mittag
*
*/
public class CompetitorAndBoatImpl implements CompetitorAndBoat {
private static final long serialVersionUID = 6057339511208358777L;
private final Competitor competitor;
@@ -4,6 +4,7 @@ import java.io.Serializable;
import java.net.URI;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CompetitorWithBoat;
import com.sap.sse.common.Color;
import com.sap.sse.common.Duration;
@@ -20,6 +21,12 @@ public class CompetitorWithBoatImpl extends CompetitorImpl implements Competitor
this.boat = boat;
}
public CompetitorWithBoatImpl(Competitor competitor, Boat boat) {
this(competitor.getId(), competitor.getName(), competitor.getShortName(), competitor.getColor(), competitor.getEmail(),
competitor.getFlagImage(), (DynamicTeam) competitor.getTeam(), competitor.getTimeOnTimeFactor(),
competitor.getTimeOnDistanceAllowancePerNauticalMile(), competitor.getSearchTag(), boat);
}
@Override
public Boat getBoat() {
return boat;
@@ -675,7 +675,7 @@ public class DomainFactoryImpl implements DomainFactory {
}
Competitor existingCompetitor = getOrCreateCompetitor(rc.getCompetitor());
if (competitorBoatInfo != null && existingCompetitor.getShortName() != rc.getCompetitor().getShortName()) {
if (isSeparateBoat && existingCompetitor.getShortName() != rc.getCompetitor().getShortName()) {
// in case we find a boat info we only want to update the shortName field of the competitor (instead of using sailID)
CompetitorStore competitorStore = baseDomainFactory.getCompetitorStore();
boolean isOldCompetitorToUpdateDuringGetOrCreate = competitorStore.isCompetitorToUpdateDuringGetOrCreate(existingCompetitor);
@@ -15,7 +15,7 @@ import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.MongoException;
import com.mongodb.WriteConcern;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CompetitorWithBoat;
import com.sap.sailing.domain.base.DomainFactory;
import com.sap.sailing.domain.base.impl.DomainFactoryImpl;
import com.sap.sailing.domain.base.impl.DynamicCompetitor;
@@ -64,7 +64,7 @@ public class StoreAndLoadCompetitorsTest extends AbstractMongoDBTest {
c.setFlagImage(flagImageURI1);
mongoObjectFactory.storeCompetitor(c);
Collection<Competitor> allCompetitors = domainObjectFactory.loadAllCompetitors();
Collection<CompetitorWithBoat> allCompetitors = domainObjectFactory.loadAllCompetitors();
assertEquals(1, Util.size(allCompetitors));
DynamicCompetitor loadedCompetitor = (DynamicCompetitor) allCompetitors.iterator().next();
assertEquals(flagImageURI1, loadedCompetitor.getFlagImage());
@@ -9,10 +9,10 @@ import java.util.logging.Logger;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CompetitorAndBoat;
import com.sap.sailing.domain.base.CompetitorFactory;
import com.sap.sailing.domain.base.CompetitorWithBoat;
import com.sap.sailing.domain.base.SharedDomainFactory;
import com.sap.sailing.domain.base.impl.CompetitorAndBoatImpl;
import com.sap.sailing.domain.base.impl.CompetitorWithBoatImpl;
import com.sap.sailing.domain.base.impl.DynamicBoat;
import com.sap.sailing.domain.base.impl.DynamicTeam;
import com.sap.sailing.domain.common.tracking.impl.CompetitorJsonConstants;
@@ -23,7 +23,7 @@ import com.sap.sse.common.Color;
import com.sap.sse.common.impl.MillisecondsDurationImpl;
import com.sap.sse.common.impl.RGBColor;
public class CompetitorWithBoatJsonDeserializer implements JsonDeserializer<CompetitorAndBoat> {
public class CompetitorWithBoatJsonDeserializer implements JsonDeserializer<CompetitorWithBoat> {
protected final CompetitorFactory competitorFactory;
protected final JsonDeserializer<DynamicTeam> teamJsonDeserializer;
protected final JsonDeserializer<DynamicBoat> boatJsonDeserializer;
@@ -45,7 +45,7 @@ public class CompetitorWithBoatJsonDeserializer implements JsonDeserializer<Comp
}
@Override
public CompetitorAndBoat deserialize(JSONObject object) throws JsonDeserializationException {
public CompetitorWithBoat deserialize(JSONObject object) throws JsonDeserializationException {
Serializable competitorId = (Serializable) object.get(CompetitorJsonSerializer.FIELD_ID);
try {
Class<?> idClass = Class.forName((String) object.get(CompetitorJsonConstants.FIELD_ID_TYPE));
@@ -97,7 +97,7 @@ public class CompetitorWithBoatJsonDeserializer implements JsonDeserializer<Comp
timeOnDistanceAllowanceInSecondsPerNauticalMile == null ? null :
new MillisecondsDurationImpl((long) (timeOnDistanceAllowanceInSecondsPerNauticalMile*1000)), searchTag);
return new CompetitorAndBoatImpl(competitor, boat);
return new CompetitorWithBoatImpl(competitor, boat);
} catch (Exception e) {
throw new JsonDeserializationException(e);
}
@@ -10,6 +10,7 @@ import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CompetitorStore;
import com.sap.sailing.domain.base.CompetitorWithBoat;
import com.sap.sailing.domain.base.DomainFactory;
import com.sap.sailing.domain.base.Nationality;
import com.sap.sailing.domain.base.impl.DomainFactoryImpl;
@@ -54,8 +55,8 @@ public class PersistentCompetitorStore extends TransientCompetitorStoreImpl impl
storeTo.removeAllBoats();
} else {
// TODO bug2822: How to migrate the competitors with contained boats to competitors with separate boat
Collection<Competitor> allCompetitors = loadFrom.loadAllCompetitors();
for (Competitor competitor : allCompetitors) {
Collection<CompetitorWithBoat> allCompetitors = loadFrom.loadAllCompetitors();
for (CompetitorWithBoat competitor : allCompetitors) {
addCompetitorToTransientStore(competitor.getId(), competitor);
}
Collection<Boat> allBoats = loadFrom.loadAllBoats();
@@ -86,7 +87,7 @@ public class PersistentCompetitorStore extends TransientCompetitorStoreImpl impl
storeTo = PersistenceFactory.INSTANCE.getDefaultMongoObjectFactory();
}
private void addCompetitorToTransientStore(Serializable id, Competitor competitor) {
private void addCompetitorToTransientStore(Serializable id, CompetitorWithBoat competitor) {
super.addNewCompetitor(id, competitor);
}