mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-21 03:30:12 +00:00
Merge branch 'master' into bug3529
This commit is contained in:
commit
9a0cbf90d8
71 files changed
+1566
-360
No files matched your search
+13
-1
@@ -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
|
||||
+13
-1
@@ -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;
|
||||
}
|
||||
|
||||
+16
@@ -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");
|
||||
|
||||
Executable
+18
@@ -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();
|
||||
}
|
||||
}
|
||||
Executable
+17
@@ -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();
|
||||
}
|
||||
+44
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
+40
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
+2
-2
@@ -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
|
||||
|
||||
+63
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
+28
@@ -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);
|
||||
}
|
||||
}
|
||||
+28
@@ -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);
|
||||
}
|
||||
}
|
||||
+47
@@ -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;
|
||||
}
|
||||
}
|
||||
Executable
+48
@@ -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);
|
||||
}
|
||||
}
|
||||
Executable
+46
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
+13
@@ -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 +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);
|
||||
}
|
||||
+26
@@ -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
|
||||
+6
@@ -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();
|
||||
|
||||
+16
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
}
|
||||
+43
-2
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
+180
@@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
+70
-4
@@ -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)));
|
||||
}
|
||||
}
|
||||
Regular → Executable
-12
@@ -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"/>
|
||||
|
||||
+119
-48
@@ -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
|
||||
|
||||
+1
@@ -1774,4 +1774,5 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
|
||||
String eventRegattaHeaderLegendAudio();
|
||||
String eventRegattaHeaderLegendAudioNo();
|
||||
String set();
|
||||
String gribWindImport_Title();
|
||||
}
|
||||
+1
@@ -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
|
||||
|
||||
+1
@@ -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
|
||||
|
||||
+4
@@ -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) {
|
||||
|
||||
+54
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
+14
-51
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
+34
@@ -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;
|
||||
}
|
||||
}
|
||||
+11
-25
@@ -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;
|
||||
|
||||
+20
-27
@@ -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>
|
||||
|
||||
+26
-38
@@ -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
|
||||
+40
@@ -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;
|
||||
}
|
||||
}
|
||||
+38
-44
@@ -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;
|
||||
}
|
||||
}
|
||||
+38
@@ -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=" additional-options2=onexit\=snapshot "/>
|
||||
</launchConfiguration>
|
||||
+1
-1
@@ -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=" additional-options2=onexit\=snapshot "/>
|
||||
</launchConfiguration>
|
||||
+1
-1
@@ -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=" additional-options2=onexit\=snapshot "/>
|
||||
</launchConfiguration>
|
||||
+1
-1
@@ -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=" additional-options2=onexit\=snapshot "/>
|
||||
</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=" additional-options2=onexit\=snapshot "/>
|
||||
</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=" additional-options2=onexit\=snapshot "/>
|
||||
</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=" additional-options2=onexit\=snapshot "/>
|
||||
</launchConfiguration>
|
||||
+1
-1
@@ -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=" additional-options2=onexit\=snapshot "/>
|
||||
</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();
|
||||
}
|
||||
|
||||
}
|
||||
+2
@@ -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() { }
|
||||
|
||||
|
||||
+22
@@ -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;
|
||||
}
|
||||
}
|
||||
+22
@@ -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;
|
||||
}
|
||||
}
|
||||
+2
-1
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in new issue
Block a user