Merge branch 'master' into tracapi

Conflicts:
	java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java
This commit is contained in:
Axel Uhl committed 2014-06-05 00:36:12 +02:00
commit 6f99f073bf
20 files changed
+3316 -2957

No files matched your search

@@ -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();
}
@@ -67,6 +67,8 @@ 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
@@ -552,4 +554,6 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch
* or, if fetching the event list from the remote server did fail, the exception for which it failed.
*/
Util.Pair<Iterable<EventBase>, Exception> updateRemoteServerEventCacheSynchronously(RemoteSailingServerReference ref);
Result<LeaderboardSearchResult> search(KeywordQuery query);
}
@@ -1,7 +0,0 @@
package com.sap.sailing.server;
import com.sap.sse.common.search.Hit;
public interface RegattaSearchResult extends Hit {
}
@@ -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;
}
}
@@ -133,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;
@@ -171,6 +172,8 @@ 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());
@@ -2588,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);
}
}
@@ -7,12 +7,10 @@ import java.util.Set;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Event;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
import com.sap.sailing.domain.leaderboard.RegattaLeaderboard;
import com.sap.sailing.server.LeaderboardSearchResult;
import com.sap.sailing.server.RacingEventService;
import com.sap.sailing.server.RegattaSearchResult;
import com.sap.sse.common.Util;
import com.sap.sse.common.filter.AbstractListFilter;
import com.sap.sse.common.search.KeywordQuery;
@@ -30,53 +28,46 @@ import com.sap.sse.common.search.ResultImpl;
*
*/
public class RegattaByKeywordSearchService {
Result<RegattaSearchResult> search(final RacingEventService racingEventService, KeywordQuery query) {
ResultImpl<RegattaSearchResult> result = new ResultImpl<>(query, new RegattaSearchResultRanker());
AbstractListFilter<Regatta> regattaFilter = new AbstractListFilter<Regatta>() {
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(Regatta regatta) {
List<String> regattaStrings = new ArrayList<>();
regattaStrings.add(regatta.getBaseName());
regattaStrings.add(regatta.getBoatClass().getName());
for (Competitor competitor : regatta.getCompetitors()) {
regattaStrings.add(competitor.getName());
regattaStrings.add(competitor.getBoat().getSailID());
}
final Iterable<LeaderboardGroup> leaderboardGroupsHostingRegatta = getLeaderboardGroupsHostingRegatta(regatta, racingEventService);
for (LeaderboardGroup leaderboardGroup : leaderboardGroupsHostingRegatta) {
regattaStrings.add(leaderboardGroup.getName());
regattaStrings.add(leaderboardGroup.getDescription());
for (Leaderboard leaderboard : leaderboardGroup.getLeaderboards()) {
if (leaderboard instanceof RegattaLeaderboard && ((RegattaLeaderboard) leaderboard).getRegatta() == regatta) {
regattaStrings.add(leaderboard.getName());
regattaStrings.add(leaderboard.getDisplayName());
for (Competitor competitor : leaderboard.getCompetitors()) {
String competitorDisplayName = leaderboard.getDisplayName(competitor);
if (competitorDisplayName != null) {
regattaStrings.add(competitorDisplayName);
}
}
}
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);
}
}
for (Event event : getEventsHostingRegatta(regatta, racingEventService, leaderboardGroupsHostingRegatta)) {
regattaStrings.add(event.getName());
regattaStrings.add(event.getVenue().getName());
final Iterable<LeaderboardGroup> leaderboardGroupsHostingLeaderboard = getLeaderboardGroupsHostingLeaderboard(
leaderboard, racingEventService);
for (LeaderboardGroup leaderboardGroup : leaderboardGroupsHostingLeaderboard) {
leaderboardStrings.add(leaderboardGroup.getName());
leaderboardStrings.add(leaderboardGroup.getDescription());
}
return regattaStrings;
for (Event event : getEventsHostingLeaderboard(leaderboard, racingEventService, leaderboardGroupsHostingLeaderboard)) {
leaderboardStrings.add(event.getName());
leaderboardStrings.add(event.getVenue().getName());
}
return leaderboardStrings;
}
};
for (Regatta matchingRegatta : regattaFilter.applyFilter(query.getKeywords(), racingEventService.getAllRegattas())) {
result.addHit(new RegattaSearchResultImpl(matchingRegatta));
for (Leaderboard matchingLeaderboard : leaderboardFilter.applyFilter(query.getKeywords(), racingEventService.getLeaderboards().values())) {
result.addHit(new LeaderboardSearchResultImpl(matchingLeaderboard));
}
return result;
}
private Iterable<LeaderboardGroup> getLeaderboardGroupsHostingRegatta(Regatta regatta, RacingEventService racingEventService) {
private Iterable<LeaderboardGroup> getLeaderboardGroupsHostingLeaderboard(Leaderboard leaderboard, RacingEventService racingEventService) {
Set<LeaderboardGroup> result = new LinkedHashSet<>();
for (LeaderboardGroup leaderboardGroup : racingEventService.getLeaderboardGroups().values()) {
for (Leaderboard leaderboard : leaderboardGroup.getLeaderboards()) {
if (leaderboard instanceof RegattaLeaderboard && ((RegattaLeaderboard) leaderboard).getRegatta() == regatta) {
for (Leaderboard lgLeaderboard : leaderboardGroup.getLeaderboards()) {
if (lgLeaderboard == leaderboard) {
result.add(leaderboardGroup);
}
}
@@ -84,14 +75,14 @@ public class RegattaByKeywordSearchService {
return result;
}
private Iterable<Event> getEventsHostingRegatta(Regatta regatta, RacingEventService racingEventService,
Iterable<LeaderboardGroup> leaderboardGroupsHostingRegatta) {
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(), regatta.getDefaultCourseArea())) {
if (Util.contains(event.getVenue().getCourseAreas(), leaderboard.getDefaultCourseArea())) {
result.add(event);
} else {
for (LeaderboardGroup leaderboardGroupHostingRegatta : leaderboardGroupsHostingRegatta) {
for (LeaderboardGroup leaderboardGroupHostingRegatta : leaderboardGroupsHostingLeaderboard) {
if (Util.contains(event.getLeaderboardGroups(), leaderboardGroupHostingRegatta)) {
result.add(event);
break;
@@ -1,16 +0,0 @@
package com.sap.sailing.server.impl;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.server.RegattaSearchResult;
public class RegattaSearchResultImpl implements RegattaSearchResult {
private final Regatta regatta;
public RegattaSearchResultImpl(Regatta regatta) {
this.regatta = regatta;
}
public Regatta getRegatta() {
return regatta;
}
}
@@ -1,13 +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.server.RegattaSearchResult;
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;
}
public class RegattaSearchResultRanker implements Comparator<RegattaSearchResult> {
@Override
public int compare(RegattaSearchResult o1, RegattaSearchResult o2) {
// TODO Auto-generated method stub
return 0;
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;
}
}
@@ -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);