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

This commit is contained in:
fmittag committed 2014-08-07 18:33:27 +02:00
commit 1c9b03d479
5 files changed
+129 -38

No files matched your search

@@ -34,6 +34,8 @@ import com.google.gwt.maps.client.events.click.ClickMapEvent;
import com.google.gwt.maps.client.events.click.ClickMapHandler;
import com.google.gwt.maps.client.events.dragend.DragEndMapEvent;
import com.google.gwt.maps.client.events.dragend.DragEndMapHandler;
import com.google.gwt.maps.client.events.idle.IdleMapEvent;
import com.google.gwt.maps.client.events.idle.IdleMapHandler;
import com.google.gwt.maps.client.events.mouseout.MouseOutMapEvent;
import com.google.gwt.maps.client.events.mouseout.MouseOutMapHandler;
import com.google.gwt.maps.client.events.mouseover.MouseOverMapEvent;
@@ -279,6 +281,8 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe
private LatLngBounds currentMapBounds;
private int currentZoomLevel;
private boolean autoZooming = false;
private LatLngBounds newLatLngBounds;
private WindStreamletsRaceboardOverlay streamletOverlay;
private final boolean showViewStreamlets;
@@ -381,20 +385,29 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe
settings.getZoomSettings().setTypesToConsiderOnZoom(emptyList);
}
});
map.addIdleHandler(new IdleMapHandler() {
@Override
public void onEvent(IdleMapEvent event) {
if (autoZooming) {
map.panTo(newLatLngBounds.getCenter());
autoZooming = false;
}
}
});
map.addBoundsChangeHandler(new BoundsChangeMapHandler() {
@Override
public void onEvent(BoundsChangeMapEvent event) {
if (!isAutoZoomInProgress() && !map.getBounds().equals(currentMapBounds)) {
int newZoomLevel = map.getZoom();
if (!isAutoZoomInProgress() && (newZoomLevel != currentZoomLevel)) {
// remove the canvas animations for boats
for (BoatOverlay boatOverlay : RaceMap.this.getBoatOverlays().values()) {
boatOverlay.removeCanvasPositionAndRotationTransition();
}
// remove the canvas animations for the info overlays of the selected boats
for(CompetitorInfoOverlay infoOverlay: competitorInfoOverlays.values()) {
for (CompetitorInfoOverlay infoOverlay : competitorInfoOverlays.values()) {
infoOverlay.removeCanvasPositionAndRotationTransition();
}
}
int newZoomLevel = map.getZoom();
if ((streamletOverlay != null) && !map.getBounds().equals(currentMapBounds)) {
streamletOverlay.onBoundsChanged(newZoomLevel != currentZoomLevel);
}
@@ -1184,22 +1197,56 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe
}
}
private int getZoomLevel(LatLngBounds bounds) {
int GLOBE_PXSIZE = 256; // a constant in Google's map projection
int MAX_ZOOM = 30; // currently max-zoom is 24, but Google may extend it
double LOG2 = Math.log(2.0);
double deltaLng = bounds.getNorthEast().getLongitude() - bounds.getSouthWest().getLongitude();
double deltaLat = bounds.getNorthEast().getLatitude() - bounds.getSouthWest().getLatitude();
if ((deltaLng == 0) && (deltaLat == 0)) {
return MAX_ZOOM;
}
if (deltaLng < 0) {
deltaLng += 360;
}
int zoomLng = (int) Math.floor(Math.log(map.getDiv().getClientWidth() * 360 / deltaLng / GLOBE_PXSIZE) / LOG2);
if (deltaLat < 0) {
deltaLat += 360;
}
int zoomLat = (int) Math.floor(Math.log(map.getDiv().getClientHeight() * 180 / deltaLat / GLOBE_PXSIZE) / LOG2);
return Math.min(zoomLat, zoomLng);
}
private void zoomMapToNewBounds(Bounds newBounds) {
if (newBounds != null) {
Bounds currentMapBounds = BoundsUtil.getAsBounds(map.getBounds());
if (!currentMapBounds.contains(newBounds) || graticuleAreaRation(currentMapBounds, newBounds) > 10) {
if (!currentMapBounds.contains(newBounds) || graticuleAreaRatio(currentMapBounds, newBounds) > 10) {
// only change bounds if the new bounds don't fit into the current map zoom
List<ZoomTypes> oldZoomSettings = settings.getZoomSettings().getTypesToConsiderOnZoom();
setAutoZoomInProgress(true);
LatLngBounds newLatLngBounds = BoundsUtil.getAsLatLngBounds(newBounds);
map.fitBounds(newLatLngBounds);
newLatLngBounds = BoundsUtil.getAsLatLngBounds(newBounds);
int newZoomLevel = getZoomLevel(newLatLngBounds);
if (newZoomLevel != map.getZoom()) {
// remove the canvas animations for boats
for (BoatOverlay boatOverlay : RaceMap.this.getBoatOverlays().values()) {
boatOverlay.removeCanvasPositionAndRotationTransition();
}
// remove the canvas animations for the info overlays of the selected boats
for(CompetitorInfoOverlay infoOverlay: competitorInfoOverlays.values()) {
infoOverlay.removeCanvasPositionAndRotationTransition();
}
autoZooming = true;
map.setZoom(newZoomLevel);
} else {
map.panTo(newLatLngBounds.getCenter());
}
settings.getZoomSettings().setTypesToConsiderOnZoom(oldZoomSettings);
setAutoZoomInProgress(false);
}
}
}
private double graticuleAreaRation(Bounds containing, Bounds contained) {
private double graticuleAreaRatio(Bounds containing, Bounds contained) {
assert containing.contains(contained);
double containingAreaRatio = getGraticuleArea(containing) / getGraticuleArea(contained);
return containingAreaRatio;
@@ -1838,7 +1885,6 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe
}
public static class TailsBoundsCalculator extends LatLngBoundsCalculatorForSelected {
@Override
public Bounds calculateNewBounds(RaceMap racemap) {
Bounds newBounds = null;
@@ -1865,7 +1911,6 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe
}
return newBounds;
}
}
public static class CourseMarksBoundsCalculator implements LatLngBoundsCalculator {
@@ -63,12 +63,16 @@ import com.sap.sailing.domain.common.MasterDataImportObjectCreationCount;
import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.domain.common.Position;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.SpeedWithBearing;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.WindSource;
import com.sap.sailing.domain.common.WindSourceType;
import com.sap.sailing.domain.common.impl.DataImportProgressImpl;
import com.sap.sailing.domain.common.impl.DegreeBearingImpl;
import com.sap.sailing.domain.common.impl.DegreePosition;
import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl;
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.common.impl.WindSourceWithAdditionalID;
import com.sap.sailing.domain.common.media.MediaTrack;
import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard;
import com.sap.sailing.domain.leaderboard.Leaderboard;
@@ -92,8 +96,10 @@ import com.sap.sailing.domain.racelog.impl.CompetitorResultsImpl;
import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl;
import com.sap.sailing.domain.racelog.impl.RaceLogEventFactoryImpl;
import com.sap.sailing.domain.racelog.tracking.EmptyGPSFixStore;
import com.sap.sailing.domain.tracking.DynamicTrackedRegatta;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.domain.tracking.Wind;
import com.sap.sailing.domain.tracking.WindTrack;
import com.sap.sailing.domain.tracking.impl.EmptyWindStore;
import com.sap.sailing.domain.tracking.impl.WindImpl;
import com.sap.sailing.mongodb.MongoDBConfiguration;
@@ -120,6 +126,8 @@ public class MasterDataImportTest {
private final TimePoint eventStartDate = new MillisecondsTimePoint(new Date());
private final TimePoint eventEndDate = new MillisecondsTimePoint(new Date());
private final UUID raceId = UUID.randomUUID();
/**
* Log Events created when running test. Will be removed from db at teardown
@@ -216,7 +224,7 @@ public class MasterDataImportTest {
boat2);
competitors.add(competitorToSuppress);
RaceColumn raceColumn = leaderboard.getRaceColumnByName(raceColumnName);
TrackedRace trackedRace = new DummyTrackedRace(competitors, regatta, null);
TrackedRace trackedRace = new DummyTrackedRace(raceId, competitors, regatta, null, sourceService.getWindStore());
raceColumn.setTrackedRace(testFleet1, trackedRace);
@@ -306,8 +314,8 @@ public class MasterDataImportTest {
Assert.assertNotNull(raceColumnOnTarget);
Assert.assertNull(raceColumnOnTarget.getTrackedRace(raceColumnOnTarget.getFleetByName(testFleet1Name)));
raceColumnOnTarget.setTrackedRace(raceColumnOnTarget.getFleets().iterator().next(), new DummyTrackedRace(
competitors, regattaOnTarget, null));
raceColumnOnTarget.setTrackedRace(raceColumnOnTarget.getFleets().iterator().next(), new DummyTrackedRace(raceId,
competitors, regattaOnTarget, null, sourceService.getWindStore()));
Assert.assertTrue(leaderboardOnTarget.getScoreCorrection().hasCorrectionFor(raceColumnOnTarget));
Competitor competitorOnTarget = domainFactory.getExistingCompetitorById(competitorUUID);
@@ -315,7 +323,7 @@ public class MasterDataImportTest {
competitorsCreatedOnTarget.add(competitorOnTarget);
Fleet fleet1OnTarget = raceColumnOnTarget.getFleetByName(testFleet1.getName());
TrackedRace trackedRaceForTarget = new DummyTrackedRace(competitorsCreatedOnTarget, regattaOnTarget, null);
TrackedRace trackedRaceForTarget = new DummyTrackedRace(raceId, competitorsCreatedOnTarget, regattaOnTarget, null, sourceService.getWindStore());
raceColumnOnTarget.setTrackedRace(fleet1OnTarget, trackedRaceForTarget);
@@ -425,7 +433,7 @@ public class MasterDataImportTest {
CompetitorImpl competitor2 = new CompetitorImpl(competitor2UUID, "Froderik", Color.RED, team2, boat2);
competitors.add(competitor2);
RaceColumn raceColumn = leaderboard.getRaceColumnByName(raceColumnName);
TrackedRace trackedRace = new DummyTrackedRace(competitors, regatta, null);
TrackedRace trackedRace = new DummyTrackedRace(raceId, competitors, regatta, null, sourceService.getWindStore());
raceColumn.setTrackedRace(testFleet1, trackedRace);
@@ -497,7 +505,7 @@ public class MasterDataImportTest {
competitorsCreatedOnTarget.add(competitorOnTarget);
Fleet fleet1OnTarget = raceColumnOnTarget.getFleetByName(testFleet1.getName());
TrackedRace trackedRaceForTarget = new DummyTrackedRace(competitorsCreatedOnTarget, regattaOnTarget, null);
TrackedRace trackedRaceForTarget = new DummyTrackedRace(raceId, competitorsCreatedOnTarget, regattaOnTarget, null, sourceService.getWindStore());
raceColumnOnTarget.setTrackedRace(fleet1OnTarget, trackedRaceForTarget);
@@ -570,11 +578,20 @@ public class MasterDataImportTest {
DynamicBoat boat = new BoatImpl("Wingy", boatClass, "GER70133");
CompetitorImpl competitor = new CompetitorImpl(competitorUUID, "Froderik", Color.RED, team, boat);
competitors.add(competitor);
RaceColumn raceColumn = leaderboard.getRaceColumnByName(raceColumnName);
TrackedRace trackedRace = new DummyTrackedRace(competitors, regatta, null);
DynamicTrackedRegatta trackedRegatta = sourceService.getOrCreateTrackedRegatta(regatta);
TrackedRace trackedRace = new DummyTrackedRace(raceId, competitors, regatta, trackedRegatta, sourceService.getWindStore());
regatta.addRace(trackedRace.getRace()); // make sure the competitor is serialized together with the regatta
raceColumn.setTrackedRace(testFleet1, trackedRace);
WindSource windSource = new WindSourceWithAdditionalID(WindSourceType.EXPEDITION, "Igtimi1");
WindTrack windTrackOnSource = trackedRace.getOrCreateWindTrack(windSource);
Position p = new DegreePosition(54, 30);
TimePoint at = new MillisecondsTimePoint(20000);
SpeedWithBearing windSpeedWithBearing = new KnotSpeedWithBearingImpl(20, new DegreeBearingImpl(12));
windTrackOnSource.add(new WindImpl(p, at, windSpeedWithBearing));
// Serialize
List<String> groupNamesToExport = new ArrayList<String>();
groupNamesToExport.add(group.getName());
@@ -628,11 +645,25 @@ public class MasterDataImportTest {
competitorsCreatedOnTarget.add(competitorOnTarget);
Fleet fleet1OnTarget = raceColumnOnTarget.getFleetByName(testFleet1.getName());
TrackedRace trackedRaceForTarget = new DummyTrackedRace(competitorsCreatedOnTarget, regattaOnTarget, null);
DynamicTrackedRegatta trackedRegattaForTarget = destService.getOrCreateTrackedRegatta(regattaOnTarget);
TrackedRace trackedRaceForTarget = new DummyTrackedRace(raceId, competitorsCreatedOnTarget, regattaOnTarget, trackedRegattaForTarget, sourceService.getWindStore());
raceColumnOnTarget.setTrackedRace(fleet1OnTarget, trackedRaceForTarget);
// TODO Somehow have check if wind was really imported. DummyTrackedRace not sufficient
WindTrack windTrackOnDest = trackedRaceForTarget.getOrCreateWindTrack(windSource);
windTrackOnDest.lockForRead();
try {
Iterable<Wind> fixes = windTrackOnDest.getFixes();
Assert.assertNotNull(fixes);
Iterator<Wind> iterator = fixes.iterator();
Assert.assertTrue(iterator.hasNext());
Wind firstWindFix = iterator.next();
Assert.assertNotNull(firstWindFix);
Assert.assertFalse(iterator.hasNext());
} finally {
windTrackOnDest.unlockAfterRead();
}
}
@@ -702,7 +733,7 @@ public class MasterDataImportTest {
"Froderik", Color.RED, team2, boat2);
competitors.add(competitor2);
RaceColumn raceColumn = leaderboard.getRaceColumnByName(raceColumnName);
TrackedRace trackedRace = new DummyTrackedRace(competitors, regatta, null);
TrackedRace trackedRace = new DummyTrackedRace(raceId, competitors, regatta, null, sourceService.getWindStore());
raceColumn.setTrackedRace(testFleet1, trackedRace);
@@ -779,7 +810,7 @@ public class MasterDataImportTest {
competitorsCreatedOnTarget.add(competitorOnTarget);
Fleet fleet1OnTarget = raceColumnOnTarget.getFleetByName(testFleet1.getName());
TrackedRace trackedRaceForTarget = new DummyTrackedRace(competitorsCreatedOnTarget, regattaOnTarget, null);
TrackedRace trackedRaceForTarget = new DummyTrackedRace(raceId, competitorsCreatedOnTarget, regattaOnTarget, null, sourceService.getWindStore());
raceColumnOnTarget.setTrackedRace(fleet1OnTarget, trackedRaceForTarget);
@@ -858,7 +889,7 @@ public class MasterDataImportTest {
boat2);
competitors.add(competitorToSuppress);
RaceColumn raceColumn = leaderboard.getRaceColumnByName(raceColumnName);
TrackedRace trackedRace = new DummyTrackedRace(competitors, regatta, null);
TrackedRace trackedRace = new DummyTrackedRace(raceId, competitors, regatta, null, sourceService.getWindStore());
raceColumn.setTrackedRace(testFleet1, trackedRace);
@@ -1056,7 +1087,7 @@ public class MasterDataImportTest {
boat2);
competitors.add(competitorToSuppress);
RaceColumn raceColumn = leaderboard.getRaceColumnByName(raceColumnName);
TrackedRace trackedRace = new DummyTrackedRace(competitors, regatta, null);
TrackedRace trackedRace = new DummyTrackedRace(raceId, competitors, regatta, null, sourceService.getWindStore());
raceColumn.setTrackedRace(testFleet1, trackedRace);
@@ -1149,7 +1180,7 @@ public class MasterDataImportTest {
Leaderboard leaderboardToOverride = destService.addRegattaLeaderboard(
regattaToOverride.getRegattaIdentifier(), "testDisplayNameNotToOverride", discardRule);
TrackedRace trackedRace2 = new DummyTrackedRace(competitorsToOverride, regattaToOverride, null);
TrackedRace trackedRace2 = new DummyTrackedRace(raceId, competitorsToOverride, regattaToOverride, null, sourceService.getWindStore());
RaceColumn columnToOverride = leaderboardToOverride.getRaceColumns().iterator().next();
columnToOverride.setTrackedRace(testFleet1ToOverride, trackedRace2);
identifierOfRegattaTrackedRace = regattaToOverride
@@ -1345,7 +1376,7 @@ public class MasterDataImportTest {
boat2);
competitors.add(competitorToSuppress);
RaceColumn raceColumn = leaderboard.getRaceColumnByName(raceColumnName);
TrackedRace trackedRace = new DummyTrackedRace(competitors, regatta, null);
TrackedRace trackedRace = new DummyTrackedRace(raceId, competitors, regatta, null, sourceService.getWindStore());
raceColumn.setTrackedRace(testFleet1, trackedRace);
@@ -1478,7 +1509,7 @@ public class MasterDataImportTest {
boat2);
competitors.add(competitorToSuppress);
RaceColumn raceColumn = leaderboard.getRaceColumnByName(raceColumnName);
TrackedRace trackedRace = new DummyTrackedRace(competitors, regatta, null);
TrackedRace trackedRace = new DummyTrackedRace(raceId, competitors, regatta, null, sourceService.getWindStore());
raceColumn.setTrackedRace(testFleet1, trackedRace);
sourceService.setRegattaForRace(regatta, "dummy");
@@ -1686,7 +1717,7 @@ public class MasterDataImportTest {
competitors.add(competitorToSuppress);
RaceColumn raceColumn = leaderboard.getRaceColumnByName(raceColumnName);
TrackedRace trackedRace = new DummyTrackedRace(competitors, regatta, null);
TrackedRace trackedRace = new DummyTrackedRace(raceId, competitors, regatta, null, sourceService.getWindStore());
raceColumn.setTrackedRace(testFleet1, trackedRace);
@@ -1911,7 +1942,7 @@ public class MasterDataImportTest {
CompetitorImpl competitorToSuppress = new CompetitorImpl(competitorToSuppressUUID, "Merkel", Color.RED, team2,
boat2);
competitors.add(competitorToSuppress);
TrackedRace trackedRace = new DummyTrackedRace(competitors, regatta, null);
TrackedRace trackedRace = new DummyTrackedRace(raceId, competitors, regatta, null, sourceService.getWindStore());
leaderboard.addRace(trackedRace, raceColumnName, false);
RaceColumn raceColumnOnLeaderboard = leaderboard.getRaceColumnByName(raceColumnName);
@@ -2001,8 +2032,8 @@ public class MasterDataImportTest {
series, true, new LowPoint(), courseAreaUUID, /* useStartTimeInference */true);
raceColumnOnTarget.setTrackedRace(defaultFleetOnTarget,
new DummyTrackedRace(
competitors, regattaOnTarget, null));
new DummyTrackedRace(raceId,
competitors, regattaOnTarget, null, sourceService.getWindStore()));
Assert.assertTrue(leaderboardOnTarget.getScoreCorrection().hasCorrectionFor(raceColumnOnTarget));
Competitor competitorOnTarget = domainFactory.getExistingCompetitorById(competitorUUID);
@@ -2010,7 +2041,7 @@ public class MasterDataImportTest {
competitorsCreatedOnTarget.add(competitorOnTarget);
Assert.assertEquals(defaultFleetOnTarget, leaderboardOnTarget.getFleet(null));
TrackedRace trackedRaceForTarget = new DummyTrackedRace(competitorsCreatedOnTarget, regattaOnTarget, null);
TrackedRace trackedRaceForTarget = new DummyTrackedRace(raceId, competitorsCreatedOnTarget, regattaOnTarget, null, sourceService.getWindStore());
raceColumnOnTarget.setTrackedRace(defaultFleetOnTarget, trackedRaceForTarget);
@@ -55,20 +55,25 @@ public class DummyTrackedRace extends TrackedRaceWithWindEssentials {
private static final long serialVersionUID = -11522605089325440L;
private Regatta regatta;
public DummyTrackedRace(final Iterable<? extends Competitor> competitors, final Regatta regatta, final TrackedRegatta trackedRegatta) {
public DummyTrackedRace(final Serializable raceId, final Iterable<? extends Competitor> competitors, final Regatta regatta, final TrackedRegatta trackedRegatta, final WindStore windStore) {
this(competitors, regatta, trackedRegatta, new RaceDefinitionImpl("DummyRace", new CourseImpl("Dummy Course", Collections.<Waypoint>emptyList()),
regatta.getBoatClass(), competitors));
regatta.getBoatClass(), competitors, raceId), windStore);
}
public DummyTrackedRace(final Iterable<? extends Competitor> competitors, final Regatta regatta, final TrackedRegatta trackedRegatta,
RaceDefinition race) {
super(race, trackedRegatta, EmptyWindStore.INSTANCE, -1);
RaceDefinition race, WindStore windStore) {
super(race, trackedRegatta, windStore, -1);
this.regatta = regatta;
}
public DummyTrackedRace(final Iterable<? extends Competitor> competitors, final Regatta regatta, final TrackedRegatta trackedRegatta,
RaceDefinition race) {
this(competitors, regatta, trackedRegatta, race, EmptyWindStore.INSTANCE);
}
public DummyTrackedRace(final String raceName, final Serializable raceId) {
super(new RaceDefinitionImpl(raceName, new CourseImpl("Dummy Course", Collections.<Waypoint> emptyList()),
/* boatClass */ null, new HashSet<Competitor>()), null, EmptyWindStore.INSTANCE, -1);
/* boatClass */ null, new HashSet<Competitor>(), raceId), null, EmptyWindStore.INSTANCE, -1);
}
@Override
@@ -38,6 +38,7 @@ import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.domain.tracking.TrackedRegatta;
import com.sap.sailing.domain.tracking.Wind;
import com.sap.sailing.domain.tracking.WindTrack;
import com.sap.sailing.domain.tracking.impl.EmptyWindStore;
import com.sap.sailing.server.RacingEventService;
import com.sap.sailing.server.RacingEventServiceOperation;
import com.sap.sailing.server.masterdata.DummyTrackedRace;
@@ -280,7 +281,7 @@ public class ImportMasterDataOperation extends
Iterator<? extends Fleet> fleetIterator = fleets.iterator();
if (fleetIterator.hasNext()) {
fleet = fleetIterator.next();
DummyTrackedRace dummy = new DummyTrackedRace(leaderboard.getAllCompetitors(), regatta, null);
DummyTrackedRace dummy = new DummyTrackedRace(UUID.randomUUID(), leaderboard.getAllCompetitors(), regatta, null, EmptyWindStore.INSTANCE);
raceColumn.setTrackedRace(fleet, dummy);
}
}
@@ -35,7 +35,16 @@
<h2 class="articleHeadline">Analyzing Races, Leaderboards</h2>
<div class="innerContent">
<h2 class="articleSubheadline">July 2014</h2>
<h2 class="articleSubheadline">August 2014</h2>
<ul class="bulletList">
<li>When using the auto-zoom feature from the map settings, boats and wind streamlets will now
continue to move smoothly as long as the map only needs panning.
</li>
</ul>
<h2 class="articleSubheadline">July 2014</h2>
<ul class="bulletList">
<li>The advantage line now uses the wind at the position in the middle of the leg that the