initial storeage impl for anniversaries to mongodb

This commit is contained in:
Kai Boernert committed 2017-07-31 14:18:04 +02:00
1 parent bfad7d0869
commit 390b240042
8 files changed
+354 -204

No files matched your search

@@ -2,9 +2,11 @@ package com.sap.sailing.domain.persistence;
import java.io.Serializable;
import java.net.URL;
import java.util.Map;
import com.mongodb.DB;
import com.mongodb.DBObject;
import com.sap.sailing.domain.anniversary.AnniversaryRaceInfo;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Event;
import com.sap.sailing.domain.base.RaceDefinition;
@@ -181,4 +183,8 @@ public interface MongoObjectFactory {
* objects obtained through {@link DomainObjectFactory#loadConnectivityParametersForRacesToRestore(Consumer<RaceTrackingConnectivityParameter>)}.
*/
void removeAllConnectivityParametersForRacesToRestore();
void storeAnniversaryData(Map<Integer, AnniversaryRaceInfo> data);
Map<Integer, AnniversaryRaceInfo> getAnniversaryData();
}
@@ -107,4 +107,9 @@ public enum CollectionNames {
* way by corresponding implementations of the RaceTrackingConnectivityParametersMongoHandler} interface.
*/
CONNECTIVITY_PARAMS_FOR_RACES_TO_BE_RESTORED,
/**
* Contains the known anniversaries
*/
ANNIVERSARIES
}
@@ -40,6 +40,7 @@ Export-Package: com.sap.sailing.domain.abstractlog,
com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl,
com.sap.sailing.domain.abstractlog.shared.analyzing,
com.sap.sailing.domain.abstractlog.shared.events,
com.sap.sailing.domain.anniversary,
com.sap.sailing.domain.base,
com.sap.sailing.domain.base.configuration,
com.sap.sailing.domain.base.configuration.impl,
@@ -6,8 +6,11 @@ import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
public class AnniversaryRaceInfo {
public AnniversaryRaceInfo(RegattaAndRaceIdentifier identifier, String leaderboardName, Date startOfRace,
String eventID,String remoteUrl) {
String eventID, String remoteUrl) {
super();
if(identifier == null || leaderboardName == null || startOfRace == null || eventID==null||remoteUrl==null){
throw new IllegalStateException("Anniversary Data is not allowed to contain any null values!");
}
this.identifier = identifier;
this.leaderboardName = leaderboardName;
this.startOfRace = startOfRace;
@@ -36,4 +39,14 @@ public class AnniversaryRaceInfo {
public String getEventID() {
return eventID;
}
public String getRemoteUrl() {
return remoteUrl;
}
@Override
public String toString() {
return "AnniversaryRaceInfo [identifier=" + identifier + ", leaderboardName=" + leaderboardName
+ ", startOfRace=" + startOfRace + ", eventID=" + eventID + ", remoteUrl=" + remoteUrl + "]";
}
}
@@ -19,7 +19,7 @@ import com.sap.sailing.server.RacingEventService;
public class AnniversaryCalculator implements Runnable {
private static final long INITIAL_DELAY = 1000;
private static final long DELAY = 5000;
private static final long DELAY = 50000;
private RacingEventService racingEventService;
private AnniversaryConflictResolver resolver = new AnniversaryConflictResolver();
private int lastAmount = -1;
@@ -68,7 +68,7 @@ public class AnniversaryCalculator implements Runnable {
AnniversaryRaceInfo current = anniversaryRaceList.get(raceIdentifier);
AnniversaryRaceInfo raceInfo = new AnniversaryRaceInfo(raceIdentifier,
leaderboard.getName(), trackedRace.getStartOfRace().asDate(),
event.getId().toString(),null);
event.getId().toString(),"todo remoteurl");
if(current == null){
anniversaryRaceList.put(raceIdentifier, raceInfo);
}else{
@@ -5,66 +5,67 @@ import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import com.sap.sailing.domain.anniversary.AnniversaryRaceInfo;
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};
private static int[] anniversaries = new int[] { 10, 25, 50, 75 };
ConcurrentHashMap<Integer, AnniversaryRaceInfo> knownAnniversaries = new ConcurrentHashMap<>();
private MongoObjectFactory mongoObjectFactory;
public AnniversaryDeterminator() {
knownAnniversaries.putAll(load());
public AnniversaryDeterminator(MongoObjectFactory mongoObjectFactory) {
this.mongoObjectFactory = mongoObjectFactory;
knownAnniversaries.putAll(mongoObjectFactory.getAnniversaryData());
}
@Override
public void onChange(Collection<AnniversaryRaceInfo> collection) {
ArrayList<AnniversaryRaceInfo> allRaces = new ArrayList<>(collection);
Collections.sort(allRaces,new Comparator<AnniversaryRaceInfo>() {
Collections.sort(allRaces, new Comparator<AnniversaryRaceInfo>() {
@Override
public int compare(AnniversaryRaceInfo o1, AnniversaryRaceInfo o2) {
return o1.getStartOfRace().compareTo(o2.getStartOfRace());
}
});
checkForAnnivesaries(allRaces);
}
private void checkForAnnivesaries(List<AnniversaryRaceInfo> collection) {
int newAmount = collection.size();
int factor = 1;
while(true){
for(int anniversary:anniversaries){
int anniversaryToCheck = anniversary*factor;
if(anniversaryToCheck > newAmount){
return;
}
if(newAmount<anniversaryToCheck){
onAnniversaryTraverse(anniversaryToCheck,collection.get(anniversaryToCheck));
}
}
}
}
private void onAnniversaryTraverse(int anniversaryToCheck, AnniversaryRaceInfo anniversaryRaceInfo) {
AnniversaryRaceInfo knownAnniversary = knownAnniversaries.get(anniversaryToCheck);
if(knownAnniversary != null){
System.out.println("Skipping anniversary " + anniversaryToCheck + " as it is already known");
}else{
System.out.println("New anniversary " + anniversaryToCheck + " " + anniversaryRaceInfo);
knownAnniversaries.put(anniversaryToCheck, anniversaryRaceInfo);
persist();
boolean requiresPersist = checkForAnnivesaries(allRaces);
if(requiresPersist){
mongoObjectFactory.storeAnniversaryData(knownAnniversaries);
}
}
private void persist() {
// TODO Auto-generated method stub
private boolean checkForAnnivesaries(List<AnniversaryRaceInfo> 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 Map<Integer, AnniversaryRaceInfo> load() {
return Collections.emptyMap();
private boolean onAnniversaryTraverse(int anniversaryToCheck, AnniversaryRaceInfo anniversaryRaceInfo) {
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 + " " + anniversaryRaceInfo);
knownAnniversaries.put(anniversaryToCheck, anniversaryRaceInfo);
return true;
}
}
}
@@ -117,7 +117,7 @@ public class Activator implements BundleActivator {
racingEventService = new RacingEventServiceImpl(clearPersistentCompetitors, serviceFinderFactory,
trackedRegattaListener, notificationService, restoreTrackedRaces,anniversaryCalculator);
notificationService.setRacingEventService(racingEventService);
anniversaryCalculator.addListener(new AnniversaryDeterminator());
anniversaryCalculator.addListener(new AnniversaryDeterminator(racingEventService.getMongoObjectFactory()));
anniversaryCalculator.setRacingEventService(racingEventService);
masterDataImportClassLoaderServiceTracker = new ServiceTracker<MasterDataImportClassLoaderService, MasterDataImportClassLoaderService>(