Merge remote-tracking branch 'origin/master' into newhome

Conflicts:
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LeaderboardEntryPoint.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/EventDTO.java
	java/com.sap.sse.gwt/META-INF/MANIFEST.MF
This commit is contained in:
fmittag committed 2014-06-04 16:19:04 +02:00
commit a9bcaa5146
613 files changed
+33834 -3059

No files matched your search

@@ -22,7 +22,8 @@ Require-Bundle: com.sap.sailing.domain,
com.sap.sailing.udpconnector,
com.sap.sailing.operationaltransformation,
com.sap.sailing.domain.shared.android,
com.sap.sailing.server.gateway.serialization
com.sap.sailing.server.gateway.serialization,
com.sap.sse.common
Bundle-ClassPath: .
Export-Package: com.sap.sailing.server,
com.sap.sailing.server.impl;
@@ -0,0 +1,10 @@
package com.sap.sailing.server;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sse.common.search.Hit;
public interface LeaderboardSearchResult extends Hit {
Regatta getRegatta();
Leaderboard getLeaderboard();
}
@@ -39,8 +39,6 @@ import com.sap.sailing.domain.common.RegattaIdentifier;
import com.sap.sailing.domain.common.RegattaName;
import com.sap.sailing.domain.common.ScoringSchemeType;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.common.impl.Util.Triple;
import com.sap.sailing.domain.common.media.MediaTrack;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.domain.common.racelog.tracking.TypeBasedServiceFinderFactory;
@@ -67,6 +65,10 @@ import com.sap.sailing.domain.tracking.TrackedRegattaRegistry;
import com.sap.sailing.domain.tracking.TrackerManager;
import com.sap.sailing.domain.tracking.WindStore;
import com.sap.sailing.server.masterdata.DataImportLockWithProgress;
import com.sap.sse.common.Util;
import com.sap.sse.common.Util.Triple;
import com.sap.sse.common.search.KeywordQuery;
import com.sap.sse.common.search.Result;
/**
* An OSGi service that can be used to track boat races using a TracTrac connector that pushes
@@ -157,7 +159,7 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch
* comment where a wind tracker may provide information such as its type name or, if applicable,
* connectivity information such as the network port on which it receives wind information.
*/
Iterable<Triple<Regatta, RaceDefinition, String>> getWindTrackedRaces();
Iterable<Util.Triple<Regatta, RaceDefinition, String>> getWindTrackedRaces();
/**
* Creates a new leaderboard with the <code>name</code> specified.
@@ -384,11 +386,11 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch
/**
* @return a thread-safe copy of the events (or the exception that occurred trying to obtain the events; arranged in
* a {@link Pair}) of from all sailing server instances currently known by the service; it's safe for
* a {@link Util.Pair}) of from all sailing server instances currently known by the service; it's safe for
* callers to iterate over the iterable returned, and no risk of a {@link ConcurrentModificationException}
* exists
*/
Map<RemoteSailingServerReference, Pair<Iterable<EventBase>, Exception>> getPublicEventsOfAllSailingServers();
Map<RemoteSailingServerReference, Util.Pair<Iterable<EventBase>, Exception>> getPublicEventsOfAllSailingServers();
RemoteSailingServerReference addRemoteSailingServerReference(String name, URL url);
@@ -446,7 +448,7 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch
* @return a pair with the found or created regatta, and a boolean that tells whether the regatta was created during
* the call
*/
Pair<Regatta, Boolean> getOrCreateRegattaWithoutReplication(String baseRegattaName, String boatClassName, Serializable id,
Util.Pair<Regatta, Boolean> getOrCreateRegattaWithoutReplication(String baseRegattaName, String boatClassName, Serializable id,
Iterable<? extends Series> series, boolean persistent, ScoringScheme scoringScheme,
Serializable defaultCourseAreaId);
@@ -507,7 +509,7 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch
/**
* Gets the start time, pass identifier and racing procedure for the queried race. Start time might be <code>null</code>.
*/
Triple<TimePoint, Integer, RacingProcedureType> getStartTimeAndProcedure(String leaderboardName, String raceColumnName, String fleetName);
Util.Triple<TimePoint, Integer, RacingProcedureType> getStartTimeAndProcedure(String leaderboardName, String raceColumnName, String fleetName);
MongoObjectFactory getMongoObjectFactory();
@@ -551,5 +553,7 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch
* For the reference to a remote sailing server, updates its events cache and returns the event list
* or, if fetching the event list from the remote server did fail, the exception for which it failed.
*/
Pair<Iterable<EventBase>, Exception> updateRemoteServerEventCacheSynchronously(RemoteSailingServerReference ref);
Util.Pair<Iterable<EventBase>, Exception> updateRemoteServerEventCacheSynchronously(RemoteSailingServerReference ref);
Result<LeaderboardSearchResult> search(KeywordQuery query);
}
@@ -14,7 +14,6 @@ import org.osgi.framework.ServiceRegistration;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.common.impl.Util.Triple;
import com.sap.sailing.domain.common.racelog.tracking.TypeBasedServiceFinder;
import com.sap.sailing.domain.persistence.racelog.tracking.GPSFixMongoHandler;
import com.sap.sailing.domain.persistence.racelog.tracking.impl.GPSFixMongoHandlerImpl;
@@ -24,6 +23,7 @@ import com.sap.sailing.domain.tracking.impl.GPSFixMovingImpl;
import com.sap.sailing.server.RacingEventService;
import com.sap.sailing.server.racelog.tracking.CachedOsgiTypeBasedServiceFinderFactory;
import com.sap.sailing.server.test.support.RacingEventServiceWithTestSupport;
import com.sap.sse.common.Util;
public class Activator implements BundleActivator {
private static final Logger logger = Logger.getLogger(Activator.class.getName());
@@ -85,7 +85,7 @@ public class Activator implements BundleActivator {
serviceFinderFactory.close();
}
// stop the tracking of the wind and all races
for (Triple<Regatta, RaceDefinition, String> windTracker : racingEventService.getWindTrackedRaces()) {
for (Util.Triple<Regatta, RaceDefinition, String> windTracker : racingEventService.getWindTrackedRaces()) {
racingEventService.stopTrackingWind(windTracker.getA(), windTracker.getB());
}
for (Regatta regatta : racingEventService.getAllRegattas()) {
@@ -1,8 +1,8 @@
package com.sap.sailing.server.impl;
import com.sap.sailing.domain.base.CourseListener;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.RegattaNameAndRaceName;
@@ -0,0 +1,29 @@
package com.sap.sailing.server.impl;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.RegattaLeaderboard;
import com.sap.sailing.server.LeaderboardSearchResult;
public class LeaderboardSearchResultImpl implements LeaderboardSearchResult {
private final Leaderboard leaderboard;
public LeaderboardSearchResultImpl(Leaderboard leaderboard) {
this.leaderboard = leaderboard;
}
public Regatta getRegatta() {
final Regatta regatta;
if (leaderboard instanceof RegattaLeaderboard) {
regatta = ((RegattaLeaderboard) leaderboard).getRegatta();
} else {
regatta = null;
}
return regatta;
}
@Override
public Leaderboard getLeaderboard() {
return leaderboard;
}
}
@@ -5,6 +5,7 @@ import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.base.RaceColumnListener;
import com.sap.sailing.domain.leaderboard.ResultDiscardingRule;
import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.RaceLogEvent;
import com.sap.sailing.domain.racelog.RaceLogIdentifier;
import com.sap.sailing.domain.racelog.RaceLogIdentifierTemplateResolver;
@@ -11,8 +11,6 @@ import com.sap.sailing.domain.base.RaceColumnListener;
import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.domain.common.NoWindException;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.common.impl.Util.Triple;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.ResultDiscardingRule;
import com.sap.sailing.domain.racelog.RaceLog;
@@ -27,6 +25,7 @@ import com.sap.sailing.server.RacingEventServiceOperation;
import com.sap.sailing.server.operationaltransformation.UpdateLeaderboardMaxPointsReason;
import com.sap.sailing.server.operationaltransformation.UpdateLeaderboardScoreCorrection;
import com.sap.sailing.server.operationaltransformation.UpdateLeaderboardScoreCorrectionMetadata;
import com.sap.sse.common.Util;
public class RaceLogScoringReplicator implements RaceColumnListener {
@@ -127,7 +126,7 @@ public class RaceLogScoringReplicator implements RaceColumnListener {
int numberOfCompetitorsInLeaderboard = Util.size(leaderboard.getCompetitors());
int numberOfCompetitorsInRace;
List<Triple<Serializable, String, MaxPointsReason>> positioningList;
List<com.sap.sse.common.Util.Triple<Serializable, String, MaxPointsReason>> positioningList;
numberOfCompetitorsInRace = getNumberOfCompetitorsInRace(raceColumn, fleet, numberOfCompetitorsInLeaderboard);
@@ -142,7 +141,7 @@ public class RaceLogScoringReplicator implements RaceColumnListener {
}
if (positioningList != null) {
for (Triple<Serializable, String, MaxPointsReason> positionedCompetitor : positioningList) {
for (com.sap.sse.common.Util.Triple<Serializable, String, MaxPointsReason> positionedCompetitor : positioningList) {
Competitor competitor = service.getBaseDomainFactory().getExistingCompetitorById(positionedCompetitor.getA());
if (positionedCompetitor.getC().equals(MaxPointsReason.NONE)) {
@@ -166,7 +165,7 @@ public class RaceLogScoringReplicator implements RaceColumnListener {
}
private boolean setMaxPointsReasonInLeaderboardIfNecessary(Leaderboard leaderboard, RaceColumn raceColumn,
TimePoint timePoint, Triple<Serializable, String, MaxPointsReason> positionedCompetitor, Competitor competitor) {
TimePoint timePoint, com.sap.sse.common.Util.Triple<Serializable, String, MaxPointsReason> positionedCompetitor, Competitor competitor) {
boolean scoreHasBeenCorrected = false;
MaxPointsReason trackedMaxPointsReason = leaderboard.getMaxPointsReason(competitor, raceColumn, timePoint);
@@ -227,7 +226,7 @@ public class RaceLogScoringReplicator implements RaceColumnListener {
* @param positionedCompetitor the competitor whose rank shall be determined
* @return the rank of the given positionedCompetitor
*/
private int getRankInPositioningListByRaceCommittee(List<Triple<Serializable, String, MaxPointsReason>> positioningList, Triple<Serializable, String, MaxPointsReason> positionedCompetitor) {
private int getRankInPositioningListByRaceCommittee(List<com.sap.sse.common.Util.Triple<Serializable, String, MaxPointsReason>> positioningList, com.sap.sse.common.Util.Triple<Serializable, String, MaxPointsReason> positionedCompetitor) {
return positioningList.indexOf(positionedCompetitor) + 1; // indexOf gives the zero-based position requested competitor in the list, + 1 gives the one-based rank
}
@@ -71,9 +71,6 @@ import com.sap.sailing.domain.common.dto.FleetDTO;
import com.sap.sailing.domain.common.dto.RegattaCreationParametersDTO;
import com.sap.sailing.domain.common.dto.SeriesCreationParametersDTO;
import com.sap.sailing.domain.common.impl.DataImportProgressImpl;
import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.common.impl.Util.Triple;
import com.sap.sailing.domain.common.media.MediaTrack;
import com.sap.sailing.domain.common.media.MediaTrack.MimeType;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
@@ -136,6 +133,7 @@ import com.sap.sailing.operationaltransformation.Operation;
import com.sap.sailing.server.OperationExecutionListener;
import com.sap.sailing.server.RacingEventService;
import com.sap.sailing.server.RacingEventServiceOperation;
import com.sap.sailing.server.LeaderboardSearchResult;
import com.sap.sailing.server.Replicator;
import com.sap.sailing.server.masterdata.DataImportLockWithProgress;
import com.sap.sailing.server.operationaltransformation.AddCourseArea;
@@ -173,6 +171,9 @@ import com.sap.sailing.server.test.support.RacingEventServiceWithTestSupport;
import com.sap.sailing.util.BuildVersion;
import com.sap.sailing.util.impl.LockUtil;
import com.sap.sailing.util.impl.NamedReentrantReadWriteLock;
import com.sap.sse.common.Util;
import com.sap.sse.common.search.KeywordQuery;
import com.sap.sse.common.search.Result;
public class RacingEventServiceImpl implements RacingEventServiceWithTestSupport, RegattaListener, LeaderboardRegistry, Replicator {
private static final Logger logger = Logger.getLogger(RacingEventServiceImpl.class.getName());
@@ -869,8 +870,8 @@ public class RacingEventServiceImpl implements RacingEventServiceWithTestSupport
}
@Override
public Map<RemoteSailingServerReference, Pair<Iterable<EventBase>, Exception>> getPublicEventsOfAllSailingServers() {
return remoteSailingServerSet.getCachedEventsForRemoteSailingServers();
public Map<RemoteSailingServerReference, com.sap.sse.common.Util.Pair<Iterable<EventBase>, Exception>> getPublicEventsOfAllSailingServers() {
return remoteSailingServerSet.getCachedEventsForRemoteSailingServers(); // FIXME should probably add our own stuff here... Is it enough to pass on the remote reference URL to the client for leaderboard group URL construction?
}
@Override
@@ -882,7 +883,7 @@ public class RacingEventServiceImpl implements RacingEventServiceWithTestSupport
}
@Override
public Pair<Iterable<EventBase>, Exception> updateRemoteServerEventCacheSynchronously(RemoteSailingServerReference ref) {
public com.sap.sse.common.Util.Pair<Iterable<EventBase>, Exception> updateRemoteServerEventCacheSynchronously(RemoteSailingServerReference ref) {
return remoteSailingServerSet.getEventsOrException(ref);
}
@@ -950,7 +951,7 @@ public class RacingEventServiceImpl implements RacingEventServiceWithTestSupport
public Regatta createRegatta(String baseRegattaName, String boatClassName, Serializable id,
Iterable<? extends Series> series, boolean persistent, ScoringScheme scoringScheme,
Serializable defaultCourseAreaId) {
Pair<Regatta, Boolean> regattaWithCreatedFlag = getOrCreateRegattaWithoutReplication(baseRegattaName,
com.sap.sse.common.Util.Pair<Regatta, Boolean> regattaWithCreatedFlag = getOrCreateRegattaWithoutReplication(baseRegattaName,
boatClassName, id, series, persistent, scoringScheme, defaultCourseAreaId);
Regatta regatta = regattaWithCreatedFlag.getA();
if (regattaWithCreatedFlag.getB()) {
@@ -960,7 +961,7 @@ public class RacingEventServiceImpl implements RacingEventServiceWithTestSupport
}
@Override
public Pair<Regatta, Boolean> getOrCreateRegattaWithoutReplication(String baseRegattaName, String boatClassName,
public com.sap.sse.common.Util.Pair<Regatta, Boolean> getOrCreateRegattaWithoutReplication(String baseRegattaName, String boatClassName,
Serializable id, Iterable<? extends Series> series, boolean persistent, ScoringScheme scoringScheme,
Serializable defaultCourseAreaId) {
RaceLogStore raceLogStore = MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(mongoObjectFactory,
@@ -998,7 +999,7 @@ public class RacingEventServiceImpl implements RacingEventServiceWithTestSupport
}
}
}
return new Pair<Regatta, Boolean>(regatta, wasCreated);
return new com.sap.sse.common.Util.Pair<Regatta, Boolean>(regatta, wasCreated);
}
@Override
@@ -1684,14 +1685,14 @@ public class RacingEventServiceImpl implements RacingEventServiceWithTestSupport
}
@Override
public Iterable<Triple<Regatta, RaceDefinition, String>> getWindTrackedRaces() {
List<Triple<Regatta, RaceDefinition, String>> result = new ArrayList<Triple<Regatta, RaceDefinition, String>>();
public Iterable<com.sap.sse.common.Util.Triple<Regatta, RaceDefinition, String>> getWindTrackedRaces() {
List<com.sap.sse.common.Util.Triple<Regatta, RaceDefinition, String>> result = new ArrayList<com.sap.sse.common.Util.Triple<Regatta, RaceDefinition, String>>();
for (Regatta regatta : getAllRegattas()) {
for (RaceDefinition race : regatta.getAllRaces()) {
for (WindTrackerFactory windTrackerFactory : getWindTrackerFactories()) {
WindTracker windTracker = windTrackerFactory.getExistingWindTracker(race);
if (windTracker != null) {
result.add(new Triple<Regatta, RaceDefinition, String>(regatta, race, windTracker.toString()));
result.add(new com.sap.sse.common.Util.Triple<Regatta, RaceDefinition, String>(regatta, race, windTracker.toString()));
}
}
}
@@ -2480,11 +2481,11 @@ public class RacingEventServiceImpl implements RacingEventServiceWithTestSupport
}
@Override
public Triple<TimePoint, Integer, RacingProcedureType> getStartTimeAndProcedure(String leaderboardName, String raceColumnName, String fleetName) {
public com.sap.sse.common.Util.Triple<TimePoint, Integer, RacingProcedureType> getStartTimeAndProcedure(String leaderboardName, String raceColumnName, String fleetName) {
RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName);
if (raceLog != null) {
ReadonlyRaceState state = ReadonlyRaceStateImpl.create(raceLog);
return new Triple<TimePoint, Integer, RacingProcedureType>(state.getStartTime(), raceLog.getCurrentPassId(), state.getRacingProcedure().getType());
return new com.sap.sse.common.Util.Triple<TimePoint, Integer, RacingProcedureType>(state.getStartTime(), raceLog.getCurrentPassId(), state.getRacingProcedure().getType());
}
return null;
}
@@ -2590,4 +2591,9 @@ public class RacingEventServiceImpl implements RacingEventServiceWithTestSupport
public void setDataImportDeleteProgressFromMapTimerWithoutReplication(UUID importOperationId) {
dataImportLock.setDeleteFromMapTimer(importOperationId);
}
@Override
public Result<LeaderboardSearchResult> search(KeywordQuery query) {
return new RegattaByKeywordSearchService().search(this, query);
}
}
@@ -0,0 +1,95 @@
package com.sap.sailing.server.impl;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Event;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
import com.sap.sailing.server.LeaderboardSearchResult;
import com.sap.sailing.server.RacingEventService;
import com.sap.sse.common.Util;
import com.sap.sse.common.filter.AbstractListFilter;
import com.sap.sse.common.search.KeywordQuery;
import com.sap.sse.common.search.Result;
import com.sap.sse.common.search.ResultImpl;
/**
* Searches a {@link RacingEventService} instance for regattas that somehow match with a
* {@link KeywordQuery}. Several attributes on the way are considered, in particular the event
* name (if a regatta is somehow linked to an event), the event's venue name, the leaderboard group
* name that contains a regatta leaderboard for the subject regatta, the regatta name itself,
* the regatta's boat class name, and the names of all competitors entered into the regatta.
*
* @author Axel Uhl (D043530)
*
*/
public class RegattaByKeywordSearchService {
Result<LeaderboardSearchResult> search(final RacingEventService racingEventService, KeywordQuery query) {
ResultImpl<LeaderboardSearchResult> result = new ResultImpl<>(query, new RegattaSearchResultRanker(racingEventService));
AbstractListFilter<Leaderboard> leaderboardFilter = new AbstractListFilter<Leaderboard>() {
@Override
public Iterable<String> getStrings(Leaderboard leaderboard) {
List<String> leaderboardStrings = new ArrayList<>();
leaderboardStrings.add(leaderboard.getName());
leaderboardStrings.add(leaderboard.getDisplayName());
for (Competitor competitor : leaderboard.getCompetitors()) {
leaderboardStrings.add(competitor.getName());
leaderboardStrings.add(competitor.getBoat().getSailID());
String competitorDisplayName = leaderboard.getDisplayName(competitor);
if (competitorDisplayName != null) {
leaderboardStrings.add(competitorDisplayName);
}
}
final Iterable<LeaderboardGroup> leaderboardGroupsHostingLeaderboard = getLeaderboardGroupsHostingLeaderboard(
leaderboard, racingEventService);
for (LeaderboardGroup leaderboardGroup : leaderboardGroupsHostingLeaderboard) {
leaderboardStrings.add(leaderboardGroup.getName());
leaderboardStrings.add(leaderboardGroup.getDescription());
}
for (Event event : getEventsHostingLeaderboard(leaderboard, racingEventService, leaderboardGroupsHostingLeaderboard)) {
leaderboardStrings.add(event.getName());
leaderboardStrings.add(event.getVenue().getName());
}
return leaderboardStrings;
}
};
for (Leaderboard matchingLeaderboard : leaderboardFilter.applyFilter(query.getKeywords(), racingEventService.getLeaderboards().values())) {
result.addHit(new LeaderboardSearchResultImpl(matchingLeaderboard));
}
return result;
}
private Iterable<LeaderboardGroup> getLeaderboardGroupsHostingLeaderboard(Leaderboard leaderboard, RacingEventService racingEventService) {
Set<LeaderboardGroup> result = new LinkedHashSet<>();
for (LeaderboardGroup leaderboardGroup : racingEventService.getLeaderboardGroups().values()) {
for (Leaderboard lgLeaderboard : leaderboardGroup.getLeaderboards()) {
if (lgLeaderboard == leaderboard) {
result.add(leaderboardGroup);
}
}
}
return result;
}
private Iterable<Event> getEventsHostingLeaderboard(Leaderboard leaderboard, RacingEventService racingEventService,
Iterable<LeaderboardGroup> leaderboardGroupsHostingLeaderboard) {
Set<Event> result = new LinkedHashSet<>();
for (Event event : racingEventService.getAllEvents()) {
if (Util.contains(event.getVenue().getCourseAreas(), leaderboard.getDefaultCourseArea())) {
result.add(event);
} else {
for (LeaderboardGroup leaderboardGroupHostingRegatta : leaderboardGroupsHostingLeaderboard) {
if (Util.contains(event.getLeaderboardGroups(), leaderboardGroupHostingRegatta)) {
result.add(event);
break;
}
}
}
}
return result;
}
}
@@ -0,0 +1,71 @@
package com.sap.sailing.server.impl;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.domain.tracking.TrackedRegatta;
import com.sap.sailing.domain.tracking.TrackedRegattaRegistry;
import com.sap.sailing.server.RacingEventService;
import com.sap.sailing.server.LeaderboardSearchResult;
import com.sap.sse.common.Util;
public class RegattaSearchResultRanker implements Comparator<LeaderboardSearchResult> {
private final TrackedRegattaRegistry trackedRegattaRegistry;
protected RegattaSearchResultRanker(RacingEventService racingEventService) {
this.trackedRegattaRegistry = racingEventService;
}
@Override
public int compare(LeaderboardSearchResult o1, LeaderboardSearchResult o2) {
Regatta r1 = o1.getRegatta();
Regatta r2 = o2.getRegatta();
TrackedRegatta trackedR1 = r1 == null ? null : trackedRegattaRegistry.getTrackedRegatta(r1);
TrackedRegatta trackedR2 = r2 == null ? null : trackedRegattaRegistry.getTrackedRegatta(r2);
final int result;
if (trackedR1 == null) {
if (trackedR2 == null) {
result = o1.getLeaderboard().getName().compareTo(o2.getLeaderboard().getName());
} else {
result = -1; // a non-tracked regatta is greater (shown further down) than a tracked regatta
}
} else {
if (trackedR2 == null) {
result = 1; // a tracked regatta is less (shown further up) than a non-tracked regatta
} else {
// both are tracked; check times of tracked races
result = compareByEarliestStartOfATrackedRace(trackedR1, trackedR2);
}
}
return result;
}
private int compareByEarliestStartOfATrackedRace(TrackedRegatta trackedR1, TrackedRegatta trackedR2) {
assert trackedR1 != null;
assert trackedR2 != null;
TimePoint earliestTrackedRaceInR1 = getEarliestTrackedRace(trackedR1);
TimePoint earliestTrackedRaceInR2 = getEarliestTrackedRace(trackedR2);
return Util.compareToWithNull(earliestTrackedRaceInR1, earliestTrackedRaceInR2, /* nullIsLess */ false);
}
private TimePoint getEarliestTrackedRace(TrackedRegatta trackedRegatta) {
List<TimePoint> startOfTrackingTimes = new ArrayList<>();
for (TrackedRace trackedRace : trackedRegatta.getTrackedRaces()) {
if (trackedRace.getStartOfTracking() != null) {
startOfTrackingTimes.add(trackedRace.getStartOfTracking());
}
}
final TimePoint result;
if (startOfTrackingTimes.isEmpty()) {
result = null;
} else {
result = Collections.min(startOfTrackingTimes);
}
return result;
}
}
@@ -25,10 +25,11 @@ import com.sap.sailing.domain.base.DomainFactory;
import com.sap.sailing.domain.base.Event;
import com.sap.sailing.domain.base.EventBase;
import com.sap.sailing.domain.base.RemoteSailingServerReference;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.server.gateway.deserialization.impl.CourseAreaJsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.EventBaseJsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.LeaderboardGroupBaseJsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.VenueJsonDeserializer;
import com.sap.sse.common.Util;
/**
* A set of {@link RemoteSailingServerReference}s including a cache of their {@link EventBase events} that is
@@ -47,7 +48,7 @@ public class RemoteSailingServerSet {
*/
private final ConcurrentHashMap<String, RemoteSailingServerReference> remoteSailingServers;
private final ConcurrentHashMap<RemoteSailingServerReference, Pair<Iterable<EventBase>, Exception>> cachedEventsForRemoteSailingServers;
private final ConcurrentHashMap<RemoteSailingServerReference, Util.Pair<Iterable<EventBase>, Exception>> cachedEventsForRemoteSailingServers;
/**
* @param scheduler
@@ -82,9 +83,9 @@ public class RemoteSailingServerSet {
}.start();
}
private Pair<Iterable<EventBase>, Exception> updateRemoteServerEventCacheSynchronously(RemoteSailingServerReference ref) {
private Util.Pair<Iterable<EventBase>, Exception> updateRemoteServerEventCacheSynchronously(RemoteSailingServerReference ref) {
BufferedReader bufferedReader = null;
Pair<Iterable<EventBase>, Exception> result;
Util.Pair<Iterable<EventBase>, Exception> result;
try {
try {
final URL eventsURL = getEventsURL(ref.getURL());
@@ -95,7 +96,7 @@ public class RemoteSailingServerSet {
JSONParser parser = new JSONParser();
Object eventsAsObject = parser.parse(bufferedReader);
EventBaseJsonDeserializer deserializer = new EventBaseJsonDeserializer(new VenueJsonDeserializer(
new CourseAreaJsonDeserializer(DomainFactory.INSTANCE)));
new CourseAreaJsonDeserializer(DomainFactory.INSTANCE)), new LeaderboardGroupBaseJsonDeserializer());
JSONArray eventsAsJsonArray = (JSONArray) eventsAsObject;
final Set<EventBase> events = new HashSet<>();
for (Object eventAsObject : eventsAsJsonArray) {
@@ -103,7 +104,7 @@ public class RemoteSailingServerSet {
EventBase event = deserializer.deserialize(eventAsJson);
events.add(event);
}
result = new Pair<Iterable<EventBase>, Exception>(events, /* exception */ null);
result = new Util.Pair<Iterable<EventBase>, Exception>(events, /* exception */ null);
} finally {
if (bufferedReader != null) {
bufferedReader.close();
@@ -111,7 +112,7 @@ public class RemoteSailingServerSet {
}
} catch (IOException | ParseException e) {
logger.log(Level.INFO, "Exception trying to fetch events from remote server "+ref+": "+e.getMessage(), e);
result = new Pair<Iterable<EventBase>, Exception>(/* events */ null, e);
result = new Util.Pair<Iterable<EventBase>, Exception>(/* events */ null, e);
}
cachedEventsForRemoteSailingServers.put(ref, result);
return result;
@@ -126,7 +127,7 @@ public class RemoteSailingServerSet {
return new URL(getEventsUrl);
}
public Map<RemoteSailingServerReference, Pair<Iterable<EventBase>, Exception>> getCachedEventsForRemoteSailingServers() {
public Map<RemoteSailingServerReference, Util.Pair<Iterable<EventBase>, Exception>> getCachedEventsForRemoteSailingServers() {
return Collections.unmodifiableMap(cachedEventsForRemoteSailingServers);
}
@@ -143,7 +144,7 @@ public class RemoteSailingServerSet {
* result is cached. If <code>ref</code> was not yet part of this remote sailing server reference set,
* it is automatically added.
*/
public Pair<Iterable<EventBase>, Exception> getEventsOrException(RemoteSailingServerReference ref) {
public Util.Pair<Iterable<EventBase>, Exception> getEventsOrException(RemoteSailingServerReference ref) {
if (!remoteSailingServers.containsKey(ref.getName())) {
remoteSailingServers.put(ref.getName(), ref);
}
@@ -22,7 +22,6 @@ import com.sap.sailing.domain.common.Speed;
import com.sap.sailing.domain.common.Tack;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.WindSource;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.tracking.GPSFixStore;
import com.sap.sailing.domain.tracking.CourseDesignChangedListener;
@@ -44,6 +43,7 @@ import com.sap.sailing.domain.tracking.WindStore;
import com.sap.sailing.domain.tracking.WindWithConfidence;
import com.sap.sailing.domain.tracking.impl.EmptyWindStore;
import com.sap.sailing.domain.tracking.impl.TrackedRegattaImpl;
import com.sap.sse.common.Util;
public class DummyTrackedRace extends TrackedRaceWithWindEssentials {
private static final long serialVersionUID = -11522605089325440L;
@@ -85,7 +85,7 @@ public class DummyTrackedRace extends TrackedRaceWithWindEssentials {
}
@Override
public Iterable<Pair<Waypoint, Pair<TimePoint, TimePoint>>> getMarkPassingsTimes() {
public Iterable<Util.Pair<Waypoint, Util.Pair<TimePoint, TimePoint>>> getMarkPassingsTimes() {
return null;
}
@@ -353,7 +353,7 @@ public class DummyTrackedRace extends TrackedRaceWithWindEssentials {
}
@Override
public WindWithConfidence<Pair<Position, TimePoint>> getWindWithConfidence(Position p, TimePoint at) {
public WindWithConfidence<Util.Pair<Position, TimePoint>> getWindWithConfidence(Position p, TimePoint at) {
// TODO Auto-generated method stub
return null;
}
@@ -365,7 +365,7 @@ public class DummyTrackedRace extends TrackedRaceWithWindEssentials {
}
@Override
public WindWithConfidence<Pair<Position, TimePoint>> getWindWithConfidence(Position p, TimePoint at,
public WindWithConfidence<Util.Pair<Position, TimePoint>> getWindWithConfidence(Position p, TimePoint at,
Iterable<WindSource> windSourcesToExclude) {
// TODO Auto-generated method stub
return null;
@@ -4,9 +4,9 @@ import java.util.ArrayList;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CompetitorStore;
import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.server.RacingEventService;
import com.sap.sailing.server.RacingEventServiceOperation;
import com.sap.sse.common.Util;
public class AllowCompetitorResetToDefaults extends AbstractRacingEventServiceOperation<Void> {
private static final long serialVersionUID = 5133140671156755328L;
@@ -6,6 +6,7 @@ import com.sap.sailing.domain.common.RaceIdentifier;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.racelog.tracking.EmptyGPSFixStore;
import com.sap.sailing.domain.racelog.tracking.GPSFixStore;
import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.domain.tracking.TrackedRegatta;
import com.sap.sailing.domain.tracking.WindStore;
@@ -22,7 +23,7 @@ import com.sap.sailing.server.RacingEventServiceOperation;
* @author Axel Uhl (d043530)
*
*/
public class CreateTrackedRace extends AbstractRaceOperation<TrackedRace> {
public class CreateTrackedRace extends AbstractRaceOperation<DynamicTrackedRace> {
private static final long serialVersionUID = 5084401060896514911L;
private final long millisecondsOverWhichToAverageWind;
private final long millisecondsOverWhichToAverageSpeed;
@@ -73,7 +74,7 @@ public class CreateTrackedRace extends AbstractRaceOperation<TrackedRace> {
}
@Override
public TrackedRace internalApplyTo(RacingEventService toState) {
public DynamicTrackedRace internalApplyTo(RacingEventService toState) {
return toState.createTrackedRace(getRaceIdentifier(), windStore == null ? EmptyWindStore.INSTANCE : windStore,
gpsFixStore == null ? EmptyGPSFixStore.INSTANCE : gpsFixStore,
delayToLiveInMillis, millisecondsOverWhichToAverageWind, millisecondsOverWhichToAverageSpeed);
@@ -26,8 +26,6 @@ import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.ScoringSchemeType;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.impl.MasterDataImportObjectCreationCountImpl;
import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
@@ -50,6 +48,7 @@ import com.sap.sailing.domain.tracking.WindTrack;
import com.sap.sailing.server.RacingEventService;
import com.sap.sailing.server.RacingEventServiceOperation;
import com.sap.sailing.server.masterdata.DummyTrackedRace;
import com.sap.sse.common.Util;
public class ImportMasterDataOperation extends
AbstractRacingEventServiceOperation<MasterDataImportObjectCreationCountImpl> {
@@ -303,7 +302,7 @@ public class ImportMasterDataOperation extends
* @param leaderboard
* @return the race column and fleet the dummy was attached to
*/
public Pair<RaceColumn, Fleet> addDummyTrackedRace(Leaderboard leaderboard,
public com.sap.sse.common.Util.Pair<RaceColumn, Fleet> addDummyTrackedRace(Leaderboard leaderboard,
Regatta regatta) {
RaceColumn raceColumn = null;
Fleet fleet = null;
@@ -319,7 +318,7 @@ public class ImportMasterDataOperation extends
raceColumn.setTrackedRace(fleet, dummy);
}
}
return new Pair<RaceColumn, Fleet>(raceColumn, fleet);
return new com.sap.sse.common.Util.Pair<RaceColumn, Fleet>(raceColumn, fleet);
}
private void createWindTracks(RacingEventService toState) {
@@ -2,8 +2,8 @@ package com.sap.sailing.server.operationaltransformation;
import java.io.IOException;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.server.RacingEventService;
import com.sap.sailing.server.RacingEventServiceOperation;
@@ -1,7 +1,7 @@
package com.sap.sailing.server.operationaltransformation;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.server.RacingEventService;
import com.sap.sailing.server.RacingEventServiceOperation;
@@ -5,13 +5,13 @@ import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.domain.common.NoWindException;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.impl.Util.Triple;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.Leaderboard.Entry;
import com.sap.sailing.server.RacingEventService;
import com.sap.sailing.server.RacingEventServiceOperation;
import com.sap.sse.common.Util;
public class UpdateLeaderboardMaxPointsReason extends AbstractLeaderboardColumnOperation<Triple<Double, Double, Boolean>> {
public class UpdateLeaderboardMaxPointsReason extends AbstractLeaderboardColumnOperation<Util.Triple<Double, Double, Boolean>> {
private static final long serialVersionUID = -492130952256848047L;
private final String competitorIdAsString;
private final MaxPointsReason newMaxPointsReason;
@@ -38,7 +38,7 @@ public class UpdateLeaderboardMaxPointsReason extends AbstractLeaderboardColumnO
}
@Override
public Triple<Double, Double, Boolean> internalApplyTo(RacingEventService toState) throws NoWindException {
public Util.Triple<Double, Double, Boolean> internalApplyTo(RacingEventService toState) throws NoWindException {
Leaderboard leaderboard = toState.getLeaderboardByName(getLeaderboardName());
if (leaderboard != null) {
Competitor competitor = leaderboard.getCompetitorByIdAsString(competitorIdAsString);
@@ -51,7 +51,7 @@ public class UpdateLeaderboardMaxPointsReason extends AbstractLeaderboardColumnO
updateStoredLeaderboard(toState, leaderboard);
Entry updatedEntry = leaderboard.getEntry(competitor, raceColumn, timePoint);
boolean isScoreCorrected = leaderboard.getScoreCorrection().isScoreCorrected(competitor, raceColumn, timePoint);
return new Triple<Double, Double, Boolean>(updatedEntry.getNetPoints(), updatedEntry.getTotalPoints(), isScoreCorrected);
return new Util.Triple<Double, Double, Boolean>(updatedEntry.getNetPoints(), updatedEntry.getTotalPoints(), isScoreCorrected);
} else {
throw new IllegalArgumentException("Didn't find competitor with ID "+competitorIdAsString+" in leaderboard "+getLeaderboardName());
}
@@ -4,12 +4,12 @@ import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.common.NoWindException;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.impl.Util.Triple;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.server.RacingEventService;
import com.sap.sailing.server.RacingEventServiceOperation;
import com.sap.sse.common.Util;
public class UpdateLeaderboardScoreCorrection extends AbstractLeaderboardColumnOperation<Triple<Double, Double, Boolean>> {
public class UpdateLeaderboardScoreCorrection extends AbstractLeaderboardColumnOperation<Util.Triple<Double, Double, Boolean>> {
private static final long serialVersionUID = -977025759476022993L;
private final String competitorIdAsString;
private final Double correctedScore;
@@ -39,7 +39,7 @@ public class UpdateLeaderboardScoreCorrection extends AbstractLeaderboardColumnO
}
@Override
public Triple<Double, Double, Boolean> internalApplyTo(RacingEventService toState) throws NoWindException {
public Util.Triple<Double, Double, Boolean> internalApplyTo(RacingEventService toState) throws NoWindException {
Leaderboard leaderboard = toState.getLeaderboardByName(getLeaderboardName());
Double newNetPoints;
Double newTotalPoints;
@@ -64,7 +64,7 @@ public class UpdateLeaderboardScoreCorrection extends AbstractLeaderboardColumnO
throw new IllegalArgumentException("Didn't find leaderboard "+getLeaderboardName());
}
updateStoredLeaderboard(toState, leaderboard);
return new Triple<Double, Double, Boolean>(newNetPoints, newTotalPoints, isScoreCorrected);
return new Util.Triple<Double, Double, Boolean>(newNetPoints, newTotalPoints, isScoreCorrected);
}
}