simple allRace RestService, disabled persistance to reduce future

conflicts if this is deployed
This commit is contained in:
Kai Boernert committed 2017-08-04 15:20:34 +02:00
1 parent 85c112140c
commit e719e1d866
12 files changed
+319 -161

No files matched your search

@@ -3,10 +3,13 @@ package com.sap.sailing.domain.persistence.impl;
import java.io.Serializable;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.UUID;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -18,6 +21,7 @@ import com.mongodb.BasicDBObject;
import com.mongodb.BasicDBObjectBuilder;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.DuplicateKeyException;
import com.mongodb.MongoCommandException;
@@ -63,6 +67,7 @@ import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogRevokeEvent;
import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogSetCompetitorTimeOnDistanceAllowancePerNauticalMileEvent;
import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogSetCompetitorTimeOnTimeFactorEvent;
import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceCompetitorBravoMappingEventImpl;
import com.sap.sailing.domain.anniversary.AnniversaryRaceInfo;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.ControlPoint;
import com.sap.sailing.domain.base.ControlPointWithTwoMarks;
@@ -89,6 +94,7 @@ import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.domain.common.PassingInstruction;
import com.sap.sailing.domain.common.Positioned;
import com.sap.sailing.domain.common.RaceIdentifier;
import com.sap.sailing.domain.common.RegattaNameAndRaceName;
import com.sap.sailing.domain.common.Speed;
import com.sap.sailing.domain.common.SpeedWithBearing;
import com.sap.sailing.domain.common.Wind;
@@ -1659,12 +1665,15 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
DBObject toLoad = cursor.next();
String leaderboardName = toLoad.get("leaderboardName").toString();
String eventID = toLoad.get("eventID").toString();
String remoteUrl = toLoad.get("remoteUrl").toString();
Date startOfRace = (Date) toLoad.get("startOfRace");
String race = toLoad.get("race").toString();
String regatta = toLoad.get("regatta").toString();
AnniversaryRaceInfo loadedAnniversary = new AnniversaryRaceInfo(new RegattaNameAndRaceName(regatta, race), leaderboardName , startOfRace, UUID.fromString(eventID));
loadedAnniversary.setRemoteName(remoteUrl);
Object rurl = toLoad.get("remoteUrl");
if(rurl != null){
loadedAnniversary.setRemoteName( rurl.toString());
}
int anniversary = ((Number)toLoad.get("anniversary")).intValue();
fromDb.put(anniversary, loadedAnniversary);
}
@@ -79,7 +79,7 @@ public class CreateAndTrackWithRaceLogTest extends RaceLogTrackingTestHelper {
@Before
public void setup() {
service = new RacingEventServiceImpl(/* clearPersistentCompetitorStore */ true, new MockSmartphoneImeiServiceFinderFactory(), /* restoreTrackedRaces */ false);
service = new RacingEventServiceImpl(/* clearPersistentCompetitorStore */ true, new MockSmartphoneImeiServiceFinderFactory(), /* restoreTrackedRaces */ false,null);
sensorFixStore = service.getSensorFixStore();
service.getMongoObjectFactory().getDatabase().dropDatabase();
author = service.getServerAuthor();
@@ -47,7 +47,7 @@ public class SailingServiceImplMock extends SailingServiceImpl {
public SailingServiceImplMock() {
super();
service = new RacingEventServiceImpl(/* clearPersistentCompetitorStore */ true, new MockSmartphoneImeiServiceFinderFactory(), /* restoreTrackedRaces */ false);
service = new RacingEventServiceImpl(/* clearPersistentCompetitorStore */ true, new MockSmartphoneImeiServiceFinderFactory(), /* restoreTrackedRaces */ false,null);
try {
replicationService = new ReplicationServiceImpl("test exchange", "localhost", 0,
new ReplicationInstancesManager(), new AbstractReplicablesProvider() {
@@ -21,7 +21,7 @@ public class SimpleAnniversaryRaceInfoJsonSerializer implements JsonSerializer<S
JSONObject result = new JSONObject();
result.put(FIELD_RACE_NAME, object.getIdentifier().getRaceName());
result.put(FIELD_REGATTA_NAME, object.getIdentifier().getRegattaName());
result.put(FIELD_START_OF_RACE, object.getStartOfRace());
result.put(FIELD_START_OF_RACE, object.getStartOfRace().getTime());
return result;
}
@@ -29,7 +29,7 @@ public class SimpleAnniversaryRaceInfoJsonSerializer implements JsonSerializer<S
public SimpleAnniversaryRaceInfo deserialize(JSONObject object) throws JsonDeserializationException {
String raceName = object.get(SimpleAnniversaryRaceInfoJsonSerializer.FIELD_RACE_NAME).toString();
String regattaName = object.get(SimpleAnniversaryRaceInfoJsonSerializer.FIELD_REGATTA_NAME).toString();
Date startOfRace = (Date) object.get(SimpleAnniversaryRaceInfoJsonSerializer.FIELD_START_OF_RACE);
Date startOfRace = new Date(((Number)object.get(SimpleAnniversaryRaceInfoJsonSerializer.FIELD_START_OF_RACE)).longValue());
return new SimpleAnniversaryRaceInfo(new RegattaNameAndRaceName(regattaName, raceName), startOfRace);
}
}
@@ -1,5 +1,8 @@
package com.sap.sailing.server.gateway.jaxrs.api;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import javax.ws.rs.GET;
@@ -107,6 +110,50 @@ public class AnniversaryListResource extends AbstractSailingServerResource {
}
return getJsonResponse(json);
}
@GET
@Produces(CONTENT_TYPE_JSON_UTF8)
@Path("fullRacelist")
public Response fullRaceList() {
JSONArray json = new JSONArray();
HashMap<RegattaAndRaceIdentifier, SimpleAnniversaryRaceInfo> store = new HashMap<>();
getService().getRemoteRaceList(store );
for (Event event : getService().getAllEvents()) {
for (LeaderboardGroup group : event.getLeaderboardGroups()) {
for (Leaderboard leaderboard : group.getLeaderboards()) {
for (RaceColumn race : leaderboard.getRaceColumns()) {
for (Fleet fleet : race.getFleets()) {
TrackedRace trackedRace = race.getTrackedRace(fleet);
if (trackedRace != null) {
RegattaAndRaceIdentifier raceIdentifier = trackedRace.getRaceIdentifier();
SimpleAnniversaryRaceInfo raceInfo = new SimpleAnniversaryRaceInfo(raceIdentifier,
trackedRace.getStartOfRace().asDate());
store.put(raceInfo.getIdentifier(), raceInfo);
}
}
}
}
}
}
ArrayList<SimpleAnniversaryRaceInfo> sorted = new ArrayList<>(store.values());
Collections.sort(sorted,new Comparator<SimpleAnniversaryRaceInfo>() {
@Override
public int compare(SimpleAnniversaryRaceInfo o1, SimpleAnniversaryRaceInfo o2) {
return o1.getStartOfRace().compareTo(o2.getStartOfRace());
}
});
for (int i = 0;i<sorted.size();i++) {
SimpleAnniversaryRaceInfo current = sorted.get(i);
JSONArray single = new JSONArray();
single.add(String.valueOf(i));
single.add(simpleAnniversaryRaceListJsonSerializer.serialize(current));
json.add(single);
}
return getJsonResponse(json);
}
private Response getJsonResponse(JSONAware json) {
return Response.ok(json.toJSONString()).header(HEADER_NAME_CONTENT_TYPE, CONTENT_TYPE_JSON_UTF8).build();
@@ -23,7 +23,7 @@ public abstract class RacingEventServiceImplMock extends RacingEventServiceImpl
private DataImportLockWithProgress lock;
public RacingEventServiceImplMock() {
super(/* clearPersistentCompetitorStore */ false, null, /* restoreTrackedRaces */ false);
super(/* clearPersistentCompetitorStore */ false, null, /* restoreTrackedRaces */ false,null);
}
public RacingEventServiceImplMock(DataImportProgressImpl dataImportProgressImpl, TypeBasedServiceFinderFactory serviceFinderFactory) {
@@ -7,6 +7,7 @@ import java.net.SocketException;
import java.net.URI;
import java.net.URL;
import java.util.ConcurrentModificationException;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@@ -19,6 +20,7 @@ import com.sap.sailing.domain.abstractlog.race.RaceLog;
import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver;
import com.sap.sailing.domain.abstractlog.regatta.RegattaLog;
import com.sap.sailing.domain.anniversary.SimpleAnniversaryRaceInfo;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CompetitorStore;
import com.sap.sailing.domain.base.CourseArea;
@@ -682,4 +684,6 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch
* @return a map of {@link Statistics statistic objects} keyed be the year they are representing
*/
Map<Integer, Statistics> getOverallStatisticsByYear();
void getRemoteRaceList(HashMap<RegattaAndRaceIdentifier, SimpleAnniversaryRaceInfo> store);
}
@@ -1,116 +1,143 @@
package com.sap.sailing.server.anniversary;
import java.util.Collection;
import java.util.HashMap;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import com.sap.sailing.domain.anniversary.AnniversaryRaceInfo;
import com.sap.sailing.domain.anniversary.SimpleAnniversaryRaceInfo;
import com.sap.sailing.domain.base.Event;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.base.RemoteSailingServerReference;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.server.RacingEventService;
//import java.util.Collection;
//import java.util.HashMap;
//import java.util.concurrent.CopyOnWriteArraySet;
//import java.util.concurrent.ScheduledExecutorService;
//import java.util.concurrent.TimeUnit;
//import java.util.logging.Logger;
//
//import com.sap.sailing.domain.anniversary.AnniversaryConflictResolver;
//import com.sap.sailing.domain.anniversary.AnniversaryRaceInfo;
//import com.sap.sailing.domain.anniversary.SimpleAnniversaryRaceInfo;
//import com.sap.sailing.domain.base.Event;
//import com.sap.sailing.domain.base.Fleet;
//import com.sap.sailing.domain.base.RaceColumn;
//import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
//import com.sap.sailing.domain.leaderboard.Leaderboard;
//import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
//import com.sap.sailing.domain.tracking.TrackedRace;
//import com.sap.sailing.server.RacingEventService;
//
public class AnniversaryCalculator implements Runnable {
private static final long INITIAL_DELAY = 1000;
private static final long DELAY = 50000;
// private static final Logger logger = Logger.getLogger(AnniversaryCalculator.class.getName());
// private static final long INITIAL_DELAY = 1000;
// private static final long DELAY = 50000;
private RacingEventService racingEventService;
private int lastAmount = -1;
private CopyOnWriteArraySet<ChangeListener> listeners = new CopyOnWriteArraySet<>();
// private int lastAmount = -1;
// // keep in memory, to ensure, that a offline going remoteservers races are still considered
// HashMap<RegattaAndRaceIdentifier, SimpleAnniversaryRaceInfo> store = new HashMap<>();
//
// private CopyOnWriteArraySet<ChangeListener> listeners = new CopyOnWriteArraySet<>();
// private AnniversaryConflictResolver resolver = new AnniversaryConflictResolver();
//
interface ChangeListener {
void onChange(Collection<SimpleAnniversaryRaceInfo> collection);
void setAnniversaryCalculator(AnniversaryCalculator anniversaryCalculator);
}
//
public AnniversaryCalculator(ScheduledExecutorService scheduledExecutorService) {
scheduledExecutorService.scheduleWithFixedDelay(this, INITIAL_DELAY, DELAY, TimeUnit.MILLISECONDS);
// scheduledExecutorService.scheduleWithFixedDelay(this, INITIAL_DELAY, DELAY, TimeUnit.MILLISECONDS);
}
//
public void addListener(ChangeListener listener) {
listener.setAnniversaryCalculator(this);
listeners.add(listener);
// listener.setAnniversaryCalculator(this);
// listeners.add(listener);
}
public void removeListener(ChangeListener listener) {
listener.setAnniversaryCalculator(null);
listeners.remove(listener);
}
//
// public void removeListener(ChangeListener listener) {
// listener.setAnniversaryCalculator(null);
// listeners.remove(listener);
// }
//
@Override
public void run() {
if (racingEventService == null || listeners.isEmpty()) {
return;
}
HashMap<RegattaAndRaceIdentifier, SimpleAnniversaryRaceInfo> store = new HashMap<>();
getLocalResults(store);
getRemoteData(store);
// add remotes with resolver checking
if (lastAmount < store.size()) {
for (ChangeListener listener : listeners) {
listener.onChange(store.values());
}
}
// try {
// if (racingEventService == null || listeners.isEmpty()) {
// return;
// }
// racingEventService.getRemoteRaceList(store);
// getLocalResults(store);
//
// // add remotes with resolver checking
// for (ChangeListener listener : listeners) {
// listener.onChange(store.values());
// }
// } catch (Exception e) {
// logger.warning("Could not update anniversaries! ");
// e.printStackTrace();
// }
}
private void getRemoteData(HashMap<RegattaAndRaceIdentifier, SimpleAnniversaryRaceInfo> store) {
Iterable<RemoteSailingServerReference> remotes = racingEventService.getLiveRemoteServerReferences();
for(RemoteSailingServerReference remote:remotes){
//do call
}
}
private void getLocalResults(HashMap<RegattaAndRaceIdentifier, SimpleAnniversaryRaceInfo> store) {
for (Event event : racingEventService.getAllEvents()) {
for (LeaderboardGroup group : event.getLeaderboardGroups()) {
for (Leaderboard leaderboard : group.getLeaderboards()) {
for (RaceColumn race : leaderboard.getRaceColumns()) {
for (Fleet fleet : race.getFleets()) {
TrackedRace trackedRace = race.getTrackedRace(fleet);
if (trackedRace != null) {
RegattaAndRaceIdentifier raceIdentifier = trackedRace.getRaceIdentifier();
store.put(raceIdentifier, new SimpleAnniversaryRaceInfo(raceIdentifier, trackedRace.getStartOfRace().asDate()));
}
}
}
}
}
}
}
//
// private void getLocalResults(HashMap<RegattaAndRaceIdentifier, SimpleAnniversaryRaceInfo> store) {
// for (Event event : racingEventService.getAllEvents()) {
// for (LeaderboardGroup group : event.getLeaderboardGroups()) {
// for (Leaderboard leaderboard : group.getLeaderboards()) {
// for (RaceColumn race : leaderboard.getRaceColumns()) {
// for (Fleet fleet : race.getFleets()) {
// TrackedRace trackedRace = race.getTrackedRace(fleet);
// if (trackedRace != null) {
// RegattaAndRaceIdentifier raceIdentifier = trackedRace.getRaceIdentifier();
// store.put(raceIdentifier, new SimpleAnniversaryRaceInfo(raceIdentifier,
// trackedRace.getStartOfRace().asDate()));
// }
// }
// }
// }
// }
// }
// }
//
public void setRacingEventService(RacingEventService racingEventService) {
this.racingEventService = racingEventService;
}
public AnniversaryRaceInfo getFullAnniversaryDataLocal(SimpleAnniversaryRaceInfo simpleAnniversaryRaceInfo) {
DynamicTrackedRace trackedRace = racingEventService.getTrackedRace(simpleAnniversaryRaceInfo.getIdentifier());
//TODO loop all find best matching with conflict resolver
return null;
}
private AnniversaryRaceInfo getFullAnniversaryDataRemote(SimpleAnniversaryRaceInfo simpleAnniversaryRaceInfo) {
// TODO read data from remote server sync
return null;
}
public AnniversaryRaceInfo getFullAnniversaryData(SimpleAnniversaryRaceInfo simpleAnniversaryRaceInfo) {
if(simpleAnniversaryRaceInfo.getRemoteName() == null){
return getFullAnniversaryDataLocal(simpleAnniversaryRaceInfo);
}else{
return getFullAnniversaryDataRemote(simpleAnniversaryRaceInfo);
}
}
//
// public AnniversaryRaceInfo getFullAnniversaryDataLocal(SimpleAnniversaryRaceInfo simpleAnniversaryRaceInfo) {
// AnniversaryRaceInfo match = null;
// for (Event event : racingEventService.getAllEvents()) {
// for (LeaderboardGroup group : event.getLeaderboardGroups()) {
// for (Leaderboard leaderboard : group.getLeaderboards()) {
// for (RaceColumn race : leaderboard.getRaceColumns()) {
// for (Fleet fleet : race.getFleets()) {
// TrackedRace trackedRace = race.getTrackedRace(fleet);
// if (trackedRace != null) {
// RegattaAndRaceIdentifier raceIdentifier = trackedRace.getRaceIdentifier();
// if (raceIdentifier.equals(simpleAnniversaryRaceInfo.getIdentifier())) {
// AnniversaryRaceInfo newMatch = new AnniversaryRaceInfo(raceIdentifier,
// leaderboard.getName(), trackedRace.getStartOfRace().asDate(),
// event.getId());
// if (match == null) {
// match = newMatch;
// } else {
// match = resolver.resolve(match, newMatch);
// }
// }
// }
// }
// }
// }
// }
// }
// return match;
// }
//
// private AnniversaryRaceInfo getFullAnniversaryDataRemote(SimpleAnniversaryRaceInfo simpleAnniversaryRaceInfo) {
// // TODO read data from remote server sync
// return null;
// }
//
// public AnniversaryRaceInfo getFullAnniversaryData(SimpleAnniversaryRaceInfo simpleAnniversaryRaceInfo) {
// if (simpleAnniversaryRaceInfo.getRemoteName() == null) {
// return getFullAnniversaryDataLocal(simpleAnniversaryRaceInfo);
// } else {
// return getFullAnniversaryDataRemote(simpleAnniversaryRaceInfo);
// }
// }
}
@@ -1,79 +1,73 @@
package com.sap.sailing.server.anniversary;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import com.sap.sailing.domain.anniversary.AnniversaryRaceInfo;
import com.sap.sailing.domain.anniversary.SimpleAnniversaryRaceInfo;
import com.sap.sailing.domain.persistence.MongoObjectFactory;
import com.sap.sailing.server.anniversary.AnniversaryCalculator.ChangeListener;
public class AnniversaryDeterminator implements ChangeListener {
private static int[] anniversaries = new int[] { 10, 25, 50, 75 };
ConcurrentHashMap<Integer, AnniversaryRaceInfo> knownAnniversaries = new ConcurrentHashMap<>();
private MongoObjectFactory mongoObjectFactory;
// private static int[] anniversaries = new int[] { 10, 25, 50, 75 };
// ConcurrentHashMap<Integer, AnniversaryRaceInfo> knownAnniversaries = new ConcurrentHashMap<>();
// private MongoObjectFactory mongoObjectFactory;
private AnniversaryCalculator anniversaryCalculator;
//
public AnniversaryDeterminator(MongoObjectFactory mongoObjectFactory) {
this.mongoObjectFactory = mongoObjectFactory;
knownAnniversaries.putAll(mongoObjectFactory.getAnniversaryData());
// this.mongoObjectFactory = mongoObjectFactory;
// knownAnniversaries.putAll(mongoObjectFactory.getAnniversaryData());
}
//
@Override
public void onChange(Collection<SimpleAnniversaryRaceInfo> collection) {
ArrayList<SimpleAnniversaryRaceInfo> allRaces = new ArrayList<>(collection);
Collections.sort(allRaces, new Comparator<SimpleAnniversaryRaceInfo>() {
@Override
public int compare(SimpleAnniversaryRaceInfo o1, SimpleAnniversaryRaceInfo o2) {
return o1.getStartOfRace().compareTo(o2.getStartOfRace());
}
});
boolean requiresPersist = checkForAnnivesaries(allRaces);
if(requiresPersist){
mongoObjectFactory.storeAnniversaryData(knownAnniversaries);
}
// ArrayList<SimpleAnniversaryRaceInfo> allRaces = new ArrayList<>(collection);
// Collections.sort(allRaces, new Comparator<SimpleAnniversaryRaceInfo>() {
//
// @Override
// public int compare(SimpleAnniversaryRaceInfo o1, SimpleAnniversaryRaceInfo o2) {
// return o1.getStartOfRace().compareTo(o2.getStartOfRace());
// }
// });
// boolean requiresPersist = checkForAnnivesaries(allRaces);
// if(requiresPersist){
// mongoObjectFactory.storeAnniversaryData(knownAnniversaries);
// }
}
private boolean checkForAnnivesaries(List<SimpleAnniversaryRaceInfo> collection) {
int newAmount = collection.size();
int factor = 1;
boolean requiresPersist = false;
while (true) {
for (int anniversary : anniversaries) {
int anniversaryToCheck = anniversary * factor;
if (anniversaryToCheck > newAmount) {
return requiresPersist;
}
if (newAmount > anniversaryToCheck) {
boolean requiresPersistSingle = onAnniversaryTraverse(anniversaryToCheck, collection.get(anniversaryToCheck));
if(requiresPersistSingle){
requiresPersist = true;
}
}
}
}
}
private boolean onAnniversaryTraverse(int anniversaryToCheck, SimpleAnniversaryRaceInfo simpleAnniversaryRaceInfo) {
AnniversaryRaceInfo knownAnniversary = knownAnniversaries.get(anniversaryToCheck);
if (knownAnniversary != null) {
System.out.println("Skipping anniversary " + anniversaryToCheck + " as it is already known");
return false;
} else {
System.out.println("New anniversary " + anniversaryToCheck + " " + simpleAnniversaryRaceInfo);
AnniversaryRaceInfo fullData = anniversaryCalculator.getFullAnniversaryData(simpleAnniversaryRaceInfo);
//get remote info here! how to do this?
knownAnniversaries.put(anniversaryToCheck, fullData);
return true;
}
}
//
// private boolean checkForAnnivesaries(List<SimpleAnniversaryRaceInfo> collection) {
// int newAmount = collection.size();
// int factor = 1;
// boolean requiresPersist = false;
// while (true) {
// for (int anniversary : anniversaries) {
// int anniversaryToCheck = anniversary * factor;
// if (anniversaryToCheck > newAmount) {
// return requiresPersist;
// }
// if (newAmount > anniversaryToCheck) {
// boolean requiresPersistSingle = onAnniversaryTraverse(anniversaryToCheck, collection.get(anniversaryToCheck));
// if(requiresPersistSingle){
// requiresPersist = true;
// }
// }
// }
// }
// }
//
// private boolean onAnniversaryTraverse(int anniversaryToCheck, SimpleAnniversaryRaceInfo simpleAnniversaryRaceInfo) {
// AnniversaryRaceInfo knownAnniversary = knownAnniversaries.get(anniversaryToCheck);
// if (knownAnniversary != null) {
// System.out.println("Skipping anniversary " + anniversaryToCheck + " as it is already known");
// return false;
// } else {
// System.out.println("New anniversary " + anniversaryToCheck + " " + simpleAnniversaryRaceInfo);
// AnniversaryRaceInfo fullData = anniversaryCalculator.getFullAnniversaryData(simpleAnniversaryRaceInfo);
// //get remote info here! how to do this?
// knownAnniversaries.put(anniversaryToCheck, fullData);
// return true;
// }
// }
//
//
@Override
public void setAnniversaryCalculator(AnniversaryCalculator anniversaryCalculator) {
this.anniversaryCalculator = anniversaryCalculator;
@@ -36,6 +36,8 @@ import com.sap.sailing.domain.tracking.TrackedRegattaListener;
import com.sap.sailing.server.MasterDataImportClassLoaderService;
import com.sap.sailing.server.RacingEventService;
import com.sap.sailing.server.RacingEventServiceMXBean;
import com.sap.sailing.server.anniversary.AnniversaryCalculator;
import com.sap.sailing.server.anniversary.AnniversaryDeterminator;
import com.sap.sailing.server.impl.preferences.model.BoatClassNotificationPreferences;
import com.sap.sailing.server.impl.preferences.model.CompetitorNotificationPreferences;
import com.sap.sailing.server.notification.impl.SailingNotificationServiceImpl;
@@ -51,6 +53,7 @@ import com.sap.sse.replication.Replicable;
import com.sap.sse.security.PreferenceConverter;
import com.sap.sse.util.ClearStateTestSupport;
import com.sap.sse.util.ServiceTrackerFactory;
import com.sap.sse.util.ThreadPoolUtil;
public class Activator implements BundleActivator {
@@ -58,6 +58,7 @@ import com.sap.sailing.domain.abstractlog.race.state.ReadonlyRaceState;
import com.sap.sailing.domain.abstractlog.race.state.impl.RaceStateImpl;
import com.sap.sailing.domain.abstractlog.race.state.impl.ReadonlyRaceStateImpl;
import com.sap.sailing.domain.abstractlog.regatta.RegattaLog;
import com.sap.sailing.domain.anniversary.SimpleAnniversaryRaceInfo;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CompetitorStore;
import com.sap.sailing.domain.base.CompetitorStore.CompetitorUpdateListener;
@@ -485,7 +486,7 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes
* compatibility with prior releases that did not support a persistent competitor collection.
*/
public RacingEventServiceImpl() {
this(/* clearPersistentCompetitorStore */ true, /* serviceFinderFactory */ null, /* restoreTrackedRaces */ false);
this(/* clearPersistentCompetitorStore */ true, /* serviceFinderFactory */ null, /* restoreTrackedRaces */ false,null);
}
public RacingEventServiceImpl(WindStore windStore, SensorFixStore sensorFixStore,
@@ -498,8 +499,8 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes
this.bundleContext = bundleContext;
}
public RacingEventServiceImpl(boolean clearPersistentCompetitorStore, final TypeBasedServiceFinderFactory serviceFinderFactory, boolean restoreTrackedRaces) {
this(clearPersistentCompetitorStore, serviceFinderFactory, null, /* sailingNotificationService */ null, /* trackedRaceStatisticsCache */ null, restoreTrackedRaces);
public RacingEventServiceImpl(boolean clearPersistentCompetitorStore, final TypeBasedServiceFinderFactory serviceFinderFactory, boolean restoreTrackedRaces,AnniversaryCalculator anniversaryCalculator) {
this(clearPersistentCompetitorStore, serviceFinderFactory, null, /* sailingNotificationService */ null, /* trackedRaceStatisticsCache */ null, restoreTrackedRaces, anniversaryCalculator);
}
/**
@@ -3820,4 +3821,16 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes
statisticsAggregators.forEach((year, aggregator) -> result.put(year, aggregator.getStatistics()));
return result;
}
@Override
public void getRemoteRaceList(HashMap<RegattaAndRaceIdentifier, SimpleAnniversaryRaceInfo> store) {
for(Entry<RemoteSailingServerReference, Pair<Iterable<SimpleAnniversaryRaceInfo>, Exception>> race:remoteSailingServerSet.getCachedRaceList().entrySet()){
if(race.getValue().getB() != null){
throw new RuntimeException("Some remoteserver did not respond " + race.getKey());
}
for(SimpleAnniversaryRaceInfo raceinfo:race.getValue().getA()){
store.put(raceinfo.getIdentifier(), raceinfo);
}
}
}
}
@@ -26,6 +26,7 @@ import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import com.sap.sailing.domain.anniversary.SimpleAnniversaryRaceInfo;
import com.sap.sailing.domain.base.DomainFactory;
import com.sap.sailing.domain.base.EventBase;
import com.sap.sailing.domain.base.RemoteSailingServerReference;
@@ -36,6 +37,7 @@ import com.sap.sailing.server.gateway.deserialization.impl.LeaderboardGroupBaseJ
import com.sap.sailing.server.gateway.deserialization.impl.StatisticsByYearJsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.StatisticsJsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.VenueJsonDeserializer;
import com.sap.sailing.server.gateway.serialization.impl.SimpleAnniversaryRaceInfoJsonSerializer;
import com.sap.sse.common.Util;
import com.sap.sse.common.Util.Pair;
import com.sap.sse.concurrent.LockUtil;
@@ -64,6 +66,8 @@ public class RemoteSailingServerSet {
private final ConcurrentMap<RemoteSailingServerReference, Util.Pair<Iterable<EventBase>, Exception>> cachedEventsForRemoteSailingServers;
private final ConcurrentMap<RemoteSailingServerReference, Util.Pair<Map<Integer, Statistics>, Exception>> cachedStatisticsByYearForRemoteSailingServers;
private final ConcurrentMap<RemoteSailingServerReference, Util.Pair<Iterable<SimpleAnniversaryRaceInfo>, Exception>> cachedSimpleAnniversaryForRemoteSailingServers;
/**
* @param scheduler
@@ -73,6 +77,7 @@ public class RemoteSailingServerSet {
remoteSailingServers = new ConcurrentHashMap<>();
cachedEventsForRemoteSailingServers = new ConcurrentHashMap<>();
cachedStatisticsByYearForRemoteSailingServers = new ConcurrentHashMap<>();
cachedSimpleAnniversaryForRemoteSailingServers= new ConcurrentHashMap<>();
scheduler.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
@@ -86,6 +91,7 @@ public class RemoteSailingServerSet {
remoteSailingServers.clear();
cachedEventsForRemoteSailingServers.clear();
cachedStatisticsByYearForRemoteSailingServers.clear();
cachedSimpleAnniversaryForRemoteSailingServers.clear();
});
}
@@ -116,6 +122,52 @@ public class RemoteSailingServerSet {
new Thread(() -> updateRemoteServerEventCacheSynchronously(ref), "Event Cache Updater for remote server " + ref).start();
new Thread(() -> updateRemoteServerStatisticsCacheSynchronously(ref),
"Statistics by year Cache Updater for remote server " + ref).start();
new Thread(() -> updateRemoteServerAnniversaryCacheSynchronously(ref), "Anniversary Cache Updater for remote server " + ref).start();
}
private void updateRemoteServerAnniversaryCacheSynchronously(RemoteSailingServerReference ref) {
BufferedReader bufferedReader = null;
Util.Pair<Iterable<SimpleAnniversaryRaceInfo>, Exception> result;
try {
try {
final URL raceListURL = getRaceListURL(ref.getURL());
logger.fine("Updating racelist for remote server " + ref + " from URL " + raceListURL);
URLConnection urlConnection = HttpUrlConnectionHelper.redirectConnection(raceListURL);
bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "UTF-8"));
JSONParser parser = new JSONParser();
Object eventsAsObject = parser.parse(bufferedReader);
SimpleAnniversaryRaceInfoJsonSerializer deserializer = new SimpleAnniversaryRaceInfoJsonSerializer();
JSONArray eventsAsJsonArray = (JSONArray) eventsAsObject;
final Set<SimpleAnniversaryRaceInfo> events = new HashSet<>();
for (Object eventAsObject : eventsAsJsonArray) {
JSONObject eventAsJson = (JSONObject) eventAsObject;
SimpleAnniversaryRaceInfo event = deserializer.deserialize(eventAsJson);
events.add(event);
}
result = new Util.Pair<Iterable<SimpleAnniversaryRaceInfo>, Exception>(events, /* exception */ null);
} finally {
if (bufferedReader != null) {
bufferedReader.close();
}
}
} catch (IOException | ParseException e) {
logger.log(Level.INFO, "Exception trying to fetch events from remote server " + ref + ": " + e.getMessage(),
e);
result = new Util.Pair<Iterable<SimpleAnniversaryRaceInfo>, Exception>(/* events */ null, e);
}
final Pair<Iterable<SimpleAnniversaryRaceInfo>, Exception> finalResult = result;
LockUtil.executeWithWriteLock(lock, () -> {
// check that the server was not removed while no lock was held
if (remoteSailingServers.containsValue(ref)) {
cachedSimpleAnniversaryForRemoteSailingServers.put(ref, finalResult);
} else {
logger.fine("Omitted update for " + ref + " as it was removed");
}
});
}
private URL getRaceListURL(URL remoteServerBaseURL) throws MalformedURLException {
return getURL(remoteServerBaseURL, "sailingserver/api/v1/anniversary/races");
}
private Util.Pair<Iterable<EventBase>, Exception> updateRemoteServerEventCacheSynchronously(
@@ -289,4 +341,13 @@ public class RemoteSailingServerSet {
LockUtil.unlockAfterRead(lock);
}
}
public Map<RemoteSailingServerReference, Pair<Iterable<SimpleAnniversaryRaceInfo>, Exception>> getCachedRaceList() {
LockUtil.lockForRead(lock);
try {
return Collections.unmodifiableMap(cachedSimpleAnniversaryForRemoteSailingServers);
} finally {
LockUtil.unlockAfterRead(lock);
}
}
}