Merge branch 'master' into bug3529

This commit is contained in:
Steffen Schaefer committed 2017-02-09 10:29:16 +01:00
commit 9a0cbf90d8
71 files changed
+1566 -360

No files matched your search

@@ -21,6 +21,8 @@ LeaderboardSailingDomainRetrieverChain=Leaderboards
RaceSailingDomainRetrieverChain=Races
LegSailingDomainRetrieverChain=Legs
GPSFixSailingDomainRetrieverChain=GPS Fixes
BravoFixSailingDomainRetrieverChain=Bravo Fixes
BravoFixTrackSailingDomainRetrieverChain=Bravo Tracks
WindFixSailingDomainRetrieverChain=Wind Fixes
MarkPassingSailingDomainRetrieverChain=Mark Passings
RaceResultSailingDomainRetrieverChain=Race Results
@@ -32,6 +34,8 @@ Leg=Leg
MarkPassing=Mark Passing
LegOfCompetitor=Leg of competitor
GpsFix=GPS Fix
BravoFix=Bravo Fix
BravoFixTrack=Bravo Fix Track
WindFix=Wind Fix
Maneuver=Maneuver
WindStrengthInBeaufort=Wind Strength in Beaufort
@@ -93,4 +97,12 @@ windFrom=True Wind Direction (TWD)
windSpeedKnots=True Wind Speed (kts)
speedInKnots=Speed (kts)
bearing=Course over Ground (°T)
WindTrack=Wind Track
WindTrack=Wind Track
timeSpentFoiling=Time spent foiling
yaw=Yaw
pitch=Pitch
roll=Heel
rideHeight=Ride Height
rideHeightPort=Ride Height Port Hull
rideHeightStarboard=Ride Height Starboard Hull
IsFoiling=Is Foiling
@@ -19,6 +19,8 @@ LeaderboardSailingDomainRetrieverChain=Leaderboards
RaceSailingDomainRetrieverChain=Rennen
LegSailingDomainRetrieverChain=Schenkel
GPSFixSailingDomainRetrieverChain=GPS-Fixes
BravoFixSailingDomainRetrieverChain=Bravo-Fixes
BravoFixTrackSailingDomainRetrieverChain=Bravo Messreihen
WindFixSailingDomainRetrieverChain=Windmessungen
MarkPassingSailingDomainRetrieverChain=Tonnenrundungen
RaceResultSailingDomainRetrieverChain=Rennergebnisse
@@ -30,6 +32,8 @@ Leg=Schenkel
MarkPassing=Tonnenrundung
LegOfCompetitor=Schenkel eines Teilnehmers
GpsFix=GPS-Fix
BravoFix=Bravo-Fix
BravoFixTrack=Bravo-Messreihe
WindFix=Windmessung
Maneuver=Manöver
Speed=Geschwindigkeit
@@ -93,4 +97,12 @@ windFrom=Wind aus Richtung (TWD)
windSpeedKnots=Wahre Windgeschwindigkeit (kn)
speedInKnots=Fahrt (kn)
bearing=Kurs über Grund (°)
WindTrack=Windmessreihe
WindTrack=Windmessreihe
timeSpentFoiling=Zeit auf Foils
yaw=Gierung
pitch=Neigung
roll=Krängung
rideHeight=Foiling-Höhe
rideHeightPort=Foiling-Höhe Backbord-Rumpf
rideHeightStarboard=Foiling-Höhe Steuerbord-Rumpf
IsFoiling=Foilt
@@ -7,6 +7,8 @@ import java.util.Set;
import org.osgi.framework.BundleContext;
import com.sap.sailing.datamining.data.HasBravoFixContext;
import com.sap.sailing.datamining.data.HasBravoFixTrackContext;
import com.sap.sailing.datamining.data.HasGPSFixContext;
import com.sap.sailing.datamining.data.HasLeaderboardContext;
import com.sap.sailing.datamining.data.HasLeaderboardGroupContext;
@@ -26,6 +28,10 @@ import com.sap.sailing.datamining.impl.components.aggregators.ParallelDistanceMa
import com.sap.sailing.datamining.impl.components.aggregators.ParallelDistanceMedianAggregationProcessor;
import com.sap.sailing.datamining.impl.components.aggregators.ParallelDistanceMinAggregationProcessor;
import com.sap.sailing.datamining.impl.components.aggregators.ParallelDistanceSumAggregationProcessor;
import com.sap.sailing.datamining.impl.components.aggregators.ParallelDurationAverageAggregationProcessor;
import com.sap.sailing.datamining.impl.components.aggregators.ParallelDurationMaxAggregationProcessor;
import com.sap.sailing.datamining.impl.components.aggregators.ParallelDurationMinAggregationProcessor;
import com.sap.sailing.datamining.impl.components.aggregators.ParallelDurationSumAggregationProcessor;
import com.sap.sailing.datamining.provider.RacingEventServiceProvider;
import com.sap.sse.datamining.DataSourceProvider;
import com.sap.sse.datamining.components.AggregationProcessorDefinition;
@@ -87,6 +93,8 @@ public class Activator extends AbstractDataMiningActivatorWithPredefinedQueries
internalClasses.add(HasGPSFixContext.class);
internalClasses.add(HasWindTrackContext.class);
internalClasses.add(HasWindFixContext.class);
internalClasses.add(HasBravoFixContext.class);
internalClasses.add(HasBravoFixTrackContext.class);
internalClasses.add(HasManeuverContext.class);
internalClasses.add(HasMarkPassingContext.class);
internalClasses.add(HasRaceOfCompetitorContext.class);
@@ -118,6 +126,10 @@ public class Activator extends AbstractDataMiningActivatorWithPredefinedQueries
aggregators.add(ParallelDistanceMaxAggregationProcessor.getDefinition());
aggregators.add(ParallelDistanceMinAggregationProcessor.getDefinition());
aggregators.add(ParallelDistanceMedianAggregationProcessor.getDefinition());
aggregators.add(ParallelDurationSumAggregationProcessor.getDefinition());
aggregators.add(ParallelDurationAverageAggregationProcessor.getDefinition());
aggregators.add(ParallelDurationMaxAggregationProcessor.getDefinition());
aggregators.add(ParallelDurationMinAggregationProcessor.getDefinition());
aggregators.add(ParallelBearingAverageDegreesAggregationProcessor.getDefinition());
return aggregators;
}
@@ -3,6 +3,8 @@ package com.sap.sailing.datamining;
import java.util.ArrayList;
import java.util.Collection;
import com.sap.sailing.datamining.data.HasBravoFixContext;
import com.sap.sailing.datamining.data.HasBravoFixTrackContext;
import com.sap.sailing.datamining.data.HasGPSFixContext;
import com.sap.sailing.datamining.data.HasLeaderboardContext;
import com.sap.sailing.datamining.data.HasManeuverContext;
@@ -14,6 +16,8 @@ import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
import com.sap.sailing.datamining.data.HasTrackedRaceContext;
import com.sap.sailing.datamining.data.HasWindFixContext;
import com.sap.sailing.datamining.data.HasWindTrackContext;
import com.sap.sailing.datamining.impl.components.BravoFixRetrievalProcessor;
import com.sap.sailing.datamining.impl.components.BravoFixTrackRetrievalProcessor;
import com.sap.sailing.datamining.impl.components.CompetitorOfRaceInLeaderboardRetrievalProcessor;
import com.sap.sailing.datamining.impl.components.GPSFixRetrievalProcessor;
import com.sap.sailing.datamining.impl.components.LeaderboardGroupRetrievalProcessor;
@@ -60,6 +64,12 @@ public class SailingDataRetrievalChainDefinitions {
raceOfCompetitorRetrieverChainDefinition.endWith(TrackedRaceRetrievalProcessor.class, RaceOfCompetitorRetrievalProcessor.class, HasRaceOfCompetitorContext.class, "Competitor");
dataRetrieverChainDefinitions.add(raceOfCompetitorRetrieverChainDefinition);
final DataRetrieverChainDefinition<RacingEventService, HasBravoFixTrackContext> bravoFixTrackRetrieverChainDefinition = new SimpleDataRetrieverChainDefinition<>(
raceOfCompetitorRetrieverChainDefinition, HasBravoFixTrackContext.class, "BravoFixTrackSailingDomainRetrieverChain");
bravoFixTrackRetrieverChainDefinition.endWith(RaceOfCompetitorRetrievalProcessor.class, BravoFixTrackRetrievalProcessor.class,
HasBravoFixTrackContext.class, "BravoFixTrack");
dataRetrieverChainDefinitions.add(bravoFixTrackRetrieverChainDefinition);
final DataRetrieverChainDefinition<RacingEventService, HasTrackedLegOfCompetitorContext> legOfCompetitorRetrieverChainDefinition = new SimpleDataRetrieverChainDefinition<>(
trackedRaceRetrieverChainDefinition, HasTrackedLegOfCompetitorContext.class, "LegSailingDomainRetrieverChain");
legOfCompetitorRetrieverChainDefinition.addAfter(TrackedRaceRetrievalProcessor.class, TrackedLegRetrievalProcessor.class, HasTrackedLegContext.class, "Leg");
@@ -73,6 +83,12 @@ public class SailingDataRetrievalChainDefinitions {
HasGPSFixContext.class, "GpsFix");
dataRetrieverChainDefinitions.add(gpsFixRetrieverChainDefinition);
final DataRetrieverChainDefinition<RacingEventService, HasBravoFixContext> bravoFixRetrieverChainDefinition = new SimpleDataRetrieverChainDefinition<>(
legOfCompetitorRetrieverChainDefinition, HasBravoFixContext.class, "BravoFixSailingDomainRetrieverChain");
bravoFixRetrieverChainDefinition.endWith(TrackedLegOfCompetitorRetrievalProcessor.class, BravoFixRetrievalProcessor.class,
HasBravoFixContext.class, "BravoFix");
dataRetrieverChainDefinitions.add(bravoFixRetrieverChainDefinition);
final DataRetrieverChainDefinition<RacingEventService, HasWindFixContext> windFixRetrieverChainDefinition = new SimpleDataRetrieverChainDefinition<>(
trackedRaceRetrieverChainDefinition, HasWindFixContext.class, "WindFixSailingDomainRetrieverChain");
windFixRetrieverChainDefinition.addAfter(TrackedRaceRetrievalProcessor.class, WindTrackRetrievalProcessor.class, HasWindTrackContext.class, "WindTrack");
@@ -0,0 +1,18 @@
package com.sap.sailing.datamining.data;
import com.sap.sailing.domain.common.tracking.BravoFix;
import com.sap.sse.common.TimePoint;
import com.sap.sse.datamining.annotations.Connector;
public interface HasBravoFixContext extends HasWindOnTrackedLeg {
@Connector(scanForStatistics=false)
HasTrackedLegOfCompetitorContext getTrackedLegOfCompetitorContext();
@Connector(ordinal=1)
BravoFix getBravoFix();
@Override
default TimePoint getTimePoint() {
return getBravoFix().getTimePoint();
}
}
@@ -0,0 +1,17 @@
package com.sap.sailing.datamining.data;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.tracking.BravoFixTrack;
import com.sap.sse.common.Duration;
import com.sap.sse.datamining.annotations.Connector;
import com.sap.sse.datamining.annotations.Statistic;
public interface HasBravoFixTrackContext {
@Connector(scanForStatistics=false)
HasRaceOfCompetitorContext getRaceOfCompetitorContext();
BravoFixTrack<Competitor> getBravoFixTrack();
@Statistic(messageKey="timeSpentFoiling", resultDecimals=1)
Duration getTimeSpentFoiling();
}
@@ -0,0 +1,44 @@
package com.sap.sailing.datamining.impl.components;
import java.util.ArrayList;
import java.util.Collection;
import java.util.concurrent.ExecutorService;
import com.sap.sailing.datamining.data.HasBravoFixContext;
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
import com.sap.sailing.datamining.impl.data.BravoFixWithContext;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.common.tracking.BravoFix;
import com.sap.sailing.domain.tracking.BravoFixTrack;
import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor;
import com.sap.sse.datamining.components.Processor;
import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
public class BravoFixRetrievalProcessor extends AbstractRetrievalProcessor<HasTrackedLegOfCompetitorContext, HasBravoFixContext> {
public BravoFixRetrievalProcessor(ExecutorService executor, Collection<Processor<HasBravoFixContext, ?>> resultReceivers, int retrievalLevel) {
super(HasTrackedLegOfCompetitorContext.class, HasBravoFixContext.class, executor, resultReceivers, retrievalLevel);
}
@Override
protected Iterable<HasBravoFixContext> retrieveData(HasTrackedLegOfCompetitorContext element) {
Collection<HasBravoFixContext> bravoFixesWithContext = new ArrayList<>();
BravoFixTrack<Competitor> bravoFixTrack = element.getTrackedLegContext().getTrackedRaceContext().getTrackedRace().getSensorTrack(element.getCompetitor(), BravoFixTrack.TRACK_NAME);
if (bravoFixTrack != null) {
bravoFixTrack.lockForRead();
try {
TrackedLegOfCompetitor trackedLegOfCompetitor = element.getTrackedLegOfCompetitor();
if (trackedLegOfCompetitor.getStartTime() != null && trackedLegOfCompetitor.getFinishTime() != null) {
for (BravoFix bravoFix : bravoFixTrack.getFixes(trackedLegOfCompetitor.getStartTime(), true, trackedLegOfCompetitor.getFinishTime(), true)) {
BravoFixWithContext gpsFixWithContext = new BravoFixWithContext(element, bravoFix);
bravoFixesWithContext.add(gpsFixWithContext);
}
}
} finally {
bravoFixTrack.unlockAfterRead();
}
}
return bravoFixesWithContext;
}
}
@@ -0,0 +1,40 @@
package com.sap.sailing.datamining.impl.components;
import java.util.ArrayList;
import java.util.Collection;
import java.util.concurrent.ExecutorService;
import com.sap.sailing.datamining.data.HasBravoFixTrackContext;
import com.sap.sailing.datamining.data.HasRaceOfCompetitorContext;
import com.sap.sailing.datamining.impl.data.BravoTrackWithContext;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.tracking.BravoFixTrack;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sse.datamining.components.Processor;
import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
/**
* Retrieves all wind fixes from a {@link TrackedRace} that are provided by wind sources that are not currently
* {@link TrackedRace#getWindSourcesToExclude() excluded}.
*
* @author Axel Uhl (d043530)
*
*/
public class BravoFixTrackRetrievalProcessor extends AbstractRetrievalProcessor<HasRaceOfCompetitorContext, HasBravoFixTrackContext> {
public BravoFixTrackRetrievalProcessor(ExecutorService executor, Collection<Processor<HasBravoFixTrackContext, ?>> resultReceivers, int retrievalLevel) {
super(HasRaceOfCompetitorContext.class, HasBravoFixTrackContext.class, executor, resultReceivers, retrievalLevel);
}
@Override
protected Iterable<HasBravoFixTrackContext> retrieveData(HasRaceOfCompetitorContext element) {
Collection<HasBravoFixTrackContext> bravoTracksWithContext = new ArrayList<>();
final TrackedRace trackedRace = element.getTrackedRaceContext().getTrackedRace();
final BravoFixTrack<Competitor> bravoFixTrack = trackedRace.getSensorTrack(element.getCompetitor(), BravoFixTrack.TRACK_NAME);
if (bravoFixTrack != null) {
bravoTracksWithContext.add(new BravoTrackWithContext(element, bravoFixTrack));
}
return bravoTracksWithContext;
}
}
@@ -15,7 +15,7 @@ public class ParallelDistanceMaxAggregationProcessor extends
AbstractParallelSingleGroupedValueAggregationProcessor<Distance> {
private static final AggregationProcessorDefinition<Distance, Distance> DEFINITION =
new SimpleAggregationProcessorDefinition<>(Distance.class, Distance.class, "Minimum", ParallelDistanceMaxAggregationProcessor.class);
new SimpleAggregationProcessorDefinition<>(Distance.class, Distance.class, "Maximum", ParallelDistanceMaxAggregationProcessor.class);
public static AggregationProcessorDefinition<Distance, Distance> getDefinition() {
return DEFINITION;
@@ -24,7 +24,7 @@ public class ParallelDistanceMaxAggregationProcessor extends
public ParallelDistanceMaxAggregationProcessor(ExecutorService executor,
Collection<Processor<Map<GroupKey, Distance>, ?>> resultReceivers) {
super(executor, resultReceivers, "Minimum");
super(executor, resultReceivers, "Maximum");
}
@Override
@@ -0,0 +1,63 @@
package com.sap.sailing.datamining.impl.components.aggregators;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ExecutorService;
import com.sap.sse.common.Duration;
import com.sap.sse.datamining.components.AggregationProcessorDefinition;
import com.sap.sse.datamining.components.Processor;
import com.sap.sse.datamining.impl.components.GroupedDataEntry;
import com.sap.sse.datamining.impl.components.SimpleAggregationProcessorDefinition;
import com.sap.sse.datamining.impl.components.aggregators.AbstractParallelGroupedDataStoringAggregationProcessor;
import com.sap.sse.datamining.shared.GroupKey;
public class ParallelDurationAverageAggregationProcessor
extends AbstractParallelGroupedDataStoringAggregationProcessor<Duration, Duration> {
private static final AggregationProcessorDefinition<Duration, Duration> DEFINITION =
new SimpleAggregationProcessorDefinition<>(Duration.class, Duration.class, "Average", ParallelDurationAverageAggregationProcessor.class);
public static AggregationProcessorDefinition<Duration, Duration> getDefinition() {
return DEFINITION;
}
private final ParallelDurationSumAggregationProcessor sumAggregationProcessor;
private final Map<GroupKey, Integer> elementAmountPerKey;
public ParallelDurationAverageAggregationProcessor(ExecutorService executor,
Collection<Processor<Map<GroupKey, Duration>, ?>> resultReceivers) {
super(executor, resultReceivers, "Average");
elementAmountPerKey = new HashMap<>();
sumAggregationProcessor = new ParallelDurationSumAggregationProcessor(executor, resultReceivers);
}
@Override
protected void storeElement(GroupedDataEntry<Duration> element) {
incrementElementAmount(element);
sumAggregationProcessor.handleElement(element);
}
private void incrementElementAmount(GroupedDataEntry<Duration> element) {
GroupKey key = element.getKey();
if (!elementAmountPerKey.containsKey(key)) {
elementAmountPerKey.put(key, 0);
}
Integer currentAmount = elementAmountPerKey.get(key);
elementAmountPerKey.put(key, currentAmount + 1);
}
@Override
protected Map<GroupKey, Duration> aggregateResult() {
Map<GroupKey, Duration> result = new HashMap<>();
Map<GroupKey, Duration> sumAggregation = sumAggregationProcessor.getResult();
for (Entry<GroupKey, Duration> sumAggregationEntry : sumAggregation.entrySet()) {
GroupKey key = sumAggregationEntry.getKey();
result.put(key, sumAggregationEntry.getValue().divide(elementAmountPerKey.get(key).doubleValue()));
}
return result;
}
}
@@ -0,0 +1,28 @@
package com.sap.sailing.datamining.impl.components.aggregators;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import com.sap.sse.common.Duration;
import com.sap.sse.datamining.components.AggregationProcessorDefinition;
import com.sap.sse.datamining.components.Processor;
import com.sap.sse.datamining.impl.components.SimpleAggregationProcessorDefinition;
import com.sap.sse.datamining.impl.components.aggregators.AbstractParallelComparableMaxAggregationProcessor;
import com.sap.sse.datamining.shared.GroupKey;
public class ParallelDurationMaxAggregationProcessor extends
AbstractParallelComparableMaxAggregationProcessor<Duration> {
private static final AggregationProcessorDefinition<Duration, Duration> DEFINITION =
new SimpleAggregationProcessorDefinition<>(Duration.class, Duration.class, "Maximum", ParallelDurationMaxAggregationProcessor.class);
public static AggregationProcessorDefinition<Duration, Duration> getDefinition() {
return DEFINITION;
}
public ParallelDurationMaxAggregationProcessor(ExecutorService executor,
Collection<Processor<Map<GroupKey, Duration>, ?>> resultReceivers) {
super(executor, resultReceivers);
}
}
@@ -0,0 +1,28 @@
package com.sap.sailing.datamining.impl.components.aggregators;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import com.sap.sse.common.Duration;
import com.sap.sse.datamining.components.AggregationProcessorDefinition;
import com.sap.sse.datamining.components.Processor;
import com.sap.sse.datamining.impl.components.SimpleAggregationProcessorDefinition;
import com.sap.sse.datamining.impl.components.aggregators.AbstractParallelComparableMinAggregationProcessor;
import com.sap.sse.datamining.shared.GroupKey;
public class ParallelDurationMinAggregationProcessor extends
AbstractParallelComparableMinAggregationProcessor<Duration> {
private static final AggregationProcessorDefinition<Duration, Duration> DEFINITION =
new SimpleAggregationProcessorDefinition<>(Duration.class, Duration.class, "Minimum", ParallelDurationMinAggregationProcessor.class);
public static AggregationProcessorDefinition<Duration, Duration> getDefinition() {
return DEFINITION;
}
public ParallelDurationMinAggregationProcessor(ExecutorService executor,
Collection<Processor<Map<GroupKey, Duration>, ?>> resultReceivers) {
super(executor, resultReceivers);
}
}
@@ -0,0 +1,47 @@
package com.sap.sailing.datamining.impl.components.aggregators;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import com.sap.sse.common.Duration;
import com.sap.sse.datamining.components.AggregationProcessorDefinition;
import com.sap.sse.datamining.components.Processor;
import com.sap.sse.datamining.impl.components.GroupedDataEntry;
import com.sap.sse.datamining.impl.components.SimpleAggregationProcessorDefinition;
import com.sap.sse.datamining.impl.components.aggregators.AbstractParallelGroupedDataAggregationProcessor;
import com.sap.sse.datamining.shared.GroupKey;
public class ParallelDurationSumAggregationProcessor extends
AbstractParallelGroupedDataAggregationProcessor<Duration, Duration> {
private static final AggregationProcessorDefinition<Duration, Duration> DEFINITION =
new SimpleAggregationProcessorDefinition<>(Duration.class, Duration.class, "Sum", ParallelDurationSumAggregationProcessor.class);
public static AggregationProcessorDefinition<Duration, Duration> getDefinition() {
return DEFINITION;
}
private final Map<GroupKey, Duration> results;
public ParallelDurationSumAggregationProcessor(ExecutorService executor, Collection<Processor<Map<GroupKey, Duration>, ?>> resultReceivers) {
super(executor, resultReceivers, "Sum");
results = new HashMap<>();
}
@Override
protected void handleElement(GroupedDataEntry<Duration> element) {
GroupKey key = element.getKey();
if (!results.containsKey(key)) {
results.put(key, element.getDataEntry());
} else {
results.put(key, results.get(key).plus(element.getDataEntry()));
}
}
@Override
protected Map<GroupKey, Duration> getResult() {
return results;
}
}
@@ -0,0 +1,48 @@
package com.sap.sailing.datamining.impl.data;
import com.sap.sailing.datamining.data.HasBravoFixContext;
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
import com.sap.sailing.domain.common.Position;
import com.sap.sailing.domain.common.Wind;
import com.sap.sailing.domain.common.tracking.BravoFix;
public class BravoFixWithContext implements HasBravoFixContext {
private static final long serialVersionUID = -4537126043228674949L;
private final HasTrackedLegOfCompetitorContext trackedLegOfCompetitorContext;
private final BravoFix bravoFix;
private Wind wind;
public BravoFixWithContext(HasTrackedLegOfCompetitorContext trackedLegOfCompetitorContext, BravoFix bravoFix) {
this.trackedLegOfCompetitorContext = trackedLegOfCompetitorContext;
this.bravoFix = bravoFix;
}
@Override
public HasTrackedLegOfCompetitorContext getTrackedLegOfCompetitorContext() {
return trackedLegOfCompetitorContext;
}
@Override
public BravoFix getBravoFix() {
return bravoFix;
}
@Override
public Wind getWindInternal() {
return wind;
}
@Override
public void setWindInternal(Wind wind) {
this.wind = wind;
}
@Override
public Position getPosition() {
return getTrackedLegOfCompetitorContext().getTrackedLegOfCompetitor().getTrackedLeg().getTrackedRace()
.getTrack(getTrackedLegOfCompetitorContext().getCompetitor())
.getEstimatedPosition(getTimePoint(), /* extrapolate */ true);
}
}
@@ -0,0 +1,46 @@
package com.sap.sailing.datamining.impl.data;
import com.sap.sailing.datamining.data.HasBravoFixTrackContext;
import com.sap.sailing.datamining.data.HasRaceOfCompetitorContext;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.tracking.BravoFixTrack;
import com.sap.sse.common.Duration;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.impl.MillisecondsTimePoint;
public class BravoTrackWithContext implements HasBravoFixTrackContext {
private final HasRaceOfCompetitorContext raceOfCompetitorContext;
private final BravoFixTrack<Competitor> bravoFixTrack;
public BravoTrackWithContext(HasRaceOfCompetitorContext raceOfCompetitorContext, BravoFixTrack<Competitor> bravoFixTrack) {
this.raceOfCompetitorContext = raceOfCompetitorContext;
this.bravoFixTrack = bravoFixTrack;
}
@Override
public HasRaceOfCompetitorContext getRaceOfCompetitorContext() {
return raceOfCompetitorContext;
}
@Override
public BravoFixTrack<Competitor> getBravoFixTrack() {
return bravoFixTrack;
}
@Override
public Duration getTimeSpentFoiling() {
final TimePoint endOfRace = getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace().getEndOfRace();
final TimePoint startOfRace = getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace().getStartOfRace();
final TimePoint end;
if (endOfRace == null) {
final TimePoint endOfTracking = getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace().getEndOfTracking();
end = endOfTracking == null ? MillisecondsTimePoint.now() : endOfTracking;
} else {
end = endOfRace;
}
return bravoFixTrack.getTimeSpentFoiling(startOfRace, end);
}
}
@@ -1,6 +1,9 @@
package com.sap.sailing.domain.common.tracking;
import com.sap.sailing.domain.common.Distance;
import com.sap.sailing.domain.common.impl.MeterDistance;
import com.sap.sse.datamining.annotations.Dimension;
import com.sap.sse.datamining.annotations.Statistic;
/**
* Specific {@link SensorFix} for bravo devices (http://www.bravosystems.es/).
@@ -8,21 +11,31 @@ import com.sap.sailing.domain.common.Distance;
* <p><b>NOTE:</b> This fix type is currently used to track ESS foiling data, only.</p>
*/
public interface BravoFix extends SensorFix {
static final Distance MIN_FOILING_HEIGHT_THRESHOLD = new MeterDistance(0.2);
/**
* Gets the ride height (foiling) for this fix.
*
* @return the ride height
*/
@Statistic(messageKey="rideHeight", resultDecimals=1)
Distance getRideHeight();
@Statistic(messageKey="rideHeightPort", resultDecimals=1)
Distance getRideHeightPortHull();
@Statistic(messageKey="rideHeightStarboard", resultDecimals=1)
Distance getRideHeightStarboardHull();
@Dimension(messageKey="IsFoiling")
boolean isFoiling();
@Statistic(messageKey="pitch", resultDecimals=1)
double getPitch();
@Statistic(messageKey="yaw", resultDecimals=1)
double getYaw();
@Statistic(messageKey="roll", resultDecimals=1)
double getRoll();
}
@@ -6,6 +6,7 @@ import com.sap.sailing.domain.common.sensordata.BravoSensorDataMetadata;
import com.sap.sailing.domain.common.tracking.BravoFix;
import com.sap.sailing.domain.common.tracking.DoubleVectorFix;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.Util;
/**
* Implementation of {@link BravoFix} that wraps a {@link DoubleVectorFix} which holds the actual sensor data.
@@ -48,6 +49,11 @@ public class BravoFixImpl implements BravoFix {
return new MeterDistance(fix.get(BravoSensorDataMetadata.INSTANCE.rideHeightStarboardHullColumn));
}
@Override
public boolean isFoiling() {
return Util.min(getRideHeightPortHull(), getRideHeightStarboardHull()).compareTo(MIN_FOILING_HEIGHT_THRESHOLD) >= 0;
}
@Override
public double getPitch() {
return fix.get(BravoSensorDataMetadata.INSTANCE.pitchColumn);
@@ -42,4 +42,5 @@ Require-Bundle: com.googlecode.java-diff-utils;bundle-version="1.3.0",
com.sap.sse,
com.sap.sse.shared.android,
org.apache.commons.math,
com.sap.sailing.declination
com.sap.sailing.declination,
com.sap.sse.datamining.annotations
@@ -4,6 +4,7 @@ import java.io.Serializable;
import com.sap.sailing.domain.common.Distance;
import com.sap.sailing.domain.common.tracking.BravoFix;
import com.sap.sse.common.Duration;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.WithID;
@@ -36,4 +37,9 @@ public interface BravoFixTrack<ItemType extends WithID & Serializable> extends S
* time range.
*/
Distance getAverageRideHeight(TimePoint from, TimePoint to);
/**
* The time spent foiling during the time range provided
*/
Duration getTimeSpentFoiling(TimePoint from, TimePoint to);
}
@@ -8,6 +8,7 @@ import com.sap.sailing.domain.common.tracking.BravoFix;
import com.sap.sailing.domain.tracking.BravoFixTrack;
import com.sap.sailing.domain.tracking.DynamicBravoFixTrack;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sse.common.Duration;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.WithID;
@@ -72,4 +73,29 @@ public class BravoFixTrackImpl<ItemType extends WithID & Serializable> extends S
}
return result;
}
private boolean isFoiling(BravoFix fix) {
return fix.isFoiling();
}
@Override
public Duration getTimeSpentFoiling(TimePoint from, TimePoint to) {
Duration result = Duration.NULL;
lockForRead();
try {
TimePoint last = from;
boolean isFoiling = false;
for (final BravoFix fix : getFixes(from, true, to, true)) {
final boolean fixFoils = isFoiling(fix);
if (isFoiling && fixFoils) {
result = result.plus(last.until(fix.getTimePoint()));
}
last = fix.getTimePoint();
isFoiling = fixFoils;
}
} finally {
unlockAfterRead();
}
return result;
}
}
@@ -6,3 +6,7 @@
/ds.*.bin
/globalMarineNetCroatia.grb
/globalMarineNetCroatia54h.grb
/CWAM_DD_10M_2017020300_024.grib2
/CWAM_SP_10M_2017020300_024.grib2
/wind-Atlantic.24hr.grb
/wind-Atlantic.48hr.grb
@@ -5,6 +5,7 @@ import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.util.List;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -29,6 +30,11 @@ public class Bzip2GridFileReadingTest {
dataSet = GridDataset.open("resources/EWAM_DD_10M_2017011912_050.grib2.bz2");
}
@After
public void tearDown() throws IOException {
dataSet.close();
}
@Test
public void testBoundingBox() {
final LatLonRect boundingBox = dataSet.getBoundingBox();
@@ -47,6 +47,7 @@ public class SimpleGridFileReadingTest {
dataSet = GridDataset.open("resources/Drake.wind.grb");
final LatLonRect boundingBox = dataSet.getBoundingBox();
System.out.println(boundingBox);
dataSet.close();
}
@Test
@@ -68,6 +69,7 @@ public class SimpleGridFileReadingTest {
final float dataAtMiddle = volumeDataAtTime0.get(coordinateIndices[0], coordinateIndices[1]);
System.out.println(dataVariables);
System.out.println(dataAtMiddle);
dataSet.close();
}
@Test
@@ -78,6 +80,7 @@ public class SimpleGridFileReadingTest {
final Position middle = getMiddle(windField);
final TimePoint midTime = windField.getTimeRange().from().plus(windField.getTimeRange().getDuration().divide(2));
System.out.println(windField.getWind(midTime, middle));
dataSet.close();
}
@Test
@@ -89,6 +92,7 @@ public class SimpleGridFileReadingTest {
Calendar cal = new GregorianCalendar(2016, 11, 12, 13, 00, 00);
cal.setTimeZone(TimeZone.getTimeZone("CET"));
System.out.println(windField.getWind(new MillisecondsTimePoint(cal.getTimeInMillis()), middle));
dataSet.close();
}
private Position getMiddle(GribWindField windField) {
@@ -110,6 +114,7 @@ public class SimpleGridFileReadingTest {
final WindWithConfidence<TimePoint> wind = windField.getWind(new MillisecondsTimePoint(cal.getTimeInMillis()), croatia);
assertEquals(3, wind.getObject().getBeaufort(), 2.2);
assertEquals(150, wind.getObject().getFrom().getDegrees(), 20);
dataSet.close();
}
@Test
@@ -124,6 +129,8 @@ public class SimpleGridFileReadingTest {
final WindWithConfidence<TimePoint> wind = windField.getWind(new MillisecondsTimePoint(cal.getTimeInMillis()), middle);
assertEquals(2.5, wind.getObject().getBeaufort(), 0.5);
assertEquals(110, wind.getObject().getFrom().getDegrees(), 10);
dataSetU.close();
dataSetV.close();
}
@Test
@@ -145,6 +152,8 @@ public class SimpleGridFileReadingTest {
cal.setTimeZone(TimeZone.getTimeZone("CET"));
final WindWithConfidence<TimePoint> wind = windField.getWind(new MillisecondsTimePoint(cal.getTimeInMillis()), middle);
assertNotNull(wind.getObject());
dataSetDirection.close();
dataSetSpeed.close();
}
@Test
@@ -158,6 +167,7 @@ public class SimpleGridFileReadingTest {
final WindWithConfidence<TimePoint> wind = windField.getWind(new MillisecondsTimePoint(cal.getTimeInMillis()), croatia);
assertEquals(5, wind.getObject().getBeaufort(), 1.5);
assertEquals(200, wind.getObject().getFrom().getDegrees(), 20);
dataSet.close();
}
@Test
@@ -181,6 +191,7 @@ public class SimpleGridFileReadingTest {
assertEquals(90, wind.getObject().getFrom().getDegrees(), 45); // historic data says NE but we get 130° which matches the SE
// direction from https://www.wunderground.com/history/airport/MUHA/2016/12/12/DailyHistory.html?req_city=Havana&req_state=03&req_statename=Cuba&reqdb.zip=00000&reqdb.magic=1&reqdb.wmo=78224&MR=1
// for 10:55 CST. So we should probably accept that.
dataSet.close();
}
@Test
@@ -201,6 +212,7 @@ public class SimpleGridFileReadingTest {
WindWithConfidence<TimePoint> wind = windField.getWind(new MillisecondsTimePoint(cal.getTimeInMillis()), nassauPosition);
assertEquals(5.2, wind.getObject().getKnots(), 12); // the forecast had it at 16.7kts... what can we do...
assertEquals(112.5, wind.getObject().getFrom().getDegrees(), 30); // historic data says ESE which is approximately 112.5
dataSet.close();
}
@Test
@@ -212,6 +224,7 @@ public class SimpleGridFileReadingTest {
Calendar cal = new GregorianCalendar(2016, 11, 12, 13, 00, 00);
cal.setTimeZone(TimeZone.getTimeZone("CET"));
System.out.println(windField.getWind(new MillisecondsTimePoint(cal.getTimeInMillis()), middle));
dataSet.close();
}
@Test
@@ -233,6 +246,7 @@ public class SimpleGridFileReadingTest {
final float dataAtMiddle = volumeDataAtTime0.get(coordinateIndices[0], coordinateIndices[1]);
System.out.println(dataVariables);
System.out.println(dataAtMiddle);
dataSet.close();
}
@Test
@@ -242,5 +256,7 @@ public class SimpleGridFileReadingTest {
final CalendarDate start = dateRange.getStart();
final CalendarDate end = dateRange.getEnd();
assertTrue(end.isAfter(start));
dataSet.close();
dataSet.release();
}
}
+6 -81
View File
@@ -7,86 +7,11 @@ Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Bundle-ClassPath: .,
lib/netcdfAll-4.6.8.jar
Export-Package: ucar.atd.dorade,
ucar.coord,
ucar.httpservices,
ucar.ma2,
ucar.nc2,
ucar.nc2.constants,
ucar.nc2.dataset,
ucar.nc2.dataset.conv,
ucar.nc2.dataset.transform,
ucar.nc2.dods,
ucar.nc2.dt,
ucar.nc2.dt.grid,
ucar.nc2.dt.grid.gis,
ucar.nc2.dt.image.image,
ucar.nc2.dt.point,
ucar.nc2.dt.point.decode,
ucar.nc2.dt.radial,
ucar.nc2.dt.trajectory,
ucar.nc2.ft,
ucar.nc2.ft.coordsys,
ucar.nc2.ft.fmrc,
ucar.nc2.ft.point,
ucar.nc2.ft.point.bufr,
ucar.nc2.ft.point.collection,
ucar.nc2.ft.point.remote,
ucar.nc2.ft.point.standard,
ucar.nc2.ft.point.standard.plug,
ucar.nc2.ft.point.writer,
ucar.nc2.ft.radial,
ucar.nc2.ft.scan,
ucar.nc2.ft.swath,
ucar.nc2.ft2,
ucar.nc2.geotiff,
ucar.nc2.grib,
ucar.nc2.grib.collection,
ucar.nc2.grib.grib1,
ucar.nc2.grib.grib1.tables,
ucar.nc2.grib.grib2,
ucar.nc2.grib.grib2.table,
ucar.nc2.grib.writer,
ucar.nc2.iosp,
ucar.nc2.iosp.bufr,
ucar.nc2.iosp.bufr.tables,
ucar.nc2.iosp.bufr.writer,
ucar.nc2.iosp.cinrad,
ucar.nc2.iosp.dmsp,
ucar.nc2.iosp.dorade,
ucar.nc2.iosp.fysat,
ucar.nc2.iosp.fysat.util,
ucar.nc2.iosp.gini,
ucar.nc2.iosp.grads,
ucar.nc2.iosp.hdf4,
ucar.nc2.iosp.hdf5,
ucar.nc2.iosp.misc,
ucar.nc2.iosp.netcdf3,
ucar.nc2.iosp.netcdf4,
ucar.nc2.iosp.nexrad2,
ucar.nc2.iosp.nids,
ucar.nc2.iosp.noaa,
ucar.nc2.iosp.nowrad,
ucar.nc2.iosp.shapefile,
ucar.nc2.iosp.sigmet,
ucar.nc2.iosp.uamiv,
ucar.nc2.iosp.uf,
ucar.nc2.jni.netcdf,
ucar.nc2.ncml,
ucar.nc2.rewrite,
ucar.nc2.stream,
ucar.nc2.thredds,
ucar.nc2.time,
ucar.nc2.units,
ucar.nc2.util,
ucar.nc2.util.cache,
ucar.nc2.util.log,
ucar.nc2.util.net,
ucar.nc2.util.rc,
ucar.nc2.util.reflect,
ucar.nc2.util.xml,
ucar.nc2.wmo,
ucar.nc2.write
Export-Package: com.sap.sailing.grib
Require-Bundle: com.sap.sailing.domain.common,
com.sap.sailing.domain,
com.sap.sse.common
com.sap.sse.common,
com.sap.sse
Import-Package: org.osgi.framework
Bundle-ActivationPolicy: lazy
Bundle-Activator: com.sap.sailing.grib.impl.Activator
@@ -4,6 +4,7 @@ import java.io.IOException;
import com.sap.sailing.domain.common.Bounds;
import com.sap.sailing.domain.common.Position;
import com.sap.sailing.domain.common.Wind;
import com.sap.sailing.domain.tracking.WindWithConfidence;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.TimeRange;
@@ -39,4 +40,6 @@ public interface GribWindField {
* The time range covered by the underlying GRIB data.
*/
TimeRange getTimeRange();
Iterable<Wind> getAllWindFixes() throws IOException;
}
@@ -1,5 +1,13 @@
package com.sap.sailing.grib;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Formatter;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.sap.sailing.grib.impl.GribWindFieldFactoryImpl;
import ucar.nc2.ft.FeatureDataset;
@@ -9,13 +17,18 @@ import ucar.nc2.ft.FeatureDataset;
*
* Example Usage:
* <pre>
* final Formatter errorLog = new Formatter(System.err);
* final Formatter errorLog = createLogFormatter(logger, Level.INFO);
* final ucar.nc2.util.CancelTask task = null;
* final String location = "resources/globalMarineNetCroatia.grb.bz2"; // or could be some URI / URL from where to retrieve it
* final FeatureDataset dataSet = FeatureDatasetFactoryManager.open(FeatureType.ANY, location, task, errorLog);
* final GribWindField windField = GribWindFieldFactory.INSTANCE.createGribWindField(dataSet);
* </pre>
*
* Or:
* <pre>
* final GribWindField windField = GribWindFieldFactory.INSTANCE.createGribWindField(new File("/this/is/the/path/to/my/grib/file.grb"));
* </pre>
*
* @author Axel Uhl (D043530)
*
*/
@@ -23,4 +36,47 @@ public interface GribWindFieldFactory {
GribWindFieldFactory INSTANCE = new GribWindFieldFactoryImpl();
GribWindField createGribWindField(FeatureDataset... dataSet);
GribWindField createGribWindField(Iterable<String> locations) throws IOException;
GribWindField createGribWindField(Logger logger, Level level, Iterable<String> locations) throws IOException;
GribWindField createGribWindField(Formatter errorLog, Iterable<String> locations) throws IOException;
GribWindField createGribWindFieldFromFiles(Iterable<File> files) throws IOException;
GribWindField createGribWindFieldFromFiles(Formatter errorLog, Iterable<File> files) throws IOException;
GribWindField createGribWindFieldFromFiles(Logger logger, Level level, Iterable<File> files) throws IOException;
/**
* Requires that the $TMP part of the file system can be accessed for writing because the files will temporarily be
* stored there.
*/
GribWindField createGribWindFieldFromStreams(Map<InputStream, String> inputStreamsAndFilenames) throws IOException;
/**
* Requires that the $TMP part of the file system can be accessed for writing because the files will temporarily be
* stored there.
*/
GribWindField createGribWindFieldFromStreams(Formatter errorLog, Map<InputStream, String> inputStreamsAndFilenames) throws IOException;
/**
* Requires that the $TMP part of the file system can be accessed for writing because the files will temporarily be
* stored there.
*/
GribWindField createGribWindFieldFromStreams(Logger logger, Level level, Map<InputStream, String> inputStreamsAndFilenames) throws IOException;
/**
* Creates a {@link Formatter} that writes its messages to the {@code logger} using the log {@code level} provided.
* Use this method to create formatters for the {@code createGribWindField...} methods that require one.
*/
Formatter createLogFormatter(Logger logger, Level level);
/**
* To be called when the bundle shuts down; all resources can be released now, and all persistent file
* caches can be cleaned.
*/
void shutdown();
}
@@ -1,8 +1,10 @@
package com.sap.sailing.grib.impl;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.stream.StreamSupport;
@@ -22,6 +24,7 @@ import com.sap.sse.common.impl.MillisecondsTimePoint;
import com.sap.sse.common.impl.TimeRangeImpl;
import ucar.ma2.Array;
import ucar.ma2.Index;
import ucar.nc2.Dimension;
import ucar.nc2.dataset.VariableDS;
import ucar.nc2.dt.GridCoordSystem;
@@ -227,12 +230,50 @@ public abstract class AbstractGribWindFieldImpl implements GribWindField {
return getNearestNonNaNValueWithPosition(coordinateSystem, grid, timeIndex, zIndex, yIndex, xIndex, distance+1);
}
private double getValue(GridDatatype grid, int timeIndex, int zIndex, final int x, final int y) throws IOException {
protected double getValue(GridDatatype grid, int timeIndex, int zIndex, final int x, final int y) throws IOException {
final Array arrayForTimePointBefore = grid.readDataSlice(timeIndex, zIndex, y, x);
final double valueAsFloat = (double) arrayForTimePointBefore.getFloat(0);
return valueAsFloat;
}
/**
* Instead of using {@link GridDatatype#readDataSlice(int, int, int, int)} which really reads from the file(s),
* use an already read {@link Array} of mass data here.
*/
protected double getValue(Array gridData, int zIndex, final int x, final int y) throws IOException {
final double valueAsFloat;
if (gridData.getRank() == 3) { // includes z dimension
valueAsFloat = gridData.getDouble(Index.factory(new int[] { zIndex, y, x }));
} else {
valueAsFloat = gridData.getDouble(Index.factory(new int[] { y, x }));
}
return valueAsFloat;
}
@FunctionalInterface
static interface ValueForCoordinateProvider<T> {
T getValue(Array gridData, int timeIndex, Index index, TimePoint timePoint, Position position);
}
protected <T> Iterable<T> foreach(GridDatatype grid, ValueForCoordinateProvider<T> provider) throws IOException {
final List<T> result = new ArrayList<>();
final GridCoordSystem coordinateSystem = grid.getCoordinateSystem();
final int timeDimLength = grid.getTimeDimension().getLength();
for (int t=0; t<timeDimLength; t++) {
final TimePoint timePoint = toTimePoint(coordinateSystem.getTimeAxis1D().getCalendarDate(t));
final Array gridData = grid.readVolumeData(t);
final long arraySize = gridData.getSize();
final Index index = gridData.getIndex();
for (long i=0; i<arraySize; i++) {
final Position position = toPosition(coordinateSystem.getLatLon(/* x */ index.getCurrentCounter()[index.getCurrentCounter().length-1],
/* y */ index.getCurrentCounter()[index.getCurrentCounter().length-2]));
result.add(provider.getValue(gridData, t, index, timePoint, position));
index.incr();
}
}
return result;
}
protected Optional<String> getUnit(VariableDS variable) {
final Optional<String> result;
final ucar.nc2.Attribute attribute = variable.findAttribute("units");
@@ -0,0 +1,21 @@
package com.sap.sailing.grib.impl;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import com.sap.sailing.grib.GribWindFieldFactory;
public class Activator implements BundleActivator {
private GribWindFieldFactory factory;
@Override
public void start(BundleContext context) throws Exception {
factory = GribWindFieldFactoryImpl.INSTANCE;
}
@Override
public void stop(BundleContext context) throws Exception {
factory.shutdown();
}
}
@@ -1,11 +1,109 @@
package com.sap.sailing.grib.impl;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Formatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.sap.sailing.grib.GribWindField;
import com.sap.sailing.grib.GribWindFieldFactory;
import com.sap.sse.common.util.MappingIterable;
import com.sap.sse.util.LoggerAppender;
import ucar.nc2.constants.FeatureType;
import ucar.nc2.ft.FeatureDataset;
import ucar.nc2.ft.FeatureDatasetFactoryManager;
public class GribWindFieldFactoryImpl implements GribWindFieldFactory {
private static final Logger logger = Logger.getLogger(GribWindFieldFactoryImpl.class.getName());
private static final Level DEFAULT_ERROR_LOG_LEVEL = Level.INFO;
/**
* Weak references inserted into {@link #filesToCleanWhenGribWindFieldNoLongerUsed} must be registered with this
* queue. When such a registration happens, a {@link #fileSystemCleaner} thread must be started while holding this
* object's monitor (synchronized). The thread is then responsible for observing the queue and cleaning the
* directories. When, while holding the monitor, the {@link #filesToCleanWhenGribWindFieldNoLongerUsed} map becomes
* empty, the thread terminates and sets the {@link #fileSystemCleaner} field to {@code null} so that a new thread
* must be created the next time a reference is entered into the map.
*/
private final ReferenceQueue<GribWindField> referenceQueue = new ReferenceQueue<>();
private Thread fileSystemCleaner;
private final Map<WeakReference<GribWindField>, File> filesToCleanWhenGribWindFieldNoLongerUsed = new HashMap<>();
private void removeDirectoryWhenWindFieldNoLongerStronglyReferenced(GribWindField windField, File directoryToRemove) {
assert directoryToRemove.isDirectory();
synchronized (this) {
final boolean needToStartThread = filesToCleanWhenGribWindFieldNoLongerUsed.isEmpty();
filesToCleanWhenGribWindFieldNoLongerUsed.put(new WeakReference<GribWindField>(windField, referenceQueue), directoryToRemove);
if (needToStartThread && fileSystemCleaner == null) {
fileSystemCleaner = new Thread(()->{
boolean finished = false;
while (!finished) {
try {
final Reference<? extends GribWindField> ref = referenceQueue.remove();
finished = cleanup(ref);
} catch (InterruptedException e) {
logger.log(Level.WARNING, "Interrupted while waiting for weak reference, giving up", e);
finished = true;
}
}
}, "GRIB directory cleaner");
fileSystemCleaner.setDaemon(true);
fileSystemCleaner.start();
}
}
}
private boolean cleanup(final Reference<? extends GribWindField> ref) {
boolean finished;
final File dir;
synchronized (GribWindFieldFactoryImpl.this) {
dir = filesToCleanWhenGribWindFieldNoLongerUsed.remove(ref);
finished = filesToCleanWhenGribWindFieldNoLongerUsed.isEmpty();
if (finished) {
fileSystemCleaner = null;
}
}
rm_rf(dir);
return finished;
}
@Override
public synchronized void shutdown() {
// clone key set because cleanup will remove the reference from filesToCleanWhenGribWindFieldNoLongerUsed
// which would lead to a ConcurrentModificationException otherwise.
for (final WeakReference<GribWindField> ref : new ArrayList<>(filesToCleanWhenGribWindFieldNoLongerUsed.keySet())) {
cleanup(ref);
}
}
/**
* Removes directory and all its contents
*/
private void rm_rf(File dir) {
assert dir.isDirectory();
for (final File f : dir.listFiles(f->true)) {
if (f.isDirectory()) {
rm_rf(f);
} else {
f.delete();
}
}
dir.delete();
}
@Override
public GribWindField createGribWindField(FeatureDataset... dataSets) {
final GribWindField result;
@@ -18,4 +116,86 @@ public class GribWindFieldFactoryImpl implements GribWindFieldFactory {
}
return result;
}
@Override
public GribWindField createGribWindField(Iterable<String> locations) throws IOException {
return createGribWindField(logger, DEFAULT_ERROR_LOG_LEVEL, locations);
}
@Override
public GribWindField createGribWindField(Logger logger, Level level, Iterable<String> locations) throws IOException {
final Formatter errorLog = createLogFormatter(logger, level);
return createGribWindField(errorLog, locations);
}
@Override
public GribWindField createGribWindField(Formatter errorLog, Iterable<String> locations) throws IOException {
final List<FeatureDataset> dataSets = new ArrayList<>();
for (final String location : locations) {
FeatureDataset dataSet = FeatureDatasetFactoryManager.open(FeatureType.ANY, location, /* task */ null, errorLog);
dataSets.add(dataSet);
}
return createGribWindField(dataSets.toArray(new FeatureDataset[0]));
}
@Override
public GribWindField createGribWindFieldFromFiles(Iterable<File> files) throws IOException {
return createGribWindFieldFromFiles(logger, DEFAULT_ERROR_LOG_LEVEL, files);
}
@Override
public GribWindField createGribWindFieldFromFiles(Logger logger, Level level, Iterable<File> files)
throws IOException {
return createGribWindFieldFromFiles(createLogFormatter(logger, level), files);
}
@Override
public GribWindField createGribWindFieldFromFiles(Formatter errorLog, Iterable<File> files) throws IOException {
return createGribWindField(errorLog, new MappingIterable<>(files,
f->{ try { return f.getCanonicalPath(); } catch (Exception e) { logger.log(Level.SEVERE, "Error obtaining GRIB file path", e); return null; } }));
}
@Override
public GribWindField createGribWindFieldFromStreams(Map<InputStream, String> streamsAndFilenames) throws IOException {
return createGribWindFieldFromStreams(logger, DEFAULT_ERROR_LOG_LEVEL, streamsAndFilenames);
}
@Override
public GribWindField createGribWindFieldFromStreams(Logger logger, Level level, Map<InputStream, String> streamsAndFilenames)
throws IOException {
return createGribWindFieldFromStreams(createLogFormatter(logger, level), streamsAndFilenames);
}
@Override
public GribWindField createGribWindFieldFromStreams(Formatter errorLog, Map<InputStream, String> streamsAndFilenames)
throws IOException {
final List<File> files = new ArrayList<>();
for (final Entry<InputStream, String> e : streamsAndFilenames.entrySet()) {
files.add(copyStreamToFile(e.getKey(), e.getValue()));
}
final GribWindField result = createGribWindFieldFromFiles(errorLog, files);
for (final File file : files) {
removeDirectoryWhenWindFieldNoLongerStronglyReferenced(result, file.getParentFile());
}
return result;
}
/**
* Copies the contents of the input stream {@code s} into a temporary directory that is created solely for this
* purpose. The {@code filename} will be used for the name of the file. The {@link File} object representing the
* file written is returned so that it and its containing directory can be removed when the contents of the stream
* are no longer needed.
*/
private File copyStreamToFile(InputStream s, String filename) throws IOException {
Path tempDir = Files.createTempDirectory("gribcache");
Path filePath = tempDir.resolve(filename);
Files.copy(s, filePath);
return filePath.toFile();
}
@Override
public Formatter createLogFormatter(Logger logger, Level level) {
return new Formatter(new LoggerAppender(level, logger));
}
}
@@ -1,6 +1,13 @@
package com.sap.sailing.grib.impl;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.sap.sailing.domain.common.Position;
import com.sap.sailing.domain.common.Wind;
@@ -12,11 +19,14 @@ import com.sap.sailing.domain.tracking.impl.WindWithConfidenceImpl;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.Util.Triple;
import ucar.ma2.Array;
import ucar.ma2.Index;
import ucar.nc2.dt.GridDatatype;
import ucar.nc2.dt.grid.GridDataset;
import ucar.nc2.ft.FeatureDataset;
public class SpeedAndDirectionWindField extends AbstractGribWindFieldImpl {
private static final Logger logger = Logger.getLogger(SpeedAndDirectionWindField.class.getName());
private static final int WIND_DIRECTION_PARAMETER_ID = 31;
private static final int WIND_DIRECTION_GRIB2_DISCIPLINE = 0;
private static final int WIND_DIRECTION_GRIB2_PARAMETER_CATEGORY = 2;
@@ -63,16 +73,23 @@ public class SpeedAndDirectionWindField extends AbstractGribWindFieldImpl {
final double confidence;
if (directionComponentInDegreesTrue != null && speedComponentInMetersPerSecond != null) {
confidence = getTimeConfidence(timePoint, directionComponentInDegreesTrue.getB());
wind = new WindImpl(directionComponentInDegreesTrue.getC(), directionComponentInDegreesTrue.getB(),
new MeterPerSecondSpeedWithDegreeBearingImpl(speedComponentInMetersPerSecond.getA(),
// we're getting the "from" direction from the GRIB file and need to convert to "to" here
new DegreeBearingImpl(directionComponentInDegreesTrue.getA()).reverse()));
wind = createWindFixFromDirectionAndSpeed(directionComponentInDegreesTrue.getC(), directionComponentInDegreesTrue.getB(),
speedComponentInMetersPerSecond.getA(),
// we're getting the "from" direction from the GRIB file and need to convert to "to" here
directionComponentInDegreesTrue.getA());
} else {
wind = null;
confidence = 0;
}
return new WindWithConfidenceImpl<TimePoint>(wind, confidence*getBaseConfidence(), timePoint, /* useSpeed */ true);
}
private Wind createWindFixFromDirectionAndSpeed(Position position, TimePoint timePoint, double speedInMetersPerSecond, double fromTrueDirectionInDeg) {
return new WindImpl(position, timePoint,
new MeterPerSecondSpeedWithDegreeBearingImpl(speedInMetersPerSecond,
// we're getting the "from" direction from the GRIB file and need to convert to "to" here
new DegreeBearingImpl(fromTrueDirectionInDeg).reverse()));
}
/**
* Checks whether the data set has a wind speed variable (GRIB parameter #32) and a wind direction variable
@@ -82,4 +99,53 @@ public class SpeedAndDirectionWindField extends AbstractGribWindFieldImpl {
return hasVariable(windDirectionVariableSpecification, dataSets) && hasVariable(windSpeedVariableSpecification, dataSets);
}
@Override
public Iterable<Wind> getAllWindFixes() throws IOException {
final List<Wind> result = new ArrayList<>();
GridDatatype directionGrid = null;
GridDatatype speedGrid = null;
for (final FeatureDataset dataSet : getDataSets()) {
for (Iterator<GridDatatype> i=((GridDataset) dataSet).getGrids().iterator(); i.hasNext() && (directionGrid==null || speedGrid==null); ) {
final GridDatatype grid = i.next();
if (windDirectionVariableSpecification.matches(grid.getVariable())) {
assert isDegreesTrue(getUnit(grid.getVariable()).get());
directionGrid = grid;
} else if (windSpeedVariableSpecification.matches(grid.getVariable())) {
assert isMetersPerSecond(getUnit(grid.getVariable()).get());
speedGrid = grid;
}
}
}
if (directionGrid != null && speedGrid != null) {
final GridDatatype finalSpeedGrid = speedGrid;
final Map<Integer, Array> speedGridDataCache = new HashMap<>();
for (final Wind wind : foreach(directionGrid, (Array directionGridData, int timeIndex, Index index, TimePoint timePoint, Position position)->{
try {
final Wind wind;
Array speedGridData = speedGridDataCache.get(timeIndex);
if (speedGridData == null) {
speedGridData = finalSpeedGrid.readVolumeData(timeIndex);
speedGridDataCache.put(timeIndex, speedGridData);
}
double speedInMetersPerSecond = speedGridData.getDouble(index);
double trueDirectionFromInDeg = directionGridData.getDouble(index);
if (!Double.isNaN(speedInMetersPerSecond) && !Double.isNaN(trueDirectionFromInDeg)) {
wind = createWindFixFromDirectionAndSpeed(position, timePoint, speedInMetersPerSecond, trueDirectionFromInDeg);
} else {
wind = null;
}
return wind;
} catch (Exception e) {
logger.log(Level.INFO, "Exception trying to compute wind from speed and direction", e);
return null;
}
})) {
if (wind != null) {
result.add(wind);
}
};
}
return result;
}
}
@@ -1,6 +1,14 @@
package com.sap.sailing.grib.impl;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.sap.sailing.domain.common.Position;
import com.sap.sailing.domain.common.Wind;
@@ -12,11 +20,14 @@ import com.sap.sailing.domain.tracking.impl.WindWithConfidenceImpl;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.Util.Triple;
import ucar.ma2.Array;
import ucar.ma2.Index;
import ucar.nc2.dt.GridDatatype;
import ucar.nc2.dt.grid.GridDataset;
import ucar.nc2.ft.FeatureDataset;
public class UVWindField extends AbstractGribWindFieldImpl {
private static final Logger logger = Logger.getLogger(UVWindField.class.getName());
private static final int U_COMPONENT_OF_WIND_PARAMETER_ID = 33;
private static final int U_COMPONENT_OF_WIND_GRIB2_DISCIPLINE = 0;
private static final int U_COMPONENT_OF_WIND_GRIB2_PARAMETER_CATEGORY = 2;
@@ -63,11 +74,8 @@ public class UVWindField extends AbstractGribWindFieldImpl {
}
if (uComponentInMetersPerSecond != null && vComponentInMetersPerSecond != null) {
confidence = getTimeConfidence(timePoint, uComponentInMetersPerSecond.getB());
final double atan2 = Math.atan2(uComponentInMetersPerSecond.getA(), vComponentInMetersPerSecond.getA());
wind = new WindImpl(uComponentInMetersPerSecond.getC(), uComponentInMetersPerSecond.getB(),
new MeterPerSecondSpeedWithDegreeBearingImpl(Math.sqrt(uComponentInMetersPerSecond.getA()*uComponentInMetersPerSecond.getA()+
vComponentInMetersPerSecond.getA()*vComponentInMetersPerSecond.getA()),
new RadianBearingImpl(atan2>0 ? atan2 : 2*Math.PI+atan2)));
wind = createWindFixFromUAndV(uComponentInMetersPerSecond.getC(), uComponentInMetersPerSecond.getB(),
uComponentInMetersPerSecond.getA(), vComponentInMetersPerSecond.getA());
} else {
wind = null;
confidence = 0;
@@ -82,4 +90,64 @@ public class UVWindField extends AbstractGribWindFieldImpl {
public static boolean handles(FeatureDataset... dataSets) {
return hasVariable(uComponentOfWindVariableSpecification, dataSets) && hasVariable(vComponentOfWindVariableSpecification, dataSets);
}
@Override
public Iterable<Wind> getAllWindFixes() throws IOException {
final List<Wind> result = new ArrayList<>();
for (final FeatureDataset dataSet : getDataSets()) {
GridDatatype uGrid = null;
GridDatatype vGrid = null;
for (Iterator<GridDatatype> i=((GridDataset) dataSet).getGrids().iterator(); i.hasNext() && (uGrid==null || vGrid==null); ) {
final GridDatatype grid = i.next();
if (uComponentOfWindVariableSpecification.matches(grid.getVariable())) {
assert isMetersPerSecond(getUnit(grid.getVariable()).get());
uGrid = grid;
} else if (vComponentOfWindVariableSpecification.matches(grid.getVariable())) {
assert isMetersPerSecond(getUnit(grid.getVariable()).get());
vGrid = grid;
}
}
if (uGrid != null && vGrid != null) {
final GridDatatype finalVGrid = vGrid;
final Map<Integer, Array> vGridDataCache = new HashMap<>();
for (final Wind wind : foreach(uGrid, (Array uGridData, int timeIndex, Index index, TimePoint timePoint, Position position)->{
assert Arrays.equals(index.getShape(), uGridData.getShape());
try {
final Wind wind;
Array vGridData = vGridDataCache.get(timeIndex);
if (vGridData == null) {
vGridData = finalVGrid.readVolumeData(timeIndex);
vGridDataCache.put(timeIndex, vGridData);
}
double uComponentInMetersPerSecond = uGridData.getDouble(index);
double vComponentInMetersPerSecond = vGridData.getDouble(index);
if (!Double.isNaN(uComponentInMetersPerSecond) && !Double.isNaN(vComponentInMetersPerSecond)) {
wind = createWindFixFromUAndV(position, timePoint, uComponentInMetersPerSecond, vComponentInMetersPerSecond);
} else {
wind = null;
}
return wind;
} catch (Exception e) {
logger.log(Level.INFO, "Exception trying to compute wind from speed and direction", e);
return null;
}
})) {
if (wind != null) {
result.add(wind);
}
};
}
}
return result;
}
private Wind createWindFixFromUAndV(Position position, TimePoint timePoint, double uComponentInMetersPerSecond,
double vComponentInMetersPerSecond) {
final double atan2 = Math.atan2(uComponentInMetersPerSecond, vComponentInMetersPerSecond);
return new WindImpl(position, timePoint,
new MeterPerSecondSpeedWithDegreeBearingImpl(
Math.sqrt(uComponentInMetersPerSecond * uComponentInMetersPerSecond
+ vComponentInMetersPerSecond * vComponentInMetersPerSecond),
new RadianBearingImpl(atan2 > 0 ? atan2 : 2 * Math.PI + atan2)));
}
}
-12
View File
@@ -6,18 +6,6 @@
<stringAttribute key="com.google.gwt.eclipse.core.CLASSIC_DEVMODE_CODE_SERVER_PORT" value="9876"/>
<stringAttribute key="com.google.gwt.eclipse.core.CODE_SERVER_PORT" value="9876"/>
<listAttribute key="com.google.gwt.eclipse.core.ENTRY_POINT_MODULES">
<listEntry value="com.sap.sailing.gwt.ui.EmbeddedMapAndWindChart"/>
<listEntry value="com.sap.sailing.gwt.ui.RaceBoard"/>
<listEntry value="com.sap.sailing.gwt.ui.DataMining"/>
<listEntry value="com.sap.sailing.gwt.ui.LeaderboardEditing"/>
<listEntry value="com.sap.sailing.gwt.ui.Spectator"/>
<listEntry value="com.sap.sailing.gwt.regattaoverview.RegattaOverview"/>
<listEntry value="com.sap.sailing.gwt.ui.Leaderboard"/>
<listEntry value="com.sap.sailing.gwt.ui.Simulator"/>
<listEntry value="com.sap.sailing.gwt.ui.YoutubePopup"/>
<listEntry value="com.sap.sailing.gwt.AutoPlay"/>
<listEntry value="com.sap.sailing.gwt.ui.AdminConsole"/>
<listEntry value="com.sap.sailing.gwt.home.Home"/>
<listEntry value="com.sap.sailing.gwt.AutoPlay"/>
</listAttribute>
<booleanAttribute key="com.google.gwt.eclipse.core.SUPERDEVMODE_ENABLED" value="true"/>
@@ -86,6 +86,7 @@ public class WindPanel extends FormPanel implements RegattasDisplayer, WindShowe
private static final String EXPEDITON_IMPORT_PARAMETER_BOAT_ID = "boatId";
private static final String URL_SAILINGSERVER_EXPEDITION_IMPORT = "/../../sailingserver/expedition-import";
private static final String URL_SAILINGSERVER_GRIB_IMPORT = "/../../sailingserver/grib-wind-import";
private final SailingServiceAsync sailingService;
private final ErrorReporter errorReporter;
@@ -254,6 +255,7 @@ public class WindPanel extends FormPanel implements RegattasDisplayer, WindShowe
windFixesDisplayPanel.add(rawWindFixesTable);
mainPanel.add(createExpeditionWindImportPanel());
mainPanel.add(createGribWindImportPanel());
mainPanel.add(createIgtimiWindImportPanel(mainPanel));
}
@@ -309,30 +311,53 @@ public class WindPanel extends FormPanel implements RegattasDisplayer, WindShowe
contentPanel.add(resultReport);
return igtimiWindImportRootPanel;
}
private CaptionPanel createExpeditionWindImportPanel() {
private static class WindImportFileUploadForm {
private final FormPanel formPanel;
private final VerticalPanel formContentPanel;
private final FileUpload fileUpload;
private final Button submitButton;
public WindImportFileUploadForm(FormPanel formPanel, VerticalPanel formContentPanel, FileUpload fileUpload, Button submitButton) {
super();
this.formPanel = formPanel;
this.formContentPanel = formContentPanel;
this.fileUpload = fileUpload;
this.submitButton = submitButton;
}
public FormPanel getFormPanel() {
return formPanel;
}
public FileUpload getFileUpload() {
return fileUpload;
}
public Button getSubmitButton() {
return submitButton;
}
public VerticalPanel getFormContentPanel() {
return formContentPanel;
}
}
/**
* Creates a file upload form that works with {@code AbstractWindImportServlet} on the server side. In particular,
* the race selection is managed in a hidden field named {@link #EXPEDITON_IMPORT_PARAMETER_RACES}, and the
* {@code upload} element is the MIME multipart file upload form element. The form uses {@code POST} as its method.
*
* The submit button is initially disabled. Callers can implement their own logic based, e.g., on event handlers they
* add to the form panel or other elements that enable it.
*/
private WindImportFileUploadForm createWindImportFileUploadForm(String relativeUploadUrl, boolean multi) {
/*
* To style the "browse" button of the file upload widget
* see http://www.shauninman.com/archive/2007/09/10/styling_file_inputs_with_css_and_the_dom
*/
CaptionPanel windImportRootPanel = new CaptionPanel(stringMessages.windImport_Title());
VerticalPanel windImportContentPanel = new VerticalPanel();
windImportRootPanel.add(windImportContentPanel);
final FormPanel form = new FormPanel();
windImportContentPanel.add(form);
VerticalPanel formContentPanel = new VerticalPanel();
form.add(formContentPanel);
HorizontalPanel inputPanel = new HorizontalPanel();
formContentPanel.add(inputPanel);
final Panel importResultPanel = new VerticalPanel();
windImportContentPanel.add(importResultPanel);
formContentPanel.add(importResultPanel);
form.setMethod(FormPanel.METHOD_POST);
form.setEncoding(FormPanel.ENCODING_MULTIPART);
form.setAction(GWT.getHostPageBaseURL() + URL_SAILINGSERVER_EXPEDITION_IMPORT);
final TextBox boatIdTextBox = new TextBox();
boatIdTextBox.setName(EXPEDITON_IMPORT_PARAMETER_BOAT_ID);
form.setAction(GWT.getHostPageBaseURL() + relativeUploadUrl);
final Button submitButton = new Button(stringMessages.windImport_Upload(), new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
@@ -341,44 +366,15 @@ public class WindPanel extends FormPanel implements RegattasDisplayer, WindShowe
}
});
submitButton.setEnabled(false);
final FileUpload fileUpload = new FileUpload();
fileUpload.setName("upload");
fileUpload.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
importResultPanel.clear();
String fileName = fileUpload.getFilename();
boolean isValidFileName = (fileName != null) && (fileUpload.getFilename().trim().length() > 0);
submitButton.setEnabled(isValidFileName);
String boatId = "";
if (isValidFileName) {
RegExp EXPEDITION_EXPORT_FILE_PATTERN = RegExp.compile("^.*_([0-9]+)\\.csv"); //matches typical expedition log file names like "2013Jun26_0.csv" where 0 as group[1] indicates the boat id.
MatchResult match = EXPEDITION_EXPORT_FILE_PATTERN.exec(fileName);
if (match != null && match.getGroupCount() > 0) {
boatId = match.getGroup(1);
}
}
boatIdTextBox.setText(boatId);
}
});
inputPanel.add(fileUpload);
Label boatIdLabel = new Label(stringMessages.windImport_BoatId());
inputPanel.add(boatIdLabel);
inputPanel.add(boatIdTextBox);
boatIdLabel.setWordWrap(false);
inputPanel.setSpacing(5);
inputPanel.setCellVerticalAlignment(fileUpload, HasVerticalAlignment.ALIGN_MIDDLE);
inputPanel.setCellVerticalAlignment(boatIdLabel, HasVerticalAlignment.ALIGN_MIDDLE);
inputPanel.setCellVerticalAlignment(boatIdTextBox, HasVerticalAlignment.ALIGN_MIDDLE);
if (multi) {
fileUpload.getElement().setAttribute("multiple", "multiple");
}
final Hidden hiddenRacesField = new Hidden(EXPEDITON_IMPORT_PARAMETER_RACES);
inputPanel.add(hiddenRacesField);
formContentPanel.add(hiddenRacesField);
formContentPanel.add(fileUpload);
formContentPanel.add(submitButton);
form.addSubmitHandler(new FormPanel.SubmitHandler() {
public void onSubmit(SubmitEvent event) {
if ((fileUpload.getFilename() != null) && (fileUpload.getFilename().trim().length() > 0)) {
@@ -429,9 +425,84 @@ public class WindPanel extends FormPanel implements RegattasDisplayer, WindShowe
}
}
});
return new WindImportFileUploadForm(form, formContentPanel, fileUpload, submitButton);
}
private CaptionPanel createExpeditionWindImportPanel() {
/*
* To style the "browse" button of the file upload widget
* see http://www.shauninman.com/archive/2007/09/10/styling_file_inputs_with_css_and_the_dom
*/
final WindImportFileUploadForm formAndFileUploadAndSubmitButton = createWindImportFileUploadForm(URL_SAILINGSERVER_EXPEDITION_IMPORT, /* multi */ true);
CaptionPanel windImportRootPanel = new CaptionPanel(stringMessages.windImport_Title());
VerticalPanel windImportContentPanel = new VerticalPanel();
windImportRootPanel.add(windImportContentPanel);
final FormPanel form = formAndFileUploadAndSubmitButton.getFormPanel();
windImportContentPanel.add(form);
VerticalPanel formContentPanel = formAndFileUploadAndSubmitButton.getFormContentPanel();
HorizontalPanel inputPanel = new HorizontalPanel();
formContentPanel.add(inputPanel);
final Panel importResultPanel = new VerticalPanel();
windImportContentPanel.add(importResultPanel);
final TextBox boatIdTextBox = new TextBox();
boatIdTextBox.setName(EXPEDITON_IMPORT_PARAMETER_BOAT_ID);
final Button submitButton = formAndFileUploadAndSubmitButton.getSubmitButton();
final FileUpload fileUpload = formAndFileUploadAndSubmitButton.getFileUpload();
fileUpload.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
importResultPanel.clear();
String fileName = fileUpload.getFilename();
boolean isValidFileName = (fileName != null) && (fileUpload.getFilename().trim().length() > 0);
submitButton.setEnabled(isValidFileName);
String boatId = "";
if (isValidFileName) {
RegExp EXPEDITION_EXPORT_FILE_PATTERN = RegExp.compile("^.*_([0-9]+)\\.csv"); //matches typical expedition log file names like "2013Jun26_0.csv" where 0 as group[1] indicates the boat id.
MatchResult match = EXPEDITION_EXPORT_FILE_PATTERN.exec(fileName);
if (match != null && match.getGroupCount() > 0) {
boatId = match.getGroup(1);
}
}
boatIdTextBox.setText(boatId);
}
});
Label boatIdLabel = new Label(stringMessages.windImport_BoatId());
inputPanel.add(boatIdLabel);
inputPanel.add(boatIdTextBox);
boatIdLabel.setWordWrap(false);
inputPanel.setSpacing(5);
inputPanel.setCellVerticalAlignment(fileUpload, HasVerticalAlignment.ALIGN_MIDDLE);
inputPanel.setCellVerticalAlignment(boatIdLabel, HasVerticalAlignment.ALIGN_MIDDLE);
inputPanel.setCellVerticalAlignment(boatIdTextBox, HasVerticalAlignment.ALIGN_MIDDLE);
return windImportRootPanel;
}
private CaptionPanel createGribWindImportPanel() {
/*
* To style the "browse" button of the file upload widget
* see http://www.shauninman.com/archive/2007/09/10/styling_file_inputs_with_css_and_the_dom
*/
final WindImportFileUploadForm formAndFileUploadAndSubmitButton = createWindImportFileUploadForm(URL_SAILINGSERVER_GRIB_IMPORT, /* multi */ true);
CaptionPanel windImportRootPanel = new CaptionPanel(stringMessages.gribWindImport_Title());
VerticalPanel windImportContentPanel = new VerticalPanel();
windImportRootPanel.add(windImportContentPanel);
final FormPanel form = formAndFileUploadAndSubmitButton.getFormPanel();
windImportContentPanel.add(form);
VerticalPanel formContentPanel = formAndFileUploadAndSubmitButton.getFormContentPanel();
HorizontalPanel inputPanel = new HorizontalPanel();
formContentPanel.add(inputPanel);
final Panel importResultPanel = new VerticalPanel();
windImportContentPanel.add(importResultPanel);
formAndFileUploadAndSubmitButton.getSubmitButton().setEnabled(true);
final FileUpload fileUpload = formAndFileUploadAndSubmitButton.getFileUpload();
inputPanel.setSpacing(5);
inputPanel.setCellVerticalAlignment(fileUpload, HasVerticalAlignment.ALIGN_MIDDLE);
return windImportRootPanel;
}
private void showWindSettingDialog(RaceDTO race, CoursePositionsDTO course) {
AddWindFixDialog windSettingDialog = new AddWindFixDialog(race, course, stringMessages, new DialogCallback<WindDTO>() {
@Override
@@ -1774,4 +1774,5 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
String eventRegattaHeaderLegendAudio();
String eventRegattaHeaderLegendAudioNo();
String set();
String gribWindImport_Title();
}
@@ -893,6 +893,7 @@ windImport_AllRacesWarning=Do you really want to import wind into all races?\nOn
windImport_ResultHeader=Imported wind from: {0} to: {1}. {2} races affected.
windImport_ResultEntry=Race: {0} ({1}) - {2} fixes from: {3} to: {4}
windImport_ResultError=Error: {0}
gribWindImport_Title=Import wind from GRIB files
showWindSpeedSeriesTooltip=Toggles the visibility of the wind speed for all data sources
showWindDirectionSeriesTooltip=Toggles the visibility of the wind direction for all data sources
combinedWindSourceTypeTooltip=Combines all other wind sources to one data set
@@ -886,6 +886,7 @@ windImport_AllRacesWarning=Möchten Sie den Wind für sämtliche Rennen importie
windImport_ResultHeader=Wind wurde importiert von: {0} bis: {1}. {2} Rennen betroffen.
windImport_ResultEntry=Rennen: {0} ({1}) - {2} Messwerte von: {3} bis: {4}
windImport_ResultError=Fehler: {0}
gribWindImport_Title=Wind aus GRIB-Dateien importieren
showWindSpeedSeriesTooltip=Setzt die Sichtbarkeit der Windgeschwindigkeit aller Datenquellen
showWindDirectionSeriesTooltip=Setzt die Sichtbarkeit der Windrichtung aller Datenquellen
combinedWindSourceTypeTooltip=Kombiniert alle Datenquellen zu einem Datensatz
@@ -11,7 +11,9 @@ import com.sap.sailing.domain.common.Distance;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.datamining.presentation.dataproviders.AbstractResultDataProvider;
import com.sap.sailing.gwt.ui.datamining.presentation.dataproviders.DistanceDataProvider;
import com.sap.sailing.gwt.ui.datamining.presentation.dataproviders.DurationDataProvider;
import com.sap.sailing.gwt.ui.datamining.presentation.dataproviders.NumberDataProvider;
import com.sap.sse.common.Duration;
import com.sap.sse.common.settings.Settings;
import com.sap.sse.datamining.shared.GroupKey;
import com.sap.sse.datamining.shared.impl.dto.QueryResultDTO;
@@ -31,6 +33,8 @@ public abstract class AbstractResultsPresenterWithDataProviders<SettingsType ext
dataProviders = new HashMap<>();
AbstractResultDataProvider<Distance> distanceDataProvider = new DistanceDataProvider();
dataProviders.put(distanceDataProvider.getResultType().getName(), distanceDataProvider);
AbstractResultDataProvider<Duration> durationDataProvider = new DurationDataProvider();
dataProviders.put(durationDataProvider.getResultType().getName(), durationDataProvider);
}
protected void internalShowResults(QueryResultDTO<?> result) {
@@ -0,0 +1,54 @@
package com.sap.sailing.gwt.ui.datamining.presentation.dataproviders;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.function.Function;
import com.sap.sse.datamining.shared.impl.dto.QueryResultDTO;
/**
* Maps objects of type {@code T} to numerical values, using {@link String} keys describing the
* type of mapping. This can, e.g., be used to project a scalar value to different units, such as
* objects of type {@link Distance} to meters or inches.
*
* @author Axel Uhl (D043530)
*
* @param <T>
*/
public class AbstractDataProvider<T> extends AbstractResultDataProvider<T> {
private final LinkedHashMap<String, Function<T, Number>> mappings;
/**
* The first key in the mappings is used as the {@link #getDefaultDataKeyFor(QueryResultDTO) default} mapping.
*/
public AbstractDataProvider(Class<T> tClass, LinkedHashMap<String, Function<T, Number>> mappings) {
super(tClass);
this.mappings = mappings;
}
@Override
public Collection<String> getDataKeys() {
return mappings.keySet();
}
@Override
public boolean acceptsResultsOfType(String type) {
return getResultType().getName().equals(type);
}
@Override
protected Number getData(T value, String dataKey) {
Function<T, Number> f = mappings.get(dataKey);
if (f == null) {
throw new IllegalArgumentException("The given data key '" + dataKey + "' isn't valid");
} else {
return f.apply(value);
}
}
@Override
public String getDefaultDataKeyFor(QueryResultDTO<?> result) {
return mappings.keySet().iterator().next();
}
}
@@ -1,62 +1,25 @@
package com.sap.sailing.gwt.ui.datamining.presentation.dataproviders;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.LinkedHashMap;
import java.util.function.Function;
import com.sap.sailing.domain.common.Distance;
import com.sap.sse.datamining.shared.impl.dto.QueryResultDTO;
public class DistanceDataProvider extends AbstractResultDataProvider<Distance> {
public class DistanceDataProvider extends AbstractDataProvider<Distance> {
private final List<String> dataKeys;
public DistanceDataProvider() {
super(Distance.class);
dataKeys = new ArrayList<>();
dataKeys.add("Geographical Miles");
dataKeys.add("Sea Miles");
dataKeys.add("Nautical Miles");
dataKeys.add("Meters");
dataKeys.add("Kilometers");
dataKeys.add("Central Angle Degree");
dataKeys.add("Central Angle Radian");
}
@Override
public Collection<String> getDataKeys() {
return dataKeys;
super(Distance.class, getMappings());
}
@Override
public boolean acceptsResultsOfType(String type) {
return getResultType().getName().equals(type);
private static LinkedHashMap<String, Function<Distance, Number>> getMappings() {
LinkedHashMap<String, Function<Distance, Number>> mappings = new LinkedHashMap<>();
mappings.put("Geographical Miles", distance->distance.getGeographicalMiles());
mappings.put("Sea Miles", distance->distance.getSeaMiles());
mappings.put("Nautical Miles", distance->distance.getNauticalMiles());
mappings.put("Meters", distance->distance.getMeters());
mappings.put("Kilometers", distance->distance.getKilometers());
mappings.put("Central Angle Degree", distance->distance.getCentralAngleDeg());
mappings.put("Central Angle Radian", distance->distance.getCentralAngleRad());
return mappings;
}
@Override
protected Number getData(Distance distance, String dataKey) {
switch (dataKey) {
case "Geographical Miles":
return distance.getGeographicalMiles();
case "Sea Miles":
return distance.getSeaMiles();
case "Nautical Miles":
return distance.getNauticalMiles();
case "Meters":
return distance.getMeters();
case "Kilometers":
return distance.getKilometers();
case "Central Angle Degree":
return distance.getCentralAngleDeg();
case "Central Angle Radian":
return distance.getCentralAngleRad();
}
throw new IllegalArgumentException("The given data key '" + dataKey + "' isn't valid");
}
@Override
public String getDefaultDataKeyFor(QueryResultDTO<?> result) {
return dataKeys.get(0);
}
}
@@ -0,0 +1,34 @@
package com.sap.sailing.gwt.ui.datamining.presentation.dataproviders;
import java.util.LinkedHashMap;
import java.util.function.Function;
import com.sap.sse.common.Duration;
import com.sap.sse.datamining.shared.impl.dto.QueryResultDTO;
public class DurationDataProvider extends AbstractDataProvider<Duration> {
private static final String DAYS = "Days";
private static final String HOURS = "Hours";
private static final String MINUTES = "Minutes";
private static final String SECONDS = "Seconds";
private static final String MILLISECONDS = "Milliseconds";
public DurationDataProvider() {
super(Duration.class, getMappings());
}
private static LinkedHashMap<String, Function<Duration, Number>> getMappings() {
LinkedHashMap<String, Function<Duration, Number>> mappings = new LinkedHashMap<>();
mappings.put(MILLISECONDS, duration->duration.asMillis());
mappings.put(SECONDS, duration->duration.asSeconds());
mappings.put(MINUTES, duration->duration.asMinutes());
mappings.put(HOURS, duration->duration.asHours());
mappings.put(DAYS, duration->duration.asDays());
return mappings;
}
@Override
public String getDefaultDataKeyFor(QueryResultDTO<?> result) {
return SECONDS;
}
}
@@ -1,28 +1,25 @@
package com.sap.sailing.gwt.ui.datamining.presentation.dataproviders;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.function.Function;
import com.sap.sse.datamining.shared.impl.dto.QueryResultDTO;
public class NumberDataProvider extends AbstractResultDataProvider<Number> {
public class NumberDataProvider extends AbstractDataProvider<Number> {
private final static String FLOAT = "Float";
private final static String INTEGER = "Integer";
private final Collection<String> dataKeys;
public NumberDataProvider() {
super(Number.class);
dataKeys = new ArrayList<>();
dataKeys.add(FLOAT);
dataKeys.add(INTEGER);
}
@Override
public Collection<String> getDataKeys() {
return dataKeys;
super(Number.class, getMappings());
}
private static LinkedHashMap<String, Function<Number, Number>> getMappings() {
LinkedHashMap<String, Function<Number, Number>> mappings = new LinkedHashMap<>();
mappings.put(FLOAT, number->number.doubleValue());
mappings.put(INTEGER, number->number.intValue());
return mappings;
}
@Override
public boolean acceptsResultsOfType(String type) {
return type.equals(Number.class.getName()) ||
@@ -40,17 +37,6 @@ public class NumberDataProvider extends AbstractResultDataProvider<Number> {
type.equals(byte.class.getName());
}
@Override
protected Number getData(Number number, String dataKey) {
switch (dataKey) {
case FLOAT:
return number.doubleValue();
case INTEGER:
return number.intValue();
}
throw new IllegalArgumentException("The given data key '" + dataKey + "' isn't valid");
}
@Override
public String getDefaultDataKeyFor(QueryResultDTO<?> result) {
return result.getValueDecimals() == 0 ? INTEGER : FLOAT;
@@ -4,11 +4,11 @@ import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.number.IsCloseTo.closeTo;
import static org.junit.Assert.assertThat;
import java.util.List;
import org.junit.Test;
import com.sap.sailing.domain.common.Wind;
import com.sap.sailing.server.gateway.windimport.expedition.WindLogParser;
import com.sap.sse.common.Util;
public class TestWindLogParser {
@@ -16,48 +16,41 @@ public class TestWindLogParser {
@Test
public void testCompleteRow() throws Exception {
List<Wind> windImport = WindLogParser.importWind(getClass().getResourceAsStream("CompleteRow.csv"));
assertThat(windImport.size(), is(1));
Wind wind = windImport.get(0);
Iterable<Wind> windImport = WindLogParser.importWind(getClass().getResourceAsStream("CompleteRow.csv"));
assertThat(Util.size(windImport), is(1));
Wind wind = windImport.iterator().next();
assertWind(wind, 11.2, 257.2, 54.430272, 10.172062);
}
@Test
public void testCompleteRowPermutatedColumns() throws Exception {
List<Wind> windImport = WindLogParser.importWind(getClass().getResourceAsStream("CompleteRowPermutatedColumns.csv"));
assertThat(windImport.size(), is(1));
Wind wind = windImport.get(0);
Iterable<Wind> windImport = WindLogParser.importWind(getClass().getResourceAsStream("CompleteRowPermutatedColumns.csv"));
assertThat(Util.size(windImport), is(1));
Wind wind = windImport.iterator().next();
assertWind(wind, 11.2, 257.2, 54.430272, 10.172062);
assertThat(wind.getTimePoint().asMillis(), is(1372231373011L));
}
@Test
public void testWindFirst() throws Exception {
List<Wind> windImport = WindLogParser.importWind(getClass().getResourceAsStream("WindFirst.csv"));
assertThat(windImport.size(), is(1));
Wind wind = windImport.get(0);
Iterable<Wind> windImport = WindLogParser.importWind(getClass().getResourceAsStream("WindFirst.csv"));
assertThat(Util.size(windImport), is(1));
Wind wind = windImport.iterator().next();
assertWind(wind, 11.2, 257.2, 54.430272, 10.172062);
}
@Test
public void testPositionFirst() throws Exception {
List<Wind> windImport = WindLogParser.importWind(getClass().getResourceAsStream("PositionFirst.csv"));
assertThat(windImport.size(), is(1));
Wind wind = windImport.get(0);
Iterable<Wind> windImport = WindLogParser.importWind(getClass().getResourceAsStream("PositionFirst.csv"));
assertThat(Util.size(windImport), is(1));
Wind wind = windImport.iterator().next();
assertWind(wind, 11.2, 257.2, 54.430272, 10.172062);
}
private void assertWind(Wind wind, double knots, double degrees, double lat, double lon) {
assertThat(wind.getKnots(), closeTo(knots, DOUBLE_TOLERANCE));
assertThat(wind.getFrom().getDegrees(), closeTo(degrees, DOUBLE_TOLERANCE));
assertThat(wind.getPosition().getLatDeg(), closeTo(lat, DOUBLE_TOLERANCE));
assertThat(wind.getPosition().getLngDeg(), closeTo(lon, DOUBLE_TOLERANCE));
}
// @Test
// public void test2013Jun26_0() throws Exception {
// List<Wind> windImport = WindLogParser.importWind(getClass().getResourceAsStream("2013Jun26_0.csv"));
// assertThat(windImport.size(), is(85586));
// }
private void assertWind(Wind wind, double knots, double degrees, double lat, double lon) {
assertThat(wind.getKnots(), closeTo(knots, DOUBLE_TOLERANCE));
assertThat(wind.getFrom().getDegrees(), closeTo(degrees, DOUBLE_TOLERANCE));
assertThat(wind.getPosition().getLatDeg(), closeTo(lat, DOUBLE_TOLERANCE));
assertThat(wind.getPosition().getLngDeg(), closeTo(lon, DOUBLE_TOLERANCE));
}
}
@@ -58,7 +58,8 @@ Require-Bundle: com.sap.sailing.domain,
com.sap.sse.datamining;bundle-version="1.0.0",
com.sap.sse.datamining.shared;bundle-version="1.0.0",
com.sap.sailing.datamining,
com.sap.sailing.server
com.sap.sailing.server,
com.sap.sailing.grib
Bundle-ClassPath: .
Web-ContextPath: /sailingserver
Export-Package: com.sap.sailing.server.gateway,
@@ -115,13 +115,22 @@
<servlet>
<servlet-name>WindImportServlet</servlet-name>
<servlet-class>com.sap.sailing.server.gateway.expeditionimport.WindImportServlet</servlet-class>
<servlet-class>com.sap.sailing.server.gateway.windimport.expedition.WindImportServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>WindImportServlet</servlet-name>
<url-pattern>/expedition-import</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>GribWindImportServlet</servlet-name>
<servlet-class>com.sap.sailing.server.gateway.windimport.grib.GribWindImportServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GribWindImportServlet</servlet-name>
<url-pattern>/grib-wind-import</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ExpeditionWindMeasureStatusGetServlet</servlet-name>
<servlet-class>com.sap.sailing.server.gateway.impl.ExpeditionWindMeasureStatusGetServlet</servlet-class>
@@ -1,9 +1,12 @@
package com.sap.sailing.server.gateway.expeditionimport;
package com.sap.sailing.server.gateway.windimport;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
@@ -25,25 +28,22 @@ import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.RegattaNameAndRaceName;
import com.sap.sailing.domain.common.Wind;
import com.sap.sailing.domain.common.WindSource;
import com.sap.sailing.domain.common.WindSourceType;
import com.sap.sailing.domain.common.impl.WindSourceImpl;
import com.sap.sailing.domain.common.impl.WindSourceWithAdditionalID;
import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.server.gateway.SailingServerHttpServlet;
import com.sap.sailing.server.gateway.expeditionimport.WindImportServlet.WindImportResult.RaceEntry;
import com.sap.sailing.server.gateway.windimport.AbstractWindImportServlet.WindImportResult.RaceEntry;
import com.sap.sse.common.Util;
public class WindImportServlet extends SailingServerHttpServlet {
public abstract class AbstractWindImportServlet extends SailingServerHttpServlet {
private static final long serialVersionUID = 1L;
static class UploadRequest {
public static class UploadRequest {
public String boatId;
public final List<FileItem> files = new ArrayList<FileItem>();
public List<RegattaAndRaceIdentifier> races = new ArrayList<RegattaAndRaceIdentifier>();;
}
static class WindImportResult {
private Date first;
private Date last;
public String error;
@@ -75,7 +75,6 @@ public class WindImportServlet extends SailingServerHttpServlet {
}
static class RaceEntry {
public final String regattaName;
public final String raceName;
private int count;
@@ -127,7 +126,6 @@ public class WindImportServlet extends SailingServerHttpServlet {
public JSONObject json() {
JSONObject result = new JSONObject();
if (getFirst() != null) {
result.put("first", getFirst().getTime());
}
@@ -135,7 +133,6 @@ public class WindImportServlet extends SailingServerHttpServlet {
result.put("last", getLast().getTime());
}
result.put("error", error);
JSONArray raceEntriesJson = new JSONArray();
for (RaceEntry raceEntry : raceEntries) {
if (raceEntry.count > 0) {
@@ -143,11 +140,8 @@ public class WindImportServlet extends SailingServerHttpServlet {
}
}
result.put("raceEntries", raceEntriesJson);
return result;
}
}
@Override
@@ -157,19 +151,10 @@ public class WindImportServlet extends SailingServerHttpServlet {
response.sendError(HttpServletResponse.SC_BAD_REQUEST);
return;
}
WindImportResult windImportResult = new WindImportResult();
try {
UploadRequest uploadRequest = readRequest(request);
WindSource windSource;
if (uploadRequest.boatId == null) {
windSource = new WindSourceImpl(WindSourceType.EXPEDITION);
} else {
windSource = new WindSourceWithAdditionalID(WindSourceType.EXPEDITION, uploadRequest.boatId);
}
WindSource windSource = getWindSource(uploadRequest);
List<DynamicTrackedRace> trackedRaces = new ArrayList<DynamicTrackedRace>();
if (uploadRequest.races.size() > 0) {
for (RegattaAndRaceIdentifier raceEntry : uploadRequest.races) {
@@ -185,25 +170,24 @@ public class WindImportServlet extends SailingServerHttpServlet {
}
}
}
final Map<InputStream, String> streamsWithFilenames = new HashMap<>();
for (FileItem file : uploadRequest.files) {
List<Wind> windFixes = WindLogParser.importWind(file.getInputStream());
if (windFixes.size() > 0) {
windImportResult.update(windFixes.get(0));
windImportResult.update(windFixes.get(windFixes.size() - 1));
for (DynamicTrackedRace trackedRace : trackedRaces) {
RegattaAndRaceIdentifier raceIdentifier = trackedRace.getRaceIdentifier();
RaceEntry raceEntry = windImportResult.addRaceEntry(raceIdentifier.getRegattaName(),
raceIdentifier.getRaceName());
for (Wind wind : windFixes) {
if (trackedRace.recordWind(wind, windSource)) {
raceEntry.update(wind);
}
streamsWithFilenames.put(file.getInputStream(), file.getName());
}
Iterable<Wind> windFixes = importWind(streamsWithFilenames);
if (!Util.isEmpty(windFixes)) {
for (DynamicTrackedRace trackedRace : trackedRaces) {
RegattaAndRaceIdentifier raceIdentifier = trackedRace.getRaceIdentifier();
RaceEntry raceEntry = windImportResult.addRaceEntry(raceIdentifier.getRegattaName(),
raceIdentifier.getRaceName());
for (Wind wind : windFixes) {
windImportResult.update(wind);
if (trackedRace.recordWind(wind, windSource)) {
raceEntry.update(wind);
}
}
}
}
// Use text/html to prevent browsers from wrapping the response body,
// see "Handling File Upload Responses in GWT" at http://www.artofsolving.com/node/50
} catch (Exception e) {
@@ -213,6 +197,10 @@ public class WindImportServlet extends SailingServerHttpServlet {
response.getWriter().append(windImportResult.json().toJSONString());
}
protected abstract Iterable<Wind> importWind(Map<InputStream, String> streamsWithFilenames) throws IOException;
protected abstract WindSource getWindSource(UploadRequest uploadRequest);
private UploadRequest readRequest(HttpServletRequest req) throws FileUploadException, ParseException {
UploadRequest result = new UploadRequest();
// http://commons.apache.org/fileupload/using.html
@@ -0,0 +1,40 @@
package com.sap.sailing.server.gateway.windimport.expedition;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.sap.sailing.domain.common.Wind;
import com.sap.sailing.domain.common.WindSource;
import com.sap.sailing.domain.common.WindSourceType;
import com.sap.sailing.domain.common.impl.WindSourceImpl;
import com.sap.sailing.domain.common.impl.WindSourceWithAdditionalID;
import com.sap.sailing.server.gateway.windimport.AbstractWindImportServlet;
import com.sap.sse.common.Util;
public class WindImportServlet extends AbstractWindImportServlet {
private static final long serialVersionUID = 1L;
@Override
protected WindSource getWindSource(UploadRequest uploadRequest) {
WindSource windSource;
if (uploadRequest.boatId == null) {
windSource = new WindSourceImpl(WindSourceType.EXPEDITION);
} else {
windSource = new WindSourceWithAdditionalID(WindSourceType.EXPEDITION, uploadRequest.boatId);
}
return windSource;
}
@Override
protected Iterable<Wind> importWind(Map<InputStream, String> streamsWithFilenames) throws IOException {
final List<Wind> result = new ArrayList<>();
for (final InputStream inputStream : streamsWithFilenames.keySet()) {
Util.addAll(WindLogParser.importWind(inputStream), result);
}
return result;
}
}
@@ -1,4 +1,4 @@
package com.sap.sailing.server.gateway.expeditionimport;
package com.sap.sailing.server.gateway.windimport.expedition;
import java.io.BufferedReader;
import java.io.IOException;
@@ -107,7 +107,6 @@ public class WindLogParser {
private static final String COL_NAME_LONG = "Lon";
private static class ColumnNumbers {
Integer gpsTime;
Integer trueWindSpeed;
Integer trueWindDirection;
@@ -142,56 +141,51 @@ public class WindLogParser {
}
}
if (gpsTime == null || trueWindSpeed == null || trueWindDirection == null || lat == null || lon == null) {
throw new RuntimeException("Unexpected csv header for Expedition wind import: " + headerLine);
} else {
max = Collections.max(Arrays.asList(gpsTime, trueWindSpeed, trueWindDirection, lat, lon));
}
}
}
private static final Pattern LINE_PATTERN = Pattern.compile(",");
private static final Pattern LINE_PATTERN = Pattern.compile(",");
/**
* See ExpeditionMessage, UDPExpeditionReceiver
* @param windStream
* @return
* @throws IOException
*/
public static List<Wind> importWind(InputStream windStream) throws IOException {
BufferedReader csvReader = new BufferedReader(new InputStreamReader(windStream));
String headerLine = csvReader.readLine();
ColumnNumbers columnNumbers = new ColumnNumbers(headerLine);
/**
* See ExpeditionMessage, UDPExpeditionReceiver
*
* @param windStream
* @return
* @throws IOException
*/
public static Iterable<Wind> importWind(InputStream windStream) throws IOException {
BufferedReader csvReader = new BufferedReader(new InputStreamReader(windStream));
String headerLine = csvReader.readLine();
ColumnNumbers columnNumbers = new ColumnNumbers(headerLine);
List<Wind> result = new ArrayList<Wind>();
String dataLine;
WindBuffer windBuffer = new WindBuffer();
while ((dataLine = csvReader.readLine()) != null) {
String[] data = parseDataLine(dataLine, columnNumbers.max);
if (data != null) {
windBuffer.updateTime(data[columnNumbers.gpsTime]);
windBuffer.updateWindData(data[columnNumbers.trueWindSpeed], data[columnNumbers.trueWindDirection]);
windBuffer.updatePosition(data[columnNumbers.lat], data[columnNumbers.lon]);
Wind wind = windBuffer.createWindIfReady();
if (wind != null) {
result.add(wind);
}
}
}
return result;
}
List<Wind> result = new ArrayList<Wind>();
String dataLine;
WindBuffer windBuffer = new WindBuffer();
while ((dataLine = csvReader.readLine()) != null) {
String[] data = parseDataLine(dataLine, columnNumbers.max);
if (data != null) {
windBuffer.updateTime(data[columnNumbers.gpsTime]);
windBuffer.updateWindData(data[columnNumbers.trueWindSpeed], data[columnNumbers.trueWindDirection]);
windBuffer.updatePosition(data[columnNumbers.lat], data[columnNumbers.lon]);
Wind wind = windBuffer.createWindIfReady();
if (wind != null) {
result.add(wind);
}
}
}
return result;
}
private static String[] parseDataLine(String dataLine, int minLength) {
String[] data = LINE_PATTERN.split(dataLine);
if (data.length >= minLength) {
return data;
}
//else
return null;
}
private static String[] parseDataLine(String dataLine, int minLength) {
String[] data = LINE_PATTERN.split(dataLine);
if (data.length >= minLength) {
return data;
}
// else
return null;
}
}
@@ -0,0 +1,38 @@
package com.sap.sailing.server.gateway.windimport.grib;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.sap.sailing.domain.common.Wind;
import com.sap.sailing.domain.common.WindSource;
import com.sap.sailing.domain.common.WindSourceType;
import com.sap.sailing.domain.common.impl.WindSourceImpl;
import com.sap.sailing.domain.common.impl.WindSourceWithAdditionalID;
import com.sap.sailing.grib.GribWindField;
import com.sap.sailing.grib.GribWindFieldFactory;
import com.sap.sailing.server.gateway.windimport.AbstractWindImportServlet;
public class GribWindImportServlet extends AbstractWindImportServlet {
private static final long serialVersionUID = -4547876638456305135L;
private static final Logger logger = Logger.getLogger(GribWindImportServlet.class.getName());
@Override
protected WindSource getWindSource(UploadRequest uploadRequest) {
WindSource windSource;
if (uploadRequest.boatId == null) {
windSource = new WindSourceImpl(WindSourceType.WEB);
} else {
windSource = new WindSourceWithAdditionalID(WindSourceType.WEB, uploadRequest.boatId);
}
return windSource;
}
@Override
protected Iterable<Wind> importWind(Map<InputStream, String> inputStreamsAndFilenames) throws IOException {
final GribWindField windField = GribWindFieldFactory.INSTANCE.createGribWindFieldFromStreams(logger, Level.INFO, inputStreamsAndFilenames);
return windField.getAllWindFixes();
}
}
@@ -34,5 +34,5 @@
<booleanAttribute key="tracing" value="false"/>
<booleanAttribute key="useCustomFeatures" value="false"/>
<booleanAttribute key="useDefaultConfigArea" value="false"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.servlet@default:default,com.googlecode.java-diff-utils@default:default,com.googlecode.mgwt@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.competitorimport@default:default,com.sap.sailing.dashboards.gwt@5:true,com.sap.sailing.datamining.provider@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.deckmanadapter@4:true,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.racelogtrackingadapter@3:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.manage2sail@default:default,com.sap.sailing.news@default:default,com.sap.sailing.polars.datamining.shared@default:default,com.sap.sailing.polars.datamining@default:default,com.sap.sailing.polars@4:true,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.serialization.shared.android@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sailing.xrr.schema@default:default,com.sap.sailing.xrr.structureimport@default:default,com.sap.sailing.yachtscoring.resultimport@default:default,com.sap.sse.common@default:default,com.sap.sse.datamining.annotations@default:default,com.sap.sse.datamining.shared@default:default,com.sap.sse.datamining@default:default,com.sap.sse.filestorage@default:default,com.sap.sse.gwt.adminconsole@default:default,com.sap.sse.gwt@default:default,com.sap.sse.mail@4:true,com.sap.sse.mongodb@default:default,com.sap.sse.operationaltransformation@default:default,com.sap.sse.replication@4:true,com.sap.sse.security.common@default:default,com.sap.sse.security.ui@6:true,com.sap.sse.security.userstore.mongodb@4:true,com.sap.sse.security@5:true,com.sap.sse.shared.android@default:default,com.sap.sse@default:default,com.tractrac.clientmodule@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.servlet@default:default,com.googlecode.java-diff-utils@default:default,com.googlecode.mgwt@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.competitorimport@default:default,com.sap.sailing.dashboards.gwt@5:true,com.sap.sailing.datamining.provider@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.deckmanadapter@4:true,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.racelogtrackingadapter@3:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.grib@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.manage2sail@default:default,com.sap.sailing.news@default:default,com.sap.sailing.polars.datamining.shared@default:default,com.sap.sailing.polars.datamining@default:default,com.sap.sailing.polars@4:true,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.serialization.shared.android@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sailing.xrr.schema@default:default,com.sap.sailing.xrr.structureimport@default:default,com.sap.sailing.yachtscoring.resultimport@default:default,com.sap.sse.common@default:default,com.sap.sse.datamining.annotations@default:default,com.sap.sse.datamining.shared@default:default,com.sap.sse.datamining@default:default,com.sap.sse.filestorage@default:default,com.sap.sse.gwt.adminconsole@default:default,com.sap.sse.gwt@default:default,com.sap.sse.mail@4:true,com.sap.sse.mongodb@default:default,com.sap.sse.operationaltransformation@default:default,com.sap.sse.replication@4:true,com.sap.sse.security.common@default:default,com.sap.sse.security.ui@6:true,com.sap.sse.security.userstore.mongodb@4:true,com.sap.sse.security@5:true,com.sap.sse.shared.android@default:default,com.sap.sse@default:default,com.tractrac.clientmodule@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
</launchConfiguration>
@@ -36,5 +36,5 @@
<booleanAttribute key="tracing" value="false"/>
<booleanAttribute key="useCustomFeatures" value="false"/>
<booleanAttribute key="useDefaultConfigArea" value="false"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.servlet@default:default,com.googlecode.java-diff-utils@default:default,com.googlecode.mgwt@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.competitorimport@default:default,com.sap.sailing.dashboards.gwt@5:true,com.sap.sailing.datamining.provider@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.deckmanadapter@4:true,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.racelogtrackingadapter@3:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.manage2sail@default:default,com.sap.sailing.monitoring@default:default,com.sap.sailing.news@default:default,com.sap.sailing.polars.datamining.shared@default:default,com.sap.sailing.polars.datamining@default:default,com.sap.sailing.polars@4:true,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.serialization.shared.android@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sailing.xrr.schema@default:default,com.sap.sailing.xrr.structureimport@default:default,com.sap.sailing.yachtscoring.resultimport@default:default,com.sap.sse.common@default:default,com.sap.sse.datamining.annotations@default:default,com.sap.sse.datamining.shared@default:default,com.sap.sse.datamining@default:default,com.sap.sse.filestorage@default:default,com.sap.sse.gwt.adminconsole@default:default,com.sap.sse.gwt@default:default,com.sap.sse.mail@4:true,com.sap.sse.mongodb@default:default,com.sap.sse.operationaltransformation@default:default,com.sap.sse.replication@4:true,com.sap.sse.security.common@default:default,com.sap.sse.security.ui@6:true,com.sap.sse.security.userstore.mongodb@4:true,com.sap.sse.security@5:true,com.sap.sse.shared.android@default:default,com.sap.sse@default:default,com.tractrac.clientmodule@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.servlet@default:default,com.googlecode.java-diff-utils@default:default,com.googlecode.mgwt@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.competitorimport@default:default,com.sap.sailing.dashboards.gwt@5:true,com.sap.sailing.datamining.provider@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.deckmanadapter@4:true,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.racelogtrackingadapter@3:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.grib@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.manage2sail@default:default,com.sap.sailing.monitoring@default:default,com.sap.sailing.news@default:default,com.sap.sailing.polars.datamining.shared@default:default,com.sap.sailing.polars.datamining@default:default,com.sap.sailing.polars@4:true,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.serialization.shared.android@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sailing.xrr.schema@default:default,com.sap.sailing.xrr.structureimport@default:default,com.sap.sailing.yachtscoring.resultimport@default:default,com.sap.sse.common@default:default,com.sap.sse.datamining.annotations@default:default,com.sap.sse.datamining.shared@default:default,com.sap.sse.datamining@default:default,com.sap.sse.filestorage@default:default,com.sap.sse.gwt.adminconsole@default:default,com.sap.sse.gwt@default:default,com.sap.sse.mail@4:true,com.sap.sse.mongodb@default:default,com.sap.sse.operationaltransformation@default:default,com.sap.sse.replication@4:true,com.sap.sse.security.common@default:default,com.sap.sse.security.ui@6:true,com.sap.sse.security.userstore.mongodb@4:true,com.sap.sse.security@5:true,com.sap.sse.shared.android@default:default,com.sap.sse@default:default,com.tractrac.clientmodule@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
</launchConfiguration>
@@ -33,5 +33,5 @@
<booleanAttribute key="tracing" value="false"/>
<booleanAttribute key="useCustomFeatures" value="false"/>
<booleanAttribute key="useDefaultConfigArea" value="false"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.servlet@default:default,com.googlecode.java-diff-utils@default:default,com.googlecode.mgwt@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.competitorimport@default:default,com.sap.sailing.dashboards.gwt@5:true,com.sap.sailing.datamining.provider@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.deckmanadapter@4:true,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.racelogtrackingadapter@3:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.manage2sail@default:default,com.sap.sailing.news@default:default,com.sap.sailing.polars.datamining.shared@default:default,com.sap.sailing.polars.datamining@default:default,com.sap.sailing.polars@4:true,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.serialization.shared.android@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sailing.xrr.schema@default:default,com.sap.sailing.xrr.structureimport@default:default,com.sap.sailing.yachtscoring.resultimport@default:default,com.sap.sse.common@default:default,com.sap.sse.datamining.annotations@default:default,com.sap.sse.datamining.shared@default:default,com.sap.sse.datamining@default:default,com.sap.sse.filestorage@default:default,com.sap.sse.gwt.adminconsole@default:default,com.sap.sse.gwt@default:default,com.sap.sse.mail@4:true,com.sap.sse.mongodb@default:default,com.sap.sse.operationaltransformation@default:default,com.sap.sse.replication@4:true,com.sap.sse.security.common@default:default,com.sap.sse.security.ui@6:true,com.sap.sse.security.userstore.mongodb@4:true,com.sap.sse.security@5:true,com.sap.sse.shared.android@default:default,com.sap.sse@default:default,com.tractrac.clientmodule@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.servlet@default:default,com.googlecode.java-diff-utils@default:default,com.googlecode.mgwt@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.competitorimport@default:default,com.sap.sailing.dashboards.gwt@5:true,com.sap.sailing.datamining.provider@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.deckmanadapter@4:true,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.racelogtrackingadapter@3:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.grib@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.manage2sail@default:default,com.sap.sailing.news@default:default,com.sap.sailing.polars.datamining.shared@default:default,com.sap.sailing.polars.datamining@default:default,com.sap.sailing.polars@4:true,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.serialization.shared.android@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sailing.xrr.schema@default:default,com.sap.sailing.xrr.structureimport@default:default,com.sap.sailing.yachtscoring.resultimport@default:default,com.sap.sse.common@default:default,com.sap.sse.datamining.annotations@default:default,com.sap.sse.datamining.shared@default:default,com.sap.sse.datamining@default:default,com.sap.sse.filestorage@default:default,com.sap.sse.gwt.adminconsole@default:default,com.sap.sse.gwt@default:default,com.sap.sse.mail@4:true,com.sap.sse.mongodb@default:default,com.sap.sse.operationaltransformation@default:default,com.sap.sse.replication@4:true,com.sap.sse.security.common@default:default,com.sap.sse.security.ui@6:true,com.sap.sse.security.userstore.mongodb@4:true,com.sap.sse.security@5:true,com.sap.sse.shared.android@default:default,com.sap.sse@default:default,com.tractrac.clientmodule@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
</launchConfiguration>
@@ -27,6 +27,6 @@
<booleanAttribute key="tracing" value="false"/>
<booleanAttribute key="useCustomFeatures" value="false"/>
<booleanAttribute key="useDefaultConfigArea" value="false"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.servlet@default:default,com.googlecode.java-diff-utils@default:default,com.googlecode.mgwt@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.competitorimport@default:default,com.sap.sailing.dashboards.gwt@5:true,com.sap.sailing.datamining.provider@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.deckmanadapter@4:true,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.racelogtrackingadapter@3:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.manage2sail@default:default,com.sap.sailing.news@default:default,com.sap.sailing.polars.datamining.shared@default:default,com.sap.sailing.polars.datamining@default:default,com.sap.sailing.polars@4:true,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.serialization.shared.android@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sailing.xrr.schema@default:default,com.sap.sailing.xrr.structureimport@default:default,com.sap.sailing.yachtscoring.resultimport@default:default,com.sap.sse.common@default:default,com.sap.sse.datamining.annotations@default:default,com.sap.sse.datamining.shared@default:default,com.sap.sse.datamining@default:default,com.sap.sse.filestorage@default:default,com.sap.sse.gwt.adminconsole@default:default,com.sap.sse.gwt@default:default,com.sap.sse.mail@4:true,com.sap.sse.mongodb@default:default,com.sap.sse.operationaltransformation@default:default,com.sap.sse.replication@4:true,com.sap.sse.security.common@default:default,com.sap.sse.security.ui@6:true,com.sap.sse.security.userstore.mongodb@4:true,com.sap.sse.security@5:true,com.sap.sse.shared.android@default:default,com.sap.sse@default:default,com.tractrac.clientmodule@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.servlet@default:default,com.googlecode.java-diff-utils@default:default,com.googlecode.mgwt@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.competitorimport@default:default,com.sap.sailing.dashboards.gwt@5:true,com.sap.sailing.datamining.provider@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.deckmanadapter@4:true,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.racelogtrackingadapter@3:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.grib@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.manage2sail@default:default,com.sap.sailing.news@default:default,com.sap.sailing.polars.datamining.shared@default:default,com.sap.sailing.polars.datamining@default:default,com.sap.sailing.polars@4:true,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.serialization.shared.android@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sailing.xrr.schema@default:default,com.sap.sailing.xrr.structureimport@default:default,com.sap.sailing.yachtscoring.resultimport@default:default,com.sap.sse.common@default:default,com.sap.sse.datamining.annotations@default:default,com.sap.sse.datamining.shared@default:default,com.sap.sse.datamining@default:default,com.sap.sse.filestorage@default:default,com.sap.sse.gwt.adminconsole@default:default,com.sap.sse.gwt@default:default,com.sap.sse.mail@4:true,com.sap.sse.mongodb@default:default,com.sap.sse.operationaltransformation@default:default,com.sap.sse.replication@4:true,com.sap.sse.security.common@default:default,com.sap.sse.security.ui@6:true,com.sap.sse.security.userstore.mongodb@4:true,com.sap.sse.security@5:true,com.sap.sse.shared.android@default:default,com.sap.sse@default:default,com.tractrac.clientmodule@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="yk-options" value="&#13;&#10;additional-options2=onexit\=snapshot&#13;&#10;"/>
</launchConfiguration>
@@ -27,6 +27,6 @@
<booleanAttribute key="tracing" value="false"/>
<booleanAttribute key="useCustomFeatures" value="false"/>
<booleanAttribute key="useDefaultConfigArea" value="false"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.servlet@default:default,com.googlecode.java-diff-utils@default:default,com.googlecode.mgwt@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.competitorimport@default:default,com.sap.sailing.dashboards.gwt@5:true,com.sap.sailing.datamining.provider@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.deckmanadapter@4:true,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.racelogtrackingadapter@3:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.manage2sail@default:default,com.sap.sailing.news@default:default,com.sap.sailing.polars.datamining.shared@default:default,com.sap.sailing.polars.datamining@default:default,com.sap.sailing.polars@4:true,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.serialization.shared.android@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sailing.xrr.schema@default:default,com.sap.sailing.xrr.structureimport@default:default,com.sap.sailing.yachtscoring.resultimport@default:default,com.sap.sse.common@default:default,com.sap.sse.datamining.annotations@default:default,com.sap.sse.datamining.shared@default:default,com.sap.sse.datamining@default:default,com.sap.sse.filestorage@default:default,com.sap.sse.gwt.adminconsole@default:default,com.sap.sse.gwt@default:default,com.sap.sse.mail@4:true,com.sap.sse.mongodb@default:default,com.sap.sse.operationaltransformation@default:default,com.sap.sse.replication@4:true,com.sap.sse.security.common@default:default,com.sap.sse.security.ui@6:true,com.sap.sse.security.userstore.mongodb@4:true,com.sap.sse.security@5:true,com.sap.sse.shared.android@default:default,com.sap.sse@default:default,com.tractrac.clientmodule@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.servlet@default:default,com.googlecode.java-diff-utils@default:default,com.googlecode.mgwt@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.competitorimport@default:default,com.sap.sailing.dashboards.gwt@5:true,com.sap.sailing.datamining.provider@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.deckmanadapter@4:true,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.racelogtrackingadapter@3:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.grib@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.manage2sail@default:default,com.sap.sailing.news@default:default,com.sap.sailing.polars.datamining.shared@default:default,com.sap.sailing.polars.datamining@default:default,com.sap.sailing.polars@4:true,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.serialization.shared.android@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sailing.xrr.schema@default:default,com.sap.sailing.xrr.structureimport@default:default,com.sap.sailing.yachtscoring.resultimport@default:default,com.sap.sse.common@default:default,com.sap.sse.datamining.annotations@default:default,com.sap.sse.datamining.shared@default:default,com.sap.sse.datamining@default:default,com.sap.sse.filestorage@default:default,com.sap.sse.gwt.adminconsole@default:default,com.sap.sse.gwt@default:default,com.sap.sse.mail@4:true,com.sap.sse.mongodb@default:default,com.sap.sse.operationaltransformation@default:default,com.sap.sse.replication@4:true,com.sap.sse.security.common@default:default,com.sap.sse.security.ui@6:true,com.sap.sse.security.userstore.mongodb@4:true,com.sap.sse.security@5:true,com.sap.sse.shared.android@default:default,com.sap.sse@default:default,com.tractrac.clientmodule@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="yk-options" value="&#13;&#10;additional-options2=onexit\=snapshot&#13;&#10;"/>
</launchConfiguration>
@@ -27,6 +27,6 @@
<booleanAttribute key="tracing" value="false"/>
<booleanAttribute key="useCustomFeatures" value="false"/>
<booleanAttribute key="useDefaultConfigArea" value="false"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.servlet@default:default,com.googlecode.java-diff-utils@default:default,com.googlecode.mgwt@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.competitorimport@default:default,com.sap.sailing.dashboards.gwt@5:true,com.sap.sailing.datamining.provider@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.deckmanadapter@4:true,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.racelogtrackingadapter@3:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.manage2sail@default:default,com.sap.sailing.news@default:default,com.sap.sailing.polars.datamining.shared@default:default,com.sap.sailing.polars.datamining@default:default,com.sap.sailing.polars@4:true,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.serialization.shared.android@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sailing.xrr.schema@default:default,com.sap.sailing.xrr.structureimport@default:default,com.sap.sailing.yachtscoring.resultimport@default:default,com.sap.sse.common@default:default,com.sap.sse.datamining.annotations@default:default,com.sap.sse.datamining.shared@default:default,com.sap.sse.datamining@default:default,com.sap.sse.filestorage@default:default,com.sap.sse.gwt.adminconsole@default:default,com.sap.sse.gwt@default:default,com.sap.sse.mail@4:true,com.sap.sse.mongodb@default:default,com.sap.sse.operationaltransformation@default:default,com.sap.sse.replication@4:true,com.sap.sse.security.common@default:default,com.sap.sse.security.ui@6:true,com.sap.sse.security.userstore.mongodb@4:true,com.sap.sse.security@5:true,com.sap.sse.shared.android@default:default,com.sap.sse@default:default,com.tractrac.clientmodule@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.servlet@default:default,com.googlecode.java-diff-utils@default:default,com.googlecode.mgwt@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.competitorimport@default:default,com.sap.sailing.dashboards.gwt@5:true,com.sap.sailing.datamining.provider@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.deckmanadapter@4:true,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.racelogtrackingadapter@3:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.grib@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.manage2sail@default:default,com.sap.sailing.news@default:default,com.sap.sailing.polars.datamining.shared@default:default,com.sap.sailing.polars.datamining@default:default,com.sap.sailing.polars@4:true,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.serialization.shared.android@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sailing.xrr.schema@default:default,com.sap.sailing.xrr.structureimport@default:default,com.sap.sailing.yachtscoring.resultimport@default:default,com.sap.sse.common@default:default,com.sap.sse.datamining.annotations@default:default,com.sap.sse.datamining.shared@default:default,com.sap.sse.datamining@default:default,com.sap.sse.filestorage@default:default,com.sap.sse.gwt.adminconsole@default:default,com.sap.sse.gwt@default:default,com.sap.sse.mail@4:true,com.sap.sse.mongodb@default:default,com.sap.sse.operationaltransformation@default:default,com.sap.sse.replication@4:true,com.sap.sse.security.common@default:default,com.sap.sse.security.ui@6:true,com.sap.sse.security.userstore.mongodb@4:true,com.sap.sse.security@5:true,com.sap.sse.shared.android@default:default,com.sap.sse@default:default,com.tractrac.clientmodule@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="yk-options" value="&#13;&#10;additional-options2=onexit\=snapshot&#13;&#10;"/>
</launchConfiguration>
@@ -29,6 +29,6 @@
<booleanAttribute key="tracing" value="false"/>
<booleanAttribute key="useCustomFeatures" value="false"/>
<booleanAttribute key="useDefaultConfigArea" value="false"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.servlet@default:default,com.googlecode.java-diff-utils@default:default,com.googlecode.mgwt@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.competitorimport@default:default,com.sap.sailing.dashboards.gwt@5:true,com.sap.sailing.datamining.provider@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.deckmanadapter@4:true,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.racelogtrackingadapter@3:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.manage2sail@default:default,com.sap.sailing.news@default:default,com.sap.sailing.polars.datamining.shared@default:default,com.sap.sailing.polars.datamining@default:default,com.sap.sailing.polars@4:true,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.serialization.shared.android@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sailing.xrr.schema@default:default,com.sap.sailing.xrr.structureimport@default:default,com.sap.sailing.yachtscoring.resultimport@default:default,com.sap.sse.common@default:default,com.sap.sse.datamining.annotations@default:default,com.sap.sse.datamining.shared@default:default,com.sap.sse.datamining@default:default,com.sap.sse.filestorage@default:default,com.sap.sse.gwt.adminconsole@default:default,com.sap.sse.gwt@default:default,com.sap.sse.mail@4:true,com.sap.sse.mongodb@default:default,com.sap.sse.operationaltransformation@default:default,com.sap.sse.replication@4:true,com.sap.sse.security.common@default:default,com.sap.sse.security.ui@6:true,com.sap.sse.security.userstore.mongodb@4:true,com.sap.sse.security@5:true,com.sap.sse.shared.android@default:default,com.sap.sse@default:default,com.tractrac.clientmodule@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.servlet@default:default,com.googlecode.java-diff-utils@default:default,com.googlecode.mgwt@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.competitorimport@default:default,com.sap.sailing.dashboards.gwt@5:true,com.sap.sailing.datamining.provider@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.deckmanadapter@4:true,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.racelogtrackingadapter@3:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.grib@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.manage2sail@default:default,com.sap.sailing.news@default:default,com.sap.sailing.polars.datamining.shared@default:default,com.sap.sailing.polars.datamining@default:default,com.sap.sailing.polars@4:true,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.serialization.shared.android@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sailing.xrr.schema@default:default,com.sap.sailing.xrr.structureimport@default:default,com.sap.sailing.yachtscoring.resultimport@default:default,com.sap.sse.common@default:default,com.sap.sse.datamining.annotations@default:default,com.sap.sse.datamining.shared@default:default,com.sap.sse.datamining@default:default,com.sap.sse.filestorage@default:default,com.sap.sse.gwt.adminconsole@default:default,com.sap.sse.gwt@default:default,com.sap.sse.mail@4:true,com.sap.sse.mongodb@default:default,com.sap.sse.operationaltransformation@default:default,com.sap.sse.replication@4:true,com.sap.sse.security.common@default:default,com.sap.sse.security.ui@6:true,com.sap.sse.security.userstore.mongodb@4:true,com.sap.sse.security@5:true,com.sap.sse.shared.android@default:default,com.sap.sse@default:default,com.tractrac.clientmodule@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="yk-options" value="&#13;&#10;additional-options2=onexit\=snapshot&#13;&#10;"/>
</launchConfiguration>
@@ -27,6 +27,6 @@
<booleanAttribute key="tracing" value="false"/>
<booleanAttribute key="useCustomFeatures" value="false"/>
<booleanAttribute key="useDefaultConfigArea" value="false"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.servlet@default:default,com.googlecode.java-diff-utils@default:default,com.googlecode.mgwt@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.competitorimport@default:default,com.sap.sailing.dashboards.gwt@5:true,com.sap.sailing.datamining.provider@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.deckmanadapter@4:true,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.racelogtrackingadapter@3:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.manage2sail@default:default,com.sap.sailing.news@default:default,com.sap.sailing.polars.datamining.shared@default:default,com.sap.sailing.polars.datamining@default:default,com.sap.sailing.polars@4:true,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.serialization.shared.android@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sailing.xrr.schema@default:default,com.sap.sailing.xrr.structureimport@default:default,com.sap.sailing.yachtscoring.resultimport@default:default,com.sap.sse.common@default:default,com.sap.sse.datamining.annotations@default:default,com.sap.sse.datamining.shared@default:default,com.sap.sse.datamining@default:default,com.sap.sse.filestorage@default:default,com.sap.sse.gwt.adminconsole@default:default,com.sap.sse.gwt@default:default,com.sap.sse.mail@4:true,com.sap.sse.mongodb@default:default,com.sap.sse.operationaltransformation@default:default,com.sap.sse.replication@4:true,com.sap.sse.security.common@default:default,com.sap.sse.security.ui@6:true,com.sap.sse.security.userstore.mongodb@4:true,com.sap.sse.security@5:true,com.sap.sse.shared.android@default:default,com.sap.sse@default:default,com.tractrac.clientmodule@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.servlet@default:default,com.googlecode.java-diff-utils@default:default,com.googlecode.mgwt@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.competitorimport@default:default,com.sap.sailing.dashboards.gwt@5:true,com.sap.sailing.datamining.provider@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.deckmanadapter@4:true,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.racelogtrackingadapter@3:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.grib@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.manage2sail@default:default,com.sap.sailing.news@default:default,com.sap.sailing.polars.datamining.shared@default:default,com.sap.sailing.polars.datamining@default:default,com.sap.sailing.polars@4:true,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.serialization.shared.android@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sailing.xrr.schema@default:default,com.sap.sailing.xrr.structureimport@default:default,com.sap.sailing.yachtscoring.resultimport@default:default,com.sap.sse.common@default:default,com.sap.sse.datamining.annotations@default:default,com.sap.sse.datamining.shared@default:default,com.sap.sse.datamining@default:default,com.sap.sse.filestorage@default:default,com.sap.sse.gwt.adminconsole@default:default,com.sap.sse.gwt@default:default,com.sap.sse.mail@4:true,com.sap.sse.mongodb@default:default,com.sap.sse.operationaltransformation@default:default,com.sap.sse.replication@4:true,com.sap.sse.security.common@default:default,com.sap.sse.security.ui@6:true,com.sap.sse.security.userstore.mongodb@4:true,com.sap.sse.security@5:true,com.sap.sse.shared.android@default:default,com.sap.sse@default:default,com.tractrac.clientmodule@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="yk-options" value="&#13;&#10;additional-options2=onexit\=snapshot&#13;&#10;"/>
</launchConfiguration>
@@ -27,5 +27,5 @@
<booleanAttribute key="tracing" value="false"/>
<booleanAttribute key="useCustomFeatures" value="false"/>
<booleanAttribute key="useDefaultConfigArea" value="false"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.servlet@default:default,com.googlecode.java-diff-utils@default:default,com.googlecode.mgwt@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.competitorimport@default:default,com.sap.sailing.dashboards.gwt@5:true,com.sap.sailing.datamining.provider@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.deckmanadapter@4:true,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.racelogtrackingadapter@3:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.manage2sail@default:default,com.sap.sailing.news@default:default,com.sap.sailing.polars.datamining.shared@default:default,com.sap.sailing.polars.datamining@default:default,com.sap.sailing.polars@4:true,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.serialization.shared.android@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sailing.xrr.schema@default:default,com.sap.sailing.xrr.structureimport@default:default,com.sap.sailing.yachtscoring.resultimport@default:default,com.sap.sse.common@default:default,com.sap.sse.datamining.annotations@default:default,com.sap.sse.datamining.shared@default:default,com.sap.sse.datamining@default:default,com.sap.sse.filestorage@default:default,com.sap.sse.gwt.adminconsole@default:default,com.sap.sse.gwt@default:default,com.sap.sse.mail@4:true,com.sap.sse.mongodb@default:default,com.sap.sse.operationaltransformation@default:default,com.sap.sse.replication@4:true,com.sap.sse.security.common@default:default,com.sap.sse.security.ui@6:true,com.sap.sse.security.userstore.mongodb@4:true,com.sap.sse.security@5:true,com.sap.sse.shared.android@default:default,com.sap.sse@default:default,com.tractrac.clientmodule@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.servlet@default:default,com.googlecode.java-diff-utils@default:default,com.googlecode.mgwt@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.competitorimport@default:default,com.sap.sailing.dashboards.gwt@5:true,com.sap.sailing.datamining.provider@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.deckmanadapter@4:true,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.racelogtrackingadapter@3:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.grib@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.manage2sail@default:default,com.sap.sailing.news@default:default,com.sap.sailing.polars.datamining.shared@default:default,com.sap.sailing.polars.datamining@default:default,com.sap.sailing.polars@4:true,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.serialization.shared.android@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sailing.xrr.schema@default:default,com.sap.sailing.xrr.structureimport@default:default,com.sap.sailing.yachtscoring.resultimport@default:default,com.sap.sse.common@default:default,com.sap.sse.datamining.annotations@default:default,com.sap.sse.datamining.shared@default:default,com.sap.sse.datamining@default:default,com.sap.sse.filestorage@default:default,com.sap.sse.gwt.adminconsole@default:default,com.sap.sse.gwt@default:default,com.sap.sse.mail@4:true,com.sap.sse.mongodb@default:default,com.sap.sse.operationaltransformation@default:default,com.sap.sse.replication@4:true,com.sap.sse.security.common@default:default,com.sap.sse.security.ui@6:true,com.sap.sse.security.userstore.mongodb@4:true,com.sap.sse.security@5:true,com.sap.sse.shared.android@default:default,com.sap.sse@default:default,com.tractrac.clientmodule@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
</launchConfiguration>
@@ -33,5 +33,5 @@
<booleanAttribute key="tracing" value="false"/>
<booleanAttribute key="useCustomFeatures" value="false"/>
<booleanAttribute key="useDefaultConfigArea" value="false"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.servlet@default:default,com.googlecode.java-diff-utils@default:default,com.googlecode.mgwt@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.competitorimport@default:default,com.sap.sailing.dashboards.gwt@5:true,com.sap.sailing.datamining.provider@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.deckmanadapter@4:true,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.racelogtrackingadapter@3:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.manage2sail@default:default,com.sap.sailing.news@default:default,com.sap.sailing.polars.datamining.shared@default:default,com.sap.sailing.polars.datamining@default:default,com.sap.sailing.polars@4:true,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.serialization.shared.android@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway.test.support@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sailing.xrr.schema@default:default,com.sap.sailing.xrr.structureimport@default:default,com.sap.sailing.yachtscoring.resultimport@default:default,com.sap.sse.common@default:default,com.sap.sse.datamining.annotations@default:default,com.sap.sse.datamining.shared@default:default,com.sap.sse.datamining@default:default,com.sap.sse.filestorage@default:default,com.sap.sse.gwt.adminconsole@default:default,com.sap.sse.gwt@default:default,com.sap.sse.mail@4:true,com.sap.sse.mongodb@default:default,com.sap.sse.operationaltransformation@default:default,com.sap.sse.replication@4:true,com.sap.sse.security.common@default:default,com.sap.sse.security.ui@6:true,com.sap.sse.security.userstore.mongodb@4:true,com.sap.sse.security@5:true,com.sap.sse.shared.android@default:default,com.sap.sse@default:default,com.tractrac.clientmodule@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.servlet@default:default,com.googlecode.java-diff-utils@default:default,com.googlecode.mgwt@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.competitorimport@default:default,com.sap.sailing.dashboards.gwt@5:true,com.sap.sailing.datamining.provider@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.deckmanadapter@4:true,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.racelogtrackingadapter@3:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.grib@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.manage2sail@default:default,com.sap.sailing.news@default:default,com.sap.sailing.polars.datamining.shared@default:default,com.sap.sailing.polars.datamining@default:default,com.sap.sailing.polars@4:true,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.serialization.shared.android@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway.test.support@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sailing.xrr.schema@default:default,com.sap.sailing.xrr.structureimport@default:default,com.sap.sailing.yachtscoring.resultimport@default:default,com.sap.sse.common@default:default,com.sap.sse.datamining.annotations@default:default,com.sap.sse.datamining.shared@default:default,com.sap.sse.datamining@default:default,com.sap.sse.filestorage@default:default,com.sap.sse.gwt.adminconsole@default:default,com.sap.sse.gwt@default:default,com.sap.sse.mail@4:true,com.sap.sse.mongodb@default:default,com.sap.sse.operationaltransformation@default:default,com.sap.sse.replication@4:true,com.sap.sse.security.common@default:default,com.sap.sse.security.ui@6:true,com.sap.sse.security.userstore.mongodb@4:true,com.sap.sse.security@5:true,com.sap.sse.shared.android@default:default,com.sap.sse@default:default,com.tractrac.clientmodule@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
</launchConfiguration>
@@ -36,6 +36,6 @@
<booleanAttribute key="tracing" value="false"/>
<booleanAttribute key="useCustomFeatures" value="false"/>
<booleanAttribute key="useDefaultConfigArea" value="false"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.servlet@default:default,com.googlecode.java-diff-utils@default:default,com.googlecode.mgwt@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.competitorimport@default:default,com.sap.sailing.dashboards.gwt@5:true,com.sap.sailing.datamining.provider@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.deckmanadapter@4:true,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.racelogtrackingadapter@3:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.manage2sail@default:default,com.sap.sailing.news@default:default,com.sap.sailing.polars.datamining.shared@default:default,com.sap.sailing.polars.datamining@default:default,com.sap.sailing.polars@4:true,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.serialization.shared.android@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sailing.xrr.schema@default:default,com.sap.sailing.xrr.structureimport@default:default,com.sap.sailing.yachtscoring.resultimport@default:default,com.sap.sse.common@default:default,com.sap.sse.datamining.annotations@default:default,com.sap.sse.datamining.shared@default:default,com.sap.sse.datamining@default:default,com.sap.sse.filestorage@default:default,com.sap.sse.gwt.adminconsole@default:default,com.sap.sse.gwt@default:default,com.sap.sse.mail@4:true,com.sap.sse.mongodb@default:default,com.sap.sse.operationaltransformation@default:default,com.sap.sse.replication@4:true,com.sap.sse.security.common@default:default,com.sap.sse.security.ui@6:true,com.sap.sse.security.userstore.mongodb@4:true,com.sap.sse.security@5:true,com.sap.sse.shared.android@default:default,com.sap.sse@default:default,com.tractrac.clientmodule@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.servlet@default:default,com.googlecode.java-diff-utils@default:default,com.googlecode.mgwt@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.competitorimport@default:default,com.sap.sailing.dashboards.gwt@5:true,com.sap.sailing.datamining.provider@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.deckmanadapter@4:true,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.racelogtrackingadapter@3:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.grib@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.manage2sail@default:default,com.sap.sailing.news@default:default,com.sap.sailing.polars.datamining.shared@default:default,com.sap.sailing.polars.datamining@default:default,com.sap.sailing.polars@4:true,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.serialization.shared.android@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sailing.xrr.schema@default:default,com.sap.sailing.xrr.structureimport@default:default,com.sap.sailing.yachtscoring.resultimport@default:default,com.sap.sse.common@default:default,com.sap.sse.datamining.annotations@default:default,com.sap.sse.datamining.shared@default:default,com.sap.sse.datamining@default:default,com.sap.sse.filestorage@default:default,com.sap.sse.gwt.adminconsole@default:default,com.sap.sse.gwt@default:default,com.sap.sse.mail@4:true,com.sap.sse.mongodb@default:default,com.sap.sse.operationaltransformation@default:default,com.sap.sse.replication@4:true,com.sap.sse.security.common@default:default,com.sap.sse.security.ui@6:true,com.sap.sse.security.userstore.mongodb@4:true,com.sap.sse.security@5:true,com.sap.sse.shared.android@default:default,com.sap.sse@default:default,com.tractrac.clientmodule@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="yk-options" value="&#13;&#10;additional-options2=onexit\=snapshot&#13;&#10;"/>
</launchConfiguration>
@@ -27,6 +27,6 @@
<booleanAttribute key="tracing" value="false"/>
<booleanAttribute key="useCustomFeatures" value="false"/>
<booleanAttribute key="useDefaultConfigArea" value="false"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.servlet@default:default,com.googlecode.java-diff-utils@default:default,com.googlecode.mgwt@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.competitorimport@default:default,com.sap.sailing.dashboards.gwt@5:true,com.sap.sailing.datamining.provider@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.deckmanadapter@4:true,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.racelogtrackingadapter@3:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.manage2sail@default:default,com.sap.sailing.news@default:default,com.sap.sailing.polars.datamining.shared@default:default,com.sap.sailing.polars.datamining@default:default,com.sap.sailing.polars@4:true,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.serialization.shared.android@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sailing.xrr.schema@default:default,com.sap.sailing.xrr.structureimport@default:default,com.sap.sailing.yachtscoring.resultimport@default:default,com.sap.sse.common@default:default,com.sap.sse.datamining.annotations@default:default,com.sap.sse.datamining.shared@default:default,com.sap.sse.datamining@default:default,com.sap.sse.filestorage@default:default,com.sap.sse.gwt.adminconsole@default:default,com.sap.sse.gwt@default:default,com.sap.sse.mail@4:true,com.sap.sse.mongodb@default:default,com.sap.sse.operationaltransformation@default:default,com.sap.sse.replication@4:true,com.sap.sse.security.common@default:default,com.sap.sse.security.ui@6:true,com.sap.sse.security.userstore.mongodb@4:true,com.sap.sse.security@5:true,com.sap.sse.shared.android@default:default,com.sap.sse@default:default,com.tractrac.clientmodule@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.servlet@default:default,com.googlecode.java-diff-utils@default:default,com.googlecode.mgwt@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.competitorimport@default:default,com.sap.sailing.dashboards.gwt@5:true,com.sap.sailing.datamining.provider@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.deckmanadapter@4:true,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.racelogtrackingadapter@3:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.grib@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.manage2sail@default:default,com.sap.sailing.news@default:default,com.sap.sailing.polars.datamining.shared@default:default,com.sap.sailing.polars.datamining@default:default,com.sap.sailing.polars@4:true,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.serialization.shared.android@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sailing.xrr.schema@default:default,com.sap.sailing.xrr.structureimport@default:default,com.sap.sailing.yachtscoring.resultimport@default:default,com.sap.sse.common@default:default,com.sap.sse.datamining.annotations@default:default,com.sap.sse.datamining.shared@default:default,com.sap.sse.datamining@default:default,com.sap.sse.filestorage@default:default,com.sap.sse.gwt.adminconsole@default:default,com.sap.sse.gwt@default:default,com.sap.sse.mail@4:true,com.sap.sse.mongodb@default:default,com.sap.sse.operationaltransformation@default:default,com.sap.sse.replication@4:true,com.sap.sse.security.common@default:default,com.sap.sse.security.ui@6:true,com.sap.sse.security.userstore.mongodb@4:true,com.sap.sse.security@5:true,com.sap.sse.shared.android@default:default,com.sap.sse@default:default,com.tractrac.clientmodule@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="yk-options" value="&#13;&#10;additional-options2=onexit\=snapshot&#13;&#10;"/>
</launchConfiguration>
@@ -26,5 +26,5 @@
<booleanAttribute key="tracing" value="false"/>
<booleanAttribute key="useCustomFeatures" value="false"/>
<booleanAttribute key="useDefaultConfigArea" value="false"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.servlet@default:default,com.googlecode.java-diff-utils@default:default,com.googlecode.mgwt@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.competitorimport@default:default,com.sap.sailing.dashboards.gwt@5:true,com.sap.sailing.datamining.provider@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.deckmanadapter@4:true,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.racelogtrackingadapter@3:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.manage2sail@default:default,com.sap.sailing.news@default:default,com.sap.sailing.polars.datamining.shared@default:default,com.sap.sailing.polars.datamining@default:default,com.sap.sailing.polars@4:true,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.serialization.shared.android@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sailing.xrr.schema@default:default,com.sap.sailing.xrr.structureimport@default:default,com.sap.sailing.yachtscoring.resultimport@default:default,com.sap.sse.common@default:default,com.sap.sse.datamining.annotations@default:default,com.sap.sse.datamining.shared@default:default,com.sap.sse.datamining@default:default,com.sap.sse.filestorage@default:default,com.sap.sse.gwt.adminconsole@default:default,com.sap.sse.gwt@default:default,com.sap.sse.mail@4:true,com.sap.sse.mongodb@default:default,com.sap.sse.operationaltransformation@default:default,com.sap.sse.replication@4:true,com.sap.sse.security.common@default:default,com.sap.sse.security.ui@6:true,com.sap.sse.security.userstore.mongodb@4:true,com.sap.sse.security@5:true,com.sap.sse.shared.android@default:default,com.sap.sse@default:default,com.tractrac.clientmodule@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.servlet@default:default,com.googlecode.java-diff-utils@default:default,com.googlecode.mgwt@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.competitorimport@default:default,com.sap.sailing.dashboards.gwt@5:true,com.sap.sailing.datamining.provider@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.deckmanadapter@4:true,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.racelogtrackingadapter@3:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.grib@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.manage2sail@default:default,com.sap.sailing.news@default:default,com.sap.sailing.polars.datamining.shared@default:default,com.sap.sailing.polars.datamining@default:default,com.sap.sailing.polars@4:true,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.serialization.shared.android@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sailing.xrr.schema@default:default,com.sap.sailing.xrr.structureimport@default:default,com.sap.sailing.yachtscoring.resultimport@default:default,com.sap.sse.common@default:default,com.sap.sse.datamining.annotations@default:default,com.sap.sse.datamining.shared@default:default,com.sap.sse.datamining@default:default,com.sap.sse.filestorage@default:default,com.sap.sse.gwt.adminconsole@default:default,com.sap.sse.gwt@default:default,com.sap.sse.mail@4:true,com.sap.sse.mongodb@default:default,com.sap.sse.operationaltransformation@default:default,com.sap.sse.replication@4:true,com.sap.sse.security.common@default:default,com.sap.sse.security.ui@6:true,com.sap.sse.security.userstore.mongodb@4:true,com.sap.sse.security@5:true,com.sap.sse.shared.android@default:default,com.sap.sse@default:default,com.tractrac.clientmodule@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
</launchConfiguration>
@@ -28,6 +28,6 @@
<booleanAttribute key="tracing" value="false"/>
<booleanAttribute key="useCustomFeatures" value="false"/>
<booleanAttribute key="useDefaultConfigArea" value="false"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.servlet@default:default,com.googlecode.java-diff-utils@default:default,com.googlecode.mgwt@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.competitorimport@default:default,com.sap.sailing.dashboards.gwt@5:true,com.sap.sailing.datamining.provider@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.deckmanadapter@4:true,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.racelogtrackingadapter@3:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.manage2sail@default:default,com.sap.sailing.news@default:default,com.sap.sailing.polars.datamining.shared@default:default,com.sap.sailing.polars.datamining@default:default,com.sap.sailing.polars@4:true,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.serialization.shared.android@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway.test.support@5:true,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sailing.xrr.schema@default:default,com.sap.sailing.xrr.structureimport@default:default,com.sap.sailing.yachtscoring.resultimport@default:default,com.sap.sse.common@default:default,com.sap.sse.datamining.annotations@default:default,com.sap.sse.datamining.shared@default:default,com.sap.sse.datamining@default:default,com.sap.sse.filestorage@default:default,com.sap.sse.gwt.adminconsole@default:default,com.sap.sse.gwt@default:default,com.sap.sse.mail@4:true,com.sap.sse.mongodb@default:default,com.sap.sse.operationaltransformation@default:default,com.sap.sse.replication@4:true,com.sap.sse.security.common@default:default,com.sap.sse.security.ui@6:true,com.sap.sse.security.userstore.mongodb@4:true,com.sap.sse.security@5:true,com.sap.sse.shared.android@default:default,com.sap.sse@default:default,com.tractrac.clientmodule@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.servlet@default:default,com.googlecode.java-diff-utils@default:default,com.googlecode.mgwt@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.competitorimport@default:default,com.sap.sailing.dashboards.gwt@5:true,com.sap.sailing.datamining.provider@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.deckmanadapter@4:true,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.racelogtrackingadapter@3:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.grib@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.manage2sail@default:default,com.sap.sailing.news@default:default,com.sap.sailing.polars.datamining.shared@default:default,com.sap.sailing.polars.datamining@default:default,com.sap.sailing.polars@4:true,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.serialization.shared.android@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway.test.support@5:true,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sailing.xrr.schema@default:default,com.sap.sailing.xrr.structureimport@default:default,com.sap.sailing.yachtscoring.resultimport@default:default,com.sap.sse.common@default:default,com.sap.sse.datamining.annotations@default:default,com.sap.sse.datamining.shared@default:default,com.sap.sse.datamining@default:default,com.sap.sse.filestorage@default:default,com.sap.sse.gwt.adminconsole@default:default,com.sap.sse.gwt@default:default,com.sap.sse.mail@4:true,com.sap.sse.mongodb@default:default,com.sap.sse.operationaltransformation@default:default,com.sap.sse.replication@4:true,com.sap.sse.security.common@default:default,com.sap.sse.security.ui@6:true,com.sap.sse.security.userstore.mongodb@4:true,com.sap.sse.security@5:true,com.sap.sse.shared.android@default:default,com.sap.sse@default:default,com.tractrac.clientmodule@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="yk-options" value="&#13;&#10;additional-options2=onexit\=snapshot&#13;&#10;"/>
</launchConfiguration>
@@ -23,6 +23,22 @@
<h2 class="releaseHeadline">Release Notes - Administration Console</h2>
<div class="innerContent">
<h2 class="articleSubheadline">Febrbuary 2017</h2>
<ul class="bulletList">
<li>Wind data in GRIB format can now be imported in the "Wind" sub-tab of the "Tracked Races" tab
in the <tt>AdminConsole</tt>. When one or more races are being tracked, with a tracking time
interval that includes the time point(s) for which the GRIB data is valid, the wind data at
the resolution of the GRIB file is added as separate wind fixes with type "WEB" to the race(s)
selected, or to all races if no race is selected.<p>
Multiple GRIB files can be specified; this is even necessary if GRIB sources are being used where
the so-called "U" and "V" or "speed" and "direction" components, respectively, are provided in
separate files. The importer will merge the GRIB sources to produce wind readings with true
wind direction and true wind speed.
Note that large GRIB files can result in many wind fixes being added to the WEB source. Make sure
the GRIB files you use are adequate in resolution and region as well as adequate in time. Obtaining
a forecast 72h in the future makes little sense for an in-shore race starting in 30min.
</li>
</ul>
<h2 class="articleSubheadline">January 2017</h2>
<ul class="bulletList">
<li>Filter boxes now support quoting phrases, such as <tt>"Race 2"</tt> to make them a single search term.
@@ -724,4 +724,14 @@ public class Util {
}
return result;
}
@SafeVarargs
public static <T extends Comparable<T>> T min(T... elements) {
return Collections.min(Arrays.asList(elements));
}
@SafeVarargs
public static <T extends Comparable<T>> T max(T... elements) {
return Collections.max(Arrays.asList(elements));
}
}
@@ -0,0 +1,21 @@
package com.sap.sse.common.util;
import java.util.Iterator;
import com.sap.sse.common.util.MappingIterator.MapFunction;
public class MappingIterable<S, T> implements Iterable<T> {
private final Iterable<S> iterable;
private final MapFunction<S, T> mapper;
public MappingIterable(Iterable<S> iterable, MapFunction<S, T> mapper) {
super();
this.iterable = iterable;
this.mapper = mapper;
}
@Override
public Iterator<T> iterator() {
return new MappingIterator<S, T>(iterable.iterator(), mapper);
}
}
@@ -0,0 +1,33 @@
package com.sap.sse.common.util;
import java.util.Iterator;
public class MappingIterator<S, T> implements Iterator<T> {
private final Iterator<S> iterator;
private final MapFunction<S, T> mapper;
public static interface MapFunction<S, T> {
T map(S s);
}
public MappingIterator(Iterator<S> iterator, MapFunction<S, T> mapper) {
this.iterator = iterator;
this.mapper = mapper;
}
@Override
public boolean hasNext() {
return iterator.hasNext();
}
@Override
public T next() {
return mapper.map(iterator.next());
}
@Override
public void remove() {
iterator.remove();
}
}
@@ -1,5 +1,6 @@
package com.sap.sse.datamining.shared;
import com.sap.sse.common.Duration;
import com.sap.sse.datamining.shared.impl.GenericGroupKey;
import com.sap.sse.datamining.shared.impl.dto.ClusterDTO;
@@ -10,6 +11,7 @@ public final class SSEDataMiningSerializationDummy implements SerializationDummy
private GenericGroupKey<String> groupKey;
private ClusterDTO cluster;
private Number n;
private Duration duration;
private SSEDataMiningSerializationDummy() { }
@@ -0,0 +1,22 @@
package com.sap.sse.datamining.impl.components.aggregators;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import com.sap.sse.datamining.components.Processor;
import com.sap.sse.datamining.shared.GroupKey;
public abstract class AbstractParallelComparableMaxAggregationProcessor<T extends Comparable<T>> extends
AbstractParallelSingleGroupedValueAggregationProcessor<T> {
public AbstractParallelComparableMaxAggregationProcessor(ExecutorService executor,
Collection<Processor<Map<GroupKey, T>, ?>> resultReceivers) {
super(executor, resultReceivers, "Maximum");
}
@Override
protected T compareValuesAndReturnNewResult(T currentResult, T newValue) {
return currentResult.compareTo(newValue) >= 0 ? currentResult : newValue;
}
}
@@ -0,0 +1,22 @@
package com.sap.sse.datamining.impl.components.aggregators;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import com.sap.sse.datamining.components.Processor;
import com.sap.sse.datamining.shared.GroupKey;
public abstract class AbstractParallelComparableMinAggregationProcessor<T extends Comparable<T>> extends
AbstractParallelSingleGroupedValueAggregationProcessor<T> {
public AbstractParallelComparableMinAggregationProcessor(ExecutorService executor,
Collection<Processor<Map<GroupKey, T>, ?>> resultReceivers) {
super(executor, resultReceivers, "Minimum");
}
@Override
protected T compareValuesAndReturnNewResult(T currentResult, T newValue) {
return currentResult.compareTo(newValue) <= 0 ? currentResult : newValue;
}
}
@@ -112,7 +112,8 @@ public class FunctionManager implements FunctionRegistry, FunctionProvider {
boolean functionHasBeenRegistered = false;
if (isValidDimension.matches(method) || (scanForStatistics && isValidStatistic.matches(method) )) {
functionHasBeenRegistered = registerFunction(previousFunctions, method);
} else if (isValidConnector.matches(method)) {
}
if (isValidConnector.matches(method)) {
functionHasBeenRegistered = handleConnectorMethod(method, previousFunctions, scanForStatistics);
}
functionsHaveBeenRegistered = functionsHaveBeenRegistered ? true : functionHasBeenRegistered;
+44
View File
@@ -0,0 +1,44 @@
package com.sap.sse.util;
import java.io.IOException;
import java.util.Formatter;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Appends to a {@link Logger} with a given {@link Level}. Can, e.g., be used together with
* {@link Formatter#Formatter(Appendable)} to obtain a formatter that writes its output into
* the log.
*
* @author Axel Uhl (D043530)
*
*/
public class LoggerAppender implements Appendable {
private final Level level;
private final Logger logger;
public LoggerAppender(Level level, Logger logger) {
super();
this.level = level;
this.logger = logger;
}
@Override
public Appendable append(CharSequence csq) throws IOException {
logger.log(level, csq.toString());
return this;
}
@Override
public Appendable append(CharSequence csq, int start, int end) throws IOException {
logger.log(level, csq.subSequence(start, end).toString());
return this;
}
@Override
public Appendable append(char c) throws IOException {
logger.log(level, ""+c);
return this;
}
}