added ping mark functionality to adminConsole

This commit is contained in:
Fredrik Teschke committed 2014-03-07 22:42:14 +01:00
1 parent 335e090ebc
commit 9cffd20913
53 files changed
+440 -109

No files matched your search

@@ -32,4 +32,5 @@ Web-ContextPath: /igtimi
Bundle-Activator: com.sap.sailing.domain.igtimiadapter.impl.Activator
Export-Package: com.sap.sailing.domain.igtimiadapter,
com.sap.sailing.domain.igtimiadapter.datatypes,
com.sap.sailing.domain.igtimiadapter.impl;x-friends:="com.sap.sailing.gwt.ui.test",
com.sap.sailing.domain.igtimiadapter.shared
@@ -22,7 +22,11 @@ Export-Package: com.sap.sailing.domain.persistence,
com.sap.sailing.domain.racelogtrackingadapter.test",
com.sap.sailing.domain.persistence.media,
com.sap.sailing.domain.persistence.racelog.tracking,
com.sap.sailing.domain.persistence.racelog.tracking.impl;x-friends:="com.sap.sailing.domain.racelogtrackingadapter.testsupport,com.sap.sailing.mongodb.test,com.sap.sailing.domain.racelogtrackingadapter.test"
com.sap.sailing.domain.persistence.racelog.tracking.impl;
x-friends:="com.sap.sailing.domain.racelogtrackingadapter.testsupport,
com.sap.sailing.mongodb.test,
com.sap.sailing.domain.racelogtrackingadapter.test,
com.sap.sailing.server"
Bundle-ActivationPolicy: lazy
Import-Package: org.json.simple,
org.json.simple.parser,
@@ -1,46 +1,28 @@
package com.sap.sailing.domain.persistence.impl;
import java.util.Dictionary;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Set;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
import com.sap.sailing.domain.common.racelog.tracking.TypeBasedServiceFinder;
import com.sap.sailing.domain.persistence.racelog.tracking.GPSFixMongoHandler;
import com.sap.sailing.domain.persistence.racelog.tracking.impl.GPSFixMovingMongoHandlerImpl;
import com.sap.sailing.domain.persistence.racelog.tracking.impl.GPSFixMongoHandlerImpl;
import com.sap.sailing.domain.tracking.impl.GPSFixImpl;
import com.sap.sailing.domain.tracking.impl.GPSFixMovingImpl;
import com.sap.sailing.mongodb.MongoDBService;
public class Activator implements BundleActivator {
private Set<ServiceRegistration<?>> registrations = new HashSet<>();
@Override
public void start(BundleContext context) throws Exception {
for (CollectionNames name : CollectionNames.values())
MongoDBService.INSTANCE.registerExclusively(CollectionNames.class, name.name());
MongoObjectFactoryImpl mof = new MongoObjectFactoryImpl(null);
DomainObjectFactoryImpl dof = new DomainObjectFactoryImpl(null, null);
Dictionary<String, String> properties = new Hashtable<String, String>();
properties.put(TypeBasedServiceFinder.TYPE, GPSFixImpl.class.getName());
registrations.add(context.registerService(GPSFixMongoHandler.class,
new GPSFixMongoHandlerImpl(mof, dof), properties));
properties.put(TypeBasedServiceFinder.TYPE, GPSFixMovingImpl.class.getName());
registrations.add(context.registerService(GPSFixMongoHandler.class,
new GPSFixMovingMongoHandlerImpl(mof, dof), properties));
for (CollectionNames name : CollectionNames.values())
MongoDBService.INSTANCE.registerExclusively(CollectionNames.class, name.name());
}
@Override
public void stop(BundleContext context) throws Exception {
for (ServiceRegistration<?> reg : registrations) {
reg.unregister();
}
registrations.clear();
for (ServiceRegistration<?> reg : registrations) {
reg.unregister();
}
registrations.clear();
}
}
@@ -156,6 +156,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
private RaceLogEventRestoreFactory raceLogEventFactory;
private final DomainFactory baseDomainFactory;
private final TypeBasedServiceFinder<DeviceIdentifierMongoHandler> deviceIdentifierServiceFinder;
private final TypeBasedServiceFinderFactory serviceFinderFactory;
/**
* Uses <code>null</code> as the {@link TypeBasedServiceFinder}, meaning that no {@link DeviceIdentifier}s can be loaded
@@ -167,6 +168,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
public DomainObjectFactoryImpl(DB db, DomainFactory baseDomainFactory, TypeBasedServiceFinderFactory serviceFinderFactory) {
super();
this.serviceFinderFactory = serviceFinderFactory;
if (serviceFinderFactory != null) {
this.deviceIdentifierServiceFinder = serviceFinderFactory.createServiceFinder(DeviceIdentifierMongoHandler.class);
} else {
@@ -924,7 +926,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
BasicDBList dbSeries = (BasicDBList) dbRegatta.get(FieldNames.REGATTA_SERIES.name());
Iterable<Series> series = loadSeries(dbSeries, trackedRegattaRegistry);
RaceLogStore raceLogStore = MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(
new MongoObjectFactoryImpl(database),
new MongoObjectFactoryImpl(database, serviceFinderFactory),
this);
Serializable courseAreaId = (Serializable) dbRegatta.get(FieldNames.COURSE_AREA_ID.name());
@@ -1087,7 +1089,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
List<RaceLogEvent> eventsToMigrate = loadRaceLogEvents(result, query);
if (!eventsToMigrate.isEmpty()) {
// ... migrate them...
MongoRaceLogStoreVisitor storeVisitor = new MongoRaceLogStoreVisitor(identifier, new MongoObjectFactoryImpl(database));
MongoRaceLogStoreVisitor storeVisitor = new MongoRaceLogStoreVisitor(identifier, new MongoObjectFactoryImpl(database, serviceFinderFactory));
for (RaceLogEvent event : eventsToMigrate) {
event.accept(storeVisitor);
}
@@ -1143,8 +1143,10 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
public static DBObject storeDeviceId(
TypeBasedServiceFinder<DeviceIdentifierMongoHandler> deviceIdentifierServiceFinder, DeviceIdentifier device)
throws TransformationException, NoCorrespondingServiceRegisteredException{
Object deviceTypeId = deviceIdentifierServiceFinder.findService(device.getIdentifierType()).transformForth(device);
throws TransformationException, NoCorrespondingServiceRegisteredException {
String type = device.getIdentifierType();
DeviceIdentifierMongoHandler handler = deviceIdentifierServiceFinder.findService(type);
Object deviceTypeId = handler.transformForth(device);
return new BasicDBObjectBuilder()
.add(FieldNames.DEVICE_TYPE.name(), device.getIdentifierType())
.add(FieldNames.DEVICE_TYPE_ID.name(), deviceTypeId).get();
@@ -4,6 +4,8 @@ import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.sap.sailing.domain.common.Position;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.persistence.DomainObjectFactory;
import com.sap.sailing.domain.persistence.MongoObjectFactory;
import com.sap.sailing.domain.persistence.impl.DomainObjectFactoryImpl;
import com.sap.sailing.domain.persistence.impl.MongoObjectFactoryImpl;
import com.sap.sailing.domain.persistence.racelog.tracking.GPSFixMongoHandler;
@@ -14,9 +16,9 @@ public class GPSFixMongoHandlerImpl implements GPSFixMongoHandler {
MongoObjectFactoryImpl mof;
DomainObjectFactoryImpl dof;
public GPSFixMongoHandlerImpl(MongoObjectFactoryImpl mof, DomainObjectFactoryImpl dof) {
this.mof = mof;
this.dof = dof;
public GPSFixMongoHandlerImpl(MongoObjectFactory mof, DomainObjectFactory dof) {
this.mof = (MongoObjectFactoryImpl) mof;
this.dof = (DomainObjectFactoryImpl) dof;
}
@Override
@@ -5,6 +5,8 @@ import com.mongodb.DBObject;
import com.sap.sailing.domain.common.Position;
import com.sap.sailing.domain.common.SpeedWithBearing;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.persistence.DomainObjectFactory;
import com.sap.sailing.domain.persistence.MongoObjectFactory;
import com.sap.sailing.domain.persistence.impl.DomainObjectFactoryImpl;
import com.sap.sailing.domain.persistence.impl.MongoObjectFactoryImpl;
import com.sap.sailing.domain.persistence.racelog.tracking.GPSFixMongoHandler;
@@ -16,9 +18,9 @@ public class GPSFixMovingMongoHandlerImpl implements GPSFixMongoHandler {
MongoObjectFactoryImpl mof;
DomainObjectFactoryImpl dof;
public GPSFixMovingMongoHandlerImpl(MongoObjectFactoryImpl mof, DomainObjectFactoryImpl dof) {
this.mof = mof;
this.dof = dof;
public GPSFixMovingMongoHandlerImpl(MongoObjectFactory mof, DomainObjectFactory dof) {
this.mof = (MongoObjectFactoryImpl) mof;
this.dof = (DomainObjectFactoryImpl) dof;
}
@Override
@@ -1,4 +1,4 @@
package com.sap.sailing.domain.racelog.tracking.test;
package com.sap.sailing.domain.racelogtracking.test;
import static com.sap.sailing.domain.common.impl.Util.size;
import static junit.framework.Assert.assertEquals;
@@ -1,4 +1,4 @@
package com.sap.sailing.domain.racelog.tracking.test;
package com.sap.sailing.domain.racelogtracking.test;
import java.io.BufferedReader;
import java.io.DataOutputStream;
@@ -1,4 +1,4 @@
package com.sap.sailing.domain.racelog.tracking.test.impl;
package com.sap.sailing.domain.racelogtracking.test.impl;
import static com.sap.sailing.domain.common.impl.Util.size;
import static junit.framework.Assert.assertNotNull;
@@ -45,10 +45,10 @@ import com.sap.sailing.domain.racelog.RaceLogEventAuthor;
import com.sap.sailing.domain.racelog.RaceLogEventFactory;
import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier;
import com.sap.sailing.domain.racelog.tracking.GPSFixStore;
import com.sap.sailing.domain.racelog.tracking.RaceLogTrackingAdapter;
import com.sap.sailing.domain.racelog.tracking.SmartphoneImeiIdentifier;
import com.sap.sailing.domain.racelog.tracking.impl.RaceLogTrackingAdapterFactoryImpl;
import com.sap.sailing.domain.racelog.tracking.test.mock.MockServiceFinderFactory;
import com.sap.sailing.domain.racelogtracking.RaceLogTrackingAdapter;
import com.sap.sailing.domain.racelogtracking.impl.RaceLogTrackingAdapterFactoryImpl;
import com.sap.sailing.domain.tracking.RacesHandle;
import com.sap.sailing.domain.tracking.Track;
import com.sap.sailing.domain.tracking.TrackedRace;
@@ -1,4 +1,4 @@
package com.sap.sailing.domain.racelog.tracking.test.impl;
package com.sap.sailing.domain.racelogtracking.test.impl;
import static com.sap.sailing.domain.common.impl.Util.size;
import static junit.framework.Assert.assertEquals;
@@ -20,9 +20,9 @@ import com.sap.sailing.domain.common.racelog.tracking.NoCorrespondingServiceRegi
import com.sap.sailing.domain.common.racelog.tracking.TransformationException;
import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier;
import com.sap.sailing.domain.racelog.tracking.SmartphoneImeiIdentifier;
import com.sap.sailing.domain.racelog.tracking.servlet.RecordFixesPostServlet;
import com.sap.sailing.domain.racelog.tracking.test.AbstractGPSFixStoreTest;
import com.sap.sailing.domain.racelog.tracking.test.mock.MockDeviceAndSessioinIdentifierWithGPSFixesDeserializer;
import com.sap.sailing.domain.racelogtracking.servlet.RecordFixesPostServlet;
import com.sap.sailing.domain.racelogtracking.test.AbstractGPSFixStoreTest;
import com.sap.sailing.domain.tracking.GPSFix;
import com.sap.sailing.domain.tracking.GPSFixMoving;
import com.sap.sailing.domain.tracking.impl.DynamicGPSFixMovingTrackImpl;
@@ -1,4 +1,4 @@
package com.sap.sailing.domain.racelog.tracking.test.impl;
package com.sap.sailing.domain.racelogtracking.test.impl;
import java.util.Arrays;
import java.util.Collections;
@@ -22,7 +22,7 @@ import com.sap.sailing.domain.common.racelog.tracking.TransformationException;
import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore;
import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier;
import com.sap.sailing.domain.racelog.tracking.SmartphoneImeiIdentifier;
import com.sap.sailing.domain.racelog.tracking.test.AbstractGPSFixStoreTest;
import com.sap.sailing.domain.racelogtracking.test.AbstractGPSFixStoreTest;
import com.sap.sailing.domain.tracking.TrackedRegatta;
import com.sap.sailing.domain.tracking.impl.DynamicTrackedRaceImpl;
import com.sap.sailing.domain.tracking.impl.EmptyWindStore;
@@ -1,4 +1,4 @@
package com.sap.sailing.domain.racelog.tracking.test.manual;
package com.sap.sailing.domain.racelogtracking.test.manual;
import java.io.IOException;
import java.io.Serializable;
@@ -18,7 +18,7 @@ import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl;
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.common.impl.Util.Triple;
import com.sap.sailing.domain.racelog.tracking.SmartphoneImeiIdentifier;
import com.sap.sailing.domain.racelog.tracking.test.AbstractJsonOverHttpTest;
import com.sap.sailing.domain.racelogtracking.test.AbstractJsonOverHttpTest;
import com.sap.sailing.domain.tracking.GPSFix;
import com.sap.sailing.domain.tracking.GPSFixMoving;
import com.sap.sailing.domain.tracking.impl.GPSFixImpl;
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
<classpathentry kind="output" path="bin"/>
</classpath>
@@ -1,7 +1,7 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
org.eclipse.jdt.core.compiler.compliance=1.7
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
org.eclipse.jdt.core.compiler.compliance=1.6
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.source=1.7
org.eclipse.jdt.core.compiler.source=1.6
@@ -4,7 +4,7 @@ Bundle-Name: Testsupport
Bundle-SymbolicName: com.sap.sailing.domain.racelogtrackingadapter.testsupport
Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Require-Bundle: com.sap.sailing.domain.shared.android,
com.sap.sailing.domain,
com.sap.sailing.domain.common,
@@ -20,7 +20,7 @@ import com.sap.sailing.server.gateway.serialization.racelog.tracking.GPSFixJsonH
*
*/
public class MockServiceFinderFactory implements TypeBasedServiceFinderFactory {
Map<Class<?>, TypeBasedServiceFinder<?>> serviceFinders = new HashMap<>();
Map<Class<?>, TypeBasedServiceFinder<?>> serviceFinders = new HashMap<Class<?>, TypeBasedServiceFinder<?>>();
public MockServiceFinderFactory() {
serviceFinders.put(DeviceIdentifierMongoHandler.class, new MockSmartphoneImeiMongoServiceFinder());
@@ -3,7 +3,7 @@ package com.sap.sailing.domain.racelog.tracking.test.mock;
import com.sap.sailing.domain.common.racelog.tracking.TypeBasedServiceFinder;
import com.sap.sailing.domain.persistence.racelog.tracking.DeviceIdentifierMongoHandler;
import com.sap.sailing.domain.racelog.tracking.SmartphoneImeiIdentifier;
import com.sap.sailing.domain.racelog.tracking.impl.SmartphoneImeiMongoHandlerImpl;
import com.sap.sailing.domain.racelogtracking.impl.SmartphoneImeiMongoHandlerImpl;
/**
* A simplified implementation of the {@link TypeBasedServiceFinder} interface that, when the device type
@@ -18,8 +18,8 @@ Import-Package: javax.servlet;version="2.6.0",
org.json.simple,
org.json.simple.parser,
org.osgi.framework;version="1.6.0"
Export-Package: com.sap.sailing.domain.racelog.tracking,
com.sap.sailing.domain.racelog.tracking.impl;x-friends:="com.sap.sailing.domain.racelogtrackingadapter.testsupport",
com.sap.sailing.domain.racelog.tracking.servlet;x-friends:="com.sap.sailing.domain.racelogtrackingadapter.test"
Export-Package: com.sap.sailing.domain.racelogtracking,
com.sap.sailing.domain.racelogtracking.impl;x-friends:="com.sap.sailing.domain.racelogtrackingadapter.testsupport,com.sap.sailing.gwt.ui.test",
com.sap.sailing.domain.racelogtracking.servlet;x-friends:="com.sap.sailing.domain.racelogtrackingadapter.test"
Web-ContextPath: /tracking
Bundle-Activator: com.sap.sailing.domain.racelog.tracking.impl.Activator
Bundle-Activator: com.sap.sailing.domain.racelogtracking.impl.Activator
@@ -7,7 +7,7 @@
<servlet>
<servlet-name>RecordFixesPostServlet</servlet-name>
<servlet-class>com.sap.sailing.domain.racelog.tracking.servlet.RecordFixesPostServlet</servlet-class>
<servlet-class>com.sap.sailing.domain.racelogtracking.servlet.RecordFixesPostServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RecordFixesPostServlet</servlet-name>
@@ -1,7 +1,9 @@
package com.sap.sailing.domain.racelog.tracking;
package com.sap.sailing.domain.racelogtracking;
import java.util.UUID;
import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier;
/**
* A device identifier used to identify a non-existent, virtual device, which is used only once as an
* identifier to add a single fix to a track (i.e. pinging the location of that track's item).
@@ -1,10 +1,9 @@
package com.sap.sailing.domain.racelog.tracking.impl;
package com.sap.sailing.domain.racelogtracking;
import java.util.UUID;
import com.sap.sailing.domain.base.IsManagedBySharedDomainFactory;
import com.sap.sailing.domain.base.SharedDomainFactory;
import com.sap.sailing.domain.racelog.tracking.PingDeviceIdentifier;
public class PingDeviceIdentifierImpl implements PingDeviceIdentifier {
private static final long serialVersionUID = -4049961972156611640L;
@@ -41,4 +40,12 @@ public class PingDeviceIdentifierImpl implements PingDeviceIdentifier {
public String getStringRepresentation() {
return id.toString();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof PingDeviceIdentifier) {
return id.equals(((PingDeviceIdentifier) obj).getId());
}
return false;
}
}
@@ -1,4 +1,4 @@
package com.sap.sailing.domain.racelog.tracking;
package com.sap.sailing.domain.racelogtracking;
import java.io.FileNotFoundException;
import java.net.MalformedURLException;
@@ -14,7 +14,8 @@ import com.sap.sailing.domain.common.racelog.tracking.RaceLogTrackingState;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.RegattaLeaderboard;
import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.tracking.impl.RaceLogRaceTracker;
import com.sap.sailing.domain.racelog.tracking.DenoteForTrackingEvent;
import com.sap.sailing.domain.racelogtracking.impl.RaceLogRaceTracker;
import com.sap.sailing.domain.tracking.RacesHandle;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.server.RacingEventService;
@@ -1,4 +1,4 @@
package com.sap.sailing.domain.racelog.tracking;
package com.sap.sailing.domain.racelogtracking;
import com.sap.sailing.domain.base.DomainFactory;
@@ -1,4 +1,4 @@
package com.sap.sailing.domain.racelog.tracking.impl;
package com.sap.sailing.domain.racelogtracking.impl;
import java.util.Dictionary;
import java.util.HashSet;
@@ -13,8 +13,9 @@ import org.osgi.framework.ServiceRegistration;
import com.sap.sailing.domain.common.racelog.tracking.TypeBasedServiceFinder;
import com.sap.sailing.domain.persistence.racelog.tracking.DeviceIdentifierMongoHandler;
import com.sap.sailing.domain.racelog.tracking.RaceLogTrackingAdapterFactory;
import com.sap.sailing.domain.racelog.tracking.SmartphoneImeiIdentifier;
import com.sap.sailing.domain.racelogtracking.PingDeviceIdentifierImpl;
import com.sap.sailing.domain.racelogtracking.RaceLogTrackingAdapterFactory;
import com.sap.sailing.domain.tracking.GPSFix;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.GPSFixJsonDeserializer;
@@ -1,4 +1,4 @@
package com.sap.sailing.domain.racelog.tracking.impl;
package com.sap.sailing.domain.racelogtracking.impl;
import org.json.simple.JSONObject;
@@ -1,11 +1,12 @@
package com.sap.sailing.domain.racelog.tracking.impl;
package com.sap.sailing.domain.racelogtracking.impl;
import java.util.UUID;
import com.sap.sailing.domain.common.racelog.tracking.TransformationException;
import com.sap.sailing.domain.persistence.racelog.tracking.DeviceIdentifierMongoHandler;
import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier;
import com.sap.sailing.domain.racelog.tracking.PingDeviceIdentifier;
import com.sap.sailing.domain.racelogtracking.PingDeviceIdentifier;
import com.sap.sailing.domain.racelogtracking.PingDeviceIdentifierImpl;
public class PingDeviceMongoHandlerImpl implements DeviceIdentifierMongoHandler {
private PingDeviceIdentifier castIdentifier(DeviceIdentifier identifier) throws TransformationException {
@@ -1,4 +1,4 @@
package com.sap.sailing.domain.racelog.tracking.impl;
package com.sap.sailing.domain.racelogtracking.impl;
import java.util.ArrayList;
import java.util.Collections;
@@ -242,9 +242,11 @@ public class RaceLogRaceTracker extends BaseRaceLogEventVisitor implements RaceT
DynamicGPSFixTrack<Mark, GPSFix> track = trackedRace.getOrCreateTrack(mark);
List<DeviceMapping<Mark>> oldMappings = markMappings.get(mark);
for (DeviceMapping<Mark> newMapping : newMappings.get(mark)) {
if (!hasMappingAlreadyBeenLoaded(newMapping, oldMappings)) {
gpsFixStore.loadMarkTrack(track, newMapping);
if (oldMappings != null) {
for (DeviceMapping<Mark> newMapping : newMappings.get(mark)) {
if (!hasMappingAlreadyBeenLoaded(newMapping, oldMappings)) {
gpsFixStore.loadMarkTrack(track, newMapping);
}
}
}
}
@@ -1,4 +1,4 @@
package com.sap.sailing.domain.racelog.tracking.impl;
package com.sap.sailing.domain.racelogtracking.impl;
import java.util.Collections;
import java.util.Set;
@@ -1,8 +1,8 @@
package com.sap.sailing.domain.racelog.tracking.impl;
package com.sap.sailing.domain.racelogtracking.impl;
import com.sap.sailing.domain.base.DomainFactory;
import com.sap.sailing.domain.racelog.tracking.RaceLogTrackingAdapter;
import com.sap.sailing.domain.racelog.tracking.RaceLogTrackingAdapterFactory;
import com.sap.sailing.domain.racelogtracking.RaceLogTrackingAdapter;
import com.sap.sailing.domain.racelogtracking.RaceLogTrackingAdapterFactory;
public enum RaceLogTrackingAdapterFactoryImpl implements RaceLogTrackingAdapterFactory {
INSTANCE;
@@ -1,4 +1,4 @@
package com.sap.sailing.domain.racelog.tracking.impl;
package com.sap.sailing.domain.racelogtracking.impl;
import java.io.FileNotFoundException;
import java.net.MalformedURLException;
@@ -32,8 +32,8 @@ import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.RaceLogEvent;
import com.sap.sailing.domain.racelog.RaceLogEventFactory;
import com.sap.sailing.domain.racelog.RaceLogIdentifier;
import com.sap.sailing.domain.racelog.tracking.RaceLogTrackingAdapter;
import com.sap.sailing.domain.racelog.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer;
import com.sap.sailing.domain.racelogtracking.RaceLogTrackingAdapter;
import com.sap.sailing.domain.tracking.RacesHandle;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.server.RacingEventService;
@@ -1,4 +1,4 @@
package com.sap.sailing.domain.racelog.tracking.impl;
package com.sap.sailing.domain.racelogtracking.impl;
import com.sap.sailing.domain.common.racelog.tracking.TransformationException;
import com.sap.sailing.domain.persistence.racelog.tracking.DeviceIdentifierMongoHandler;
@@ -1,4 +1,4 @@
package com.sap.sailing.domain.racelog.tracking.servlet;
package com.sap.sailing.domain.racelogtracking.servlet;
import java.io.Serializable;
import java.util.List;
@@ -0,0 +1,32 @@
package com.sap.sailing.domain.racelog.tracking.analyzing.impl;
import com.sap.sailing.domain.common.WithID;
import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.RaceLogEvent;
import com.sap.sailing.domain.racelog.analyzing.impl.RaceLogAnalyzer;
import com.sap.sailing.domain.racelog.tracking.DeviceMappingEvent;
public class LastPingMappingEventFinder<T extends WithID> extends RaceLogAnalyzer<DeviceMappingEvent<T>> {
private final WithID item;
public LastPingMappingEventFinder(RaceLog raceLog, WithID forItem) {
super(raceLog);
this.item = forItem;
}
@Override
protected DeviceMappingEvent<T> performAnalysis() {
for (RaceLogEvent e : raceLog.getUnrevokedEventsDescending()) {
if (e instanceof DeviceMappingEvent) {
DeviceMappingEvent<?> mappingEvent = (DeviceMappingEvent<?>) e;
if (item.equals(mappingEvent.getMappedTo()) && mappingEvent.getFrom().equals(mappingEvent.getTo())) {
@SuppressWarnings("unchecked")
DeviceMappingEvent<T> cast = (DeviceMappingEvent<T>) mappingEvent;
return cast;
}
}
}
return null;
}
}
@@ -3,8 +3,10 @@ package com.sap.sailing.domain.racelog.tracking.impl;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.TimeRange;
import com.sap.sailing.domain.common.WithID;
import com.sap.sailing.domain.common.impl.TimeRangeImpl;
import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier;
import com.sap.sailing.domain.racelog.tracking.DeviceMapping;
import com.sap.sailing.domain.racelog.tracking.DeviceMappingEvent;
public class DeviceMappingImpl<ItemType extends WithID> implements DeviceMapping<ItemType> {
private static final long serialVersionUID = -4602948402371623654L;
@@ -38,4 +40,8 @@ public class DeviceMappingImpl<ItemType extends WithID> implements DeviceMapping
public TimePoint getTimePoint() {
return timeRange.from();
}
public static <T extends WithID> DeviceMapping<T> convertToDeviceMapping(DeviceMappingEvent<T> event) {
return new DeviceMappingImpl<T>(event.getMappedTo(), event.getDevice(), new TimeRangeImpl(event.getFrom(), event.getTo()));
}
}
@@ -10,9 +10,13 @@ Require-Bundle: com.sap.sailing.server,
org.hamcrest.core;bundle-version="1.1.0",
com.sap.sailing.expeditionconnector,
org.mockito.mockito-core;bundle-version="1.9.5",
org.objenesis;bundle-version="1.3.0"
org.objenesis;bundle-version="1.3.0",
com.sap.sailing.domain.igtimiadapter.persistence;bundle-version="1.0.0",
com.sap.sailing.domain.racelogtrackingadapter.testsupport;bundle-version="1.0.0"
Bundle-ClassPath: .
Import-Package: javax.jms;version="1.1.0",
Import-Package: com.sap.sailing.domain.igtimiadapter.impl,
com.sap.sailing.domain.racelogtracking.impl,
javax.jms;version="1.1.0",
javax.servlet;version="2.6.0",
javax.servlet.http;version="2.6.0",
junit.framework;version="4.8.1",
@@ -0,0 +1,46 @@
package com.sap.sailing.gwt.ui.test;
import java.util.Collections;
import java.util.UUID;
import org.junit.Before;
import org.junit.Test;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.base.impl.FleetImpl;
import com.sap.sailing.domain.base.impl.SeriesImpl;
import com.sap.sailing.domain.common.dto.PositionDTO;
import com.sap.sailing.domain.leaderboard.RegattaLeaderboard;
import com.sap.sailing.domain.leaderboard.impl.HighPoint;
import com.sap.sailing.gwt.ui.shared.MarkDTO;
import com.sap.sailing.server.RacingEventService;
public class PingMarkViaRaceLogTest {
private SailingServiceImplMock sailingService;
private RacingEventService service;
private final String columnName = "column";
private final Fleet fleet = new FleetImpl("fleet");
@Before
public void prepare() {
sailingService = new SailingServiceImplMock();
service = sailingService.getRacingEventService();
}
@Test
public void testPinging() {
service.getMongoObjectFactory().getDatabase().dropDatabase();
Series series = new SeriesImpl("series", false, Collections.singletonList(fleet),
Collections.singletonList(columnName), service);
Regatta regatta = service.createRegatta("regatta", "Laser", UUID.randomUUID(), Collections.<Series>singletonList(series),
false, new HighPoint(), UUID.randomUUID());
RegattaLeaderboard leaderboard = service.addRegattaLeaderboard(regatta.getRegattaIdentifier(), "RegattaLeaderboard", new int[] {});
MarkDTO mark = new MarkDTO("mark", "mark");
PositionDTO position = new PositionDTO(30, 40);
sailingService.pingMarkViaRaceLogTracking(leaderboard.getName(), columnName, fleet.getName(), mark, position);
}
}
@@ -16,6 +16,9 @@ import com.sap.sailing.domain.base.DomainFactory;
import com.sap.sailing.domain.common.RegattaIdentifier;
import com.sap.sailing.domain.common.ScoreCorrectionProvider;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.racelog.tracking.test.mock.MockServiceFinderFactory;
import com.sap.sailing.domain.racelogtracking.RaceLogTrackingAdapterFactory;
import com.sap.sailing.domain.racelogtracking.impl.RaceLogTrackingAdapterFactoryImpl;
import com.sap.sailing.domain.swisstimingadapter.RaceSpecificMessageLoader;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingAdapter;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingAdapterFactory;
@@ -38,7 +41,7 @@ public class SailingServiceImplMock extends SailingServiceImpl {
public SailingServiceImplMock() {
super();
service = new RacingEventServiceImpl();
service = new RacingEventServiceImpl(true, new MockServiceFinderFactory());
}
@Override
@@ -155,6 +158,16 @@ public class SailingServiceImplMock extends SailingServiceImpl {
when(result.getService()).thenReturn(swissTimingReplayService);
return result;
}
@Override
protected ServiceTracker<RaceLogTrackingAdapterFactory, RaceLogTrackingAdapterFactory> createAndOpenRaceLogTrackingAdapterTracker(
BundleContext context) {
@SuppressWarnings("unchecked")
ServiceTracker<RaceLogTrackingAdapterFactory, RaceLogTrackingAdapterFactory> result = mock(ServiceTracker.class);
RaceLogTrackingAdapterFactory factory = RaceLogTrackingAdapterFactoryImpl.INSTANCE;
when(result.getService()).thenReturn(factory);
return result;
}
@Override
protected RacingEventService getService() {
@@ -163,4 +176,8 @@ public class SailingServiceImplMock extends SailingServiceImpl {
}
return service;
}
public RacingEventService getRacingEventService() {
return getService();
}
}
@@ -79,4 +79,7 @@ interface AdminConsoleResources extends ClientBundle {
@Source("com/sap/sailing/gwt/ui/client/images/map_devices.png")
ImageResource mapDevices();
@Source("com/sap/sailing/gwt/ui/client/images/ping.png")
ImageResource ping();
}
@@ -0,0 +1,64 @@
package com.sap.sailing.gwt.ui.adminconsole;
import com.google.gwt.user.client.ui.DoubleBox;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.dto.PositionDTO;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.gwt.ui.DataEntryDialog;
public class PositionEntryDialog extends DataEntryDialog<PositionDTO> {
private final DoubleBox lat;
private final DoubleBox lng;
private final StringMessages stringMessages;
private static final double ERROR_VAL = Double.MIN_VALUE;
public PositionEntryDialog(String title, final StringMessages stringMessages, DialogCallback<PositionDTO> callback) {
super(title, title, stringMessages.save(), stringMessages.cancel(),
new Validator<PositionDTO>() {
@Override
public String getErrorMessage(PositionDTO valueToValidate) {
if (valueToValidate.latDeg == ERROR_VAL) {
return stringMessages.pleaseEnterA(stringMessages.latitude());
}
if (valueToValidate.latDeg > 90 || valueToValidate.latDeg < -90) {
return stringMessages.pleaseEnterAValidValueFor(stringMessages.latitude(), "-90.0 - 90.0");
}
if (valueToValidate.lngDeg == ERROR_VAL) {
return stringMessages.pleaseEnterA(stringMessages.longitude());
}
if (valueToValidate.lngDeg > 180 || valueToValidate.lngDeg < -180) {
return stringMessages.pleaseEnterAValidValueFor(stringMessages.latitude(), "-180.0 - 180.0");
}
return null;
}
}, true, callback);
this.stringMessages = stringMessages;
lat = createDoubleBox(10);
lng = createDoubleBox(10);
}
@Override
protected PositionDTO getResult() {
Double latDeg = lat.getValue();
Double lngDeg = lng.getValue();
return new PositionDTO(latDeg == null ? ERROR_VAL : latDeg, lngDeg == null ? ERROR_VAL : lngDeg);
}
@Override
protected Widget getAdditionalWidget() {
Grid grid = new Grid(2, 2);
grid.setWidget(0, 0, new Label(stringMessages.latitude() + " (" + stringMessages.degreesShort() + ")"));
grid.setWidget(0, 1, lat);
grid.setWidget(1, 0, new Label(stringMessages.longitude() + " (" + stringMessages.degreesShort() + ")"));
grid.setWidget(1, 1, lng);
return grid;
}
}
@@ -17,13 +17,11 @@ import com.sap.sailing.gwt.ui.client.StringMessages;
public class RaceLogTrackingCompetitorRegistrationsDialog extends RaceLogTrackingDialog {
private CompetitorTableWrapper competitorTable;
private final boolean filterByLeaderBoardInitially = false;
private final boolean editable;
public RaceLogTrackingCompetitorRegistrationsDialog(final SailingServiceAsync sailingService, final StringMessages stringMessages,
final ErrorReporter errorReporter, final String leaderboardName,
final String raceColumnName, final String fleetName, boolean editable) {
super(sailingService, stringMessages, errorReporter, leaderboardName, raceColumnName, fleetName);
this.editable = editable;
super(sailingService, stringMessages, errorReporter, leaderboardName, raceColumnName, fleetName, editable);
competitorTable.refreshCompetitorList(filterByLeaderBoardInitially ? leaderboardName : null,
true, new Callback<Iterable<CompetitorDTO>, Throwable>() {
@@ -3,12 +3,14 @@ package com.sap.sailing.gwt.ui.adminconsole;
import java.util.Collection;
import java.util.List;
import com.google.gwt.cell.client.FieldUpdater;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Panel;
import com.sap.sailing.domain.common.PassingInstruction;
import com.sap.sailing.domain.common.dto.PositionDTO;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
@@ -59,6 +61,41 @@ public class RaceLogTrackingCourseDefinitionDialog extends RaceLogTrackingDialog
}
});
courseActionsPanel.insert(cancel, courseActionsPanel.getWidgetIndex(RaceLogCourseManagementWidget.this.saveButton));
ImagesBarColumn<MarkDTO, RaceLogTrackingCourseDefinitionDialogMarksImagesBarCell> actionColumn =
new ImagesBarColumn<MarkDTO, RaceLogTrackingCourseDefinitionDialogMarksImagesBarCell>(
new RaceLogTrackingCourseDefinitionDialogMarksImagesBarCell(stringMessages));
actionColumn.setFieldUpdater(new FieldUpdater<MarkDTO, String>() {
@Override
public void update(int index, final MarkDTO markDTO, String value) {
if (RaceLogTrackingCourseDefinitionDialogMarksImagesBarCell.ACTION_PING.equals(value)) {
new PositionEntryDialog(stringMessages.pingPosition(stringMessages.mark()),
stringMessages, new DialogCallback<PositionDTO>() {
@Override
public void ok(PositionDTO position) {
sailingService.pingMarkViaRaceLogTracking(leaderboardName, raceColumnName, fleetName,
markDTO, position, new AsyncCallback<Void>() {
@Override
public void onSuccess(Void result) {
refresh();
}
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Could not ping mark: " + caught.getMessage());
}
});
}
@Override
public void cancel() {}
}).show();
}
}
});
marksTable.addColumn(actionColumn);
}
@Override
@@ -0,0 +1,26 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.ArrayList;
import com.google.gwt.core.client.GWT;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.shared.components.ImagesBarCell;
public class RaceLogTrackingCourseDefinitionDialogMarksImagesBarCell extends ImagesBarCell {
public static final String ACTION_PING = "ACTION_PING";
private static AdminConsoleResources resources = GWT.create(AdminConsoleResources.class);
private final StringMessages stringMessages;
public RaceLogTrackingCourseDefinitionDialogMarksImagesBarCell(StringMessages stringMessages) {
super();
this.stringMessages = stringMessages;
}
@Override
protected Iterable<ImageSpec> getImageSpecs() {
ArrayList<ImageSpec> result = new ArrayList<ImageSpec>();
result.add(new ImageSpec(ACTION_PING, stringMessages.pingPosition(stringMessages.mark()), makeImagePrototype(resources.ping())));
return result;
}
}
@@ -19,15 +19,22 @@ public abstract class RaceLogTrackingDialog extends DialogBox {
protected final String raceColumnName;
protected final String fleetName;
protected Button saveButton;
protected final boolean editable;
public RaceLogTrackingDialog(SailingServiceAsync sailingService, StringMessages stringMessages,
ErrorReporter errorReporter, String leaderboardName, String raceColumnName, String fleetName) {
this(sailingService, stringMessages, errorReporter, leaderboardName, raceColumnName, fleetName, true);
}
public RaceLogTrackingDialog(SailingServiceAsync sailingService, StringMessages stringMessages,
ErrorReporter errorReporter, String leaderboardName, String raceColumnName, String fleetName, boolean editable) {
this.sailingService = sailingService;
this.stringMessages = stringMessages;
this.errorReporter = errorReporter;
this.leaderboardName = leaderboardName;
this.raceColumnName = raceColumnName;
this.fleetName = fleetName;
this.editable = editable;
VerticalPanel mainPanel = new VerticalPanel();
setWidget(mainPanel);
@@ -29,6 +29,7 @@ import com.sap.sailing.domain.common.configuration.DeviceConfigurationMatcherTyp
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.FleetDTO;
import com.sap.sailing.domain.common.dto.IncrementalOrFullLeaderboardDTO;
import com.sap.sailing.domain.common.dto.PositionDTO;
import com.sap.sailing.domain.common.dto.RaceColumnDTO;
import com.sap.sailing.domain.common.dto.RaceColumnInSeriesDTO;
import com.sap.sailing.domain.common.dto.RaceDTO;
@@ -37,6 +38,7 @@ import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.common.impl.Util.Triple;
import com.sap.sailing.domain.common.racelog.tracking.RaceNotCreatedException;
import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.tracking.GPSFixStore;
import com.sap.sailing.gwt.ui.shared.BulkScoreCorrectionDTO;
import com.sap.sailing.gwt.ui.shared.CompactRaceMapDataDTO;
import com.sap.sailing.gwt.ui.shared.CompetitorsRaceDataDTO;
@@ -413,4 +415,9 @@ public interface SailingService extends RemoteService {
void addCourseDefinitionToRaceLog(String leaderboardName, String raceColumnName, String fleetName, List<Pair<ControlPointDTO, PassingInstruction>> course);
RaceCourseDTO getLastCourseDefinitionInRaceLog(String leaderboardName, String raceColumnName, String fleetName);
/**
* Adds a fix to the {@link GPSFixStore}, and creates a mapping with a virtual device for exactly the current timepoint.
*/
void pingMarkViaRaceLogTracking(String leaderboardName, String raceColumnName, String fleetName, MarkDTO mark, PositionDTO position);
}
@@ -28,6 +28,7 @@ import com.sap.sailing.domain.common.configuration.DeviceConfigurationMatcherTyp
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.FleetDTO;
import com.sap.sailing.domain.common.dto.IncrementalOrFullLeaderboardDTO;
import com.sap.sailing.domain.common.dto.PositionDTO;
import com.sap.sailing.domain.common.dto.RaceColumnDTO;
import com.sap.sailing.domain.common.dto.RaceColumnInSeriesDTO;
import com.sap.sailing.domain.common.dto.RaceDTO;
@@ -548,5 +549,8 @@ public interface SailingServiceAsync {
void getLastCourseDefinitionInRaceLog(String leaderboardName, String raceColumnName, String fleetName,
AsyncCallback<RaceCourseDTO> callback);
void pingMarkViaRaceLogTracking(String leaderboardName, String raceColumnName, String fleetName, MarkDTO mark,
PositionDTO position, AsyncCallback<Void> callback);
}
@@ -978,4 +978,6 @@ public interface StringMessages extends Messages {
@Key("remove_what")
String remove(String what);
String pleaseEnterA(String what);
String pingPosition(String whose);
String pleaseEnterAValidValueFor(String what, String validTemplate);
}
@@ -963,4 +963,6 @@ mapDevices=Map Devices to Competitors and Marks
edit_what=Edit {0}
add_what=Add {0}
remove_what=Remove {0}
pleaseEnterA=Please enter a {0}
pleaseEnterA=Please enter a {0}
pingPosition=Ping {0} position
pleaseEnterAValidValueFor=Please enter a valid value for {0} ({1})
@@ -959,4 +959,6 @@ mapDevices=Gerätezuordnung zu Teams und Tonnen
edit_what={0} bearbeiten
add_what={0} hinzufügen
remove_what={0} entfernen
pleaseEnterA=Bitte {0} eingeben.
pleaseEnterA=Bitte {0} eingeben.
pingPosition={0}-Position pingen
pleaseEnterAValidValueFor=Bitte geben Sie für {0} einen gültigen Wert ein ({1})
@@ -188,12 +188,17 @@ import com.sap.sailing.domain.racelog.state.impl.ReadonlyRaceStateImpl;
import com.sap.sailing.domain.racelog.state.racingprocedure.FlagPoleState;
import com.sap.sailing.domain.racelog.state.racingprocedure.gate.ReadonlyGateStartRacingProcedure;
import com.sap.sailing.domain.racelog.state.racingprocedure.rrs26.ReadonlyRRS26RacingProcedure;
import com.sap.sailing.domain.racelog.tracking.RaceLogTrackingAdapter;
import com.sap.sailing.domain.racelog.tracking.RaceLogTrackingAdapterFactory;
import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier;
import com.sap.sailing.domain.racelog.tracking.DeviceMappingEvent;
import com.sap.sailing.domain.racelog.tracking.RegisterCompetitorEvent;
import com.sap.sailing.domain.racelog.tracking.analyzing.impl.DefinedMarkFinder;
import com.sap.sailing.domain.racelog.tracking.analyzing.impl.LastPingMappingEventFinder;
import com.sap.sailing.domain.racelog.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer;
import com.sap.sailing.domain.racelog.tracking.analyzing.impl.RegisteredCompetitorsAnalyzer;
import com.sap.sailing.domain.racelog.tracking.impl.DeviceMappingImpl;
import com.sap.sailing.domain.racelogtracking.PingDeviceIdentifierImpl;
import com.sap.sailing.domain.racelogtracking.RaceLogTrackingAdapter;
import com.sap.sailing.domain.racelogtracking.RaceLogTrackingAdapterFactory;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingAdapter;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingAdapterFactory;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingArchiveConfiguration;
@@ -220,6 +225,8 @@ import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.domain.tracking.Wind;
import com.sap.sailing.domain.tracking.WindTrack;
import com.sap.sailing.domain.tracking.WindWithConfidence;
import com.sap.sailing.domain.tracking.impl.DynamicGPSFixTrackImpl;
import com.sap.sailing.domain.tracking.impl.GPSFixImpl;
import com.sap.sailing.domain.tracking.impl.GPSFixMovingImpl;
import com.sap.sailing.domain.tracking.impl.WindImpl;
import com.sap.sailing.domain.tractracadapter.RaceRecord;
@@ -3961,34 +3968,39 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
}
}
/**
* Generates new id, does not resolve against domain factory.
*/
private Mark convertToMark(MarkDTO dto) {
// Mark existing = baseDomainFactory.getExistingMarkByIdAsString(dto.getIdAsString());
// if (existing != null) {
// return existing;
// }
private Mark convertToMark(MarkDTO dto, boolean resolve) {
if (resolve) {
Mark existing = baseDomainFactory.getExistingMarkByIdAsString(dto.getIdAsString());
if (existing != null) {
return existing;
}
}
// Serializable id = dto.getIdAsString();
// if (id == null) {
Serializable id = UUID.randomUUID();
// }
return baseDomainFactory.getOrCreateMark(id, dto.getName(), dto.type, dto.color, dto.shape, dto.pattern);
}
private Collection<MarkDTO> convertToMarkDTOs(Iterable<Mark> marks) {
/**
* Also finds the last position of the marks, if set by pinging them
*/
private Collection<MarkDTO> convertToMarkDTOs(RaceLog raceLog, Iterable<Mark> marks) {
List<MarkDTO> dtos = new ArrayList<MarkDTO>();
for (Mark mark : marks) {
dtos.add(convertToMarkDTO(mark, null));
DynamicGPSFixTrackImpl<Mark> track = new DynamicGPSFixTrackImpl<Mark>(mark, 0);
DeviceMappingEvent<Mark> lastPingMappingEvent = new LastPingMappingEventFinder<Mark>(raceLog, mark).analyze();
if (lastPingMappingEvent != null) {
getService().getGPSFixStore().loadMarkTrack(track, DeviceMappingImpl.convertToDeviceMapping(lastPingMappingEvent));
}
Position lastPos = track.getLastRawFix() == null ? null : track.getLastRawFix().getPosition();
dtos.add(convertToMarkDTO(mark, lastPos));
}
return dtos;
}
@Override
public void addMarkToRaceLog(String leaderboardName, String raceColumnName, String fleetName, MarkDTO markDTO) {
Mark mark = convertToMark(markDTO);
Mark mark = convertToMark(markDTO, false);
RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName);
RaceLogEvent event = RaceLogEventFactory.INSTANCE.createDefineMarkEvent(MillisecondsTimePoint.now(),
getService().getServerAuthor(), raceLog.getCurrentPassId(), mark);
@@ -3999,7 +4011,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
public Collection<MarkDTO> getMarksInRaceLog(String leaderboardName, String raceColumnName, String fleetName) {
RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName);
Collection<Mark> marks = new DefinedMarkFinder(raceLog).analyze();
return convertToMarkDTOs(marks);
return convertToMarkDTOs(raceLog, marks);
}
@Override
@@ -4055,4 +4067,30 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
return convertToRaceCourseDTO(lastPublishedCourse);
}
private Position convertToPosition(PositionDTO dto) {
return new DegreePosition(dto.latDeg, dto.lngDeg);
}
@Override
public void pingMarkViaRaceLogTracking(String leaderboardName, String raceColumnName, String fleetName,
MarkDTO markDTO, PositionDTO positionDTO) {
RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName);
Mark mark = convertToMark(markDTO, true);
TimePoint time = MillisecondsTimePoint.now();
Position position = convertToPosition(positionDTO);
GPSFix fix = new GPSFixImpl(position, time);
DeviceIdentifier device = new PingDeviceIdentifierImpl();
RaceLogEvent mapping = RaceLogEventFactory.INSTANCE.createDeviceMarkMappingEvent(time,
getService().getServerAuthor(), device, mark, raceLog.getCurrentPassId(), time, time);
raceLog.add(mapping);
getService().getGPSFixStore().storeFix(device, fix);
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 690 B

@@ -1,15 +1,26 @@
package com.sap.sailing.server.impl;
import java.nio.charset.Charset;
import java.util.Dictionary;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.common.impl.Util.Triple;
import com.sap.sailing.domain.common.racelog.tracking.TypeBasedServiceFinder;
import com.sap.sailing.domain.persistence.racelog.tracking.GPSFixMongoHandler;
import com.sap.sailing.domain.persistence.racelog.tracking.impl.GPSFixMongoHandlerImpl;
import com.sap.sailing.domain.persistence.racelog.tracking.impl.GPSFixMovingMongoHandlerImpl;
import com.sap.sailing.domain.tracking.impl.GPSFixImpl;
import com.sap.sailing.domain.tracking.impl.GPSFixMovingImpl;
import com.sap.sailing.server.RacingEventService;
import com.sap.sailing.server.racelog.tracking.CachedOsgiTypeBasedServiceFinderFactory;
@@ -25,6 +36,8 @@ public class Activator implements BundleActivator {
private RacingEventServiceImpl racingEventService;
private final boolean clearPersistentCompetitors;
private Set<ServiceRegistration<?>> registrations = new HashSet<>();
public Activator() {
clearPersistentCompetitors = Boolean.valueOf(System.getProperty(CLEAR_PERSISTENT_COMPETITORS_PROPERTY_NAME, ""+true));
@@ -47,6 +60,16 @@ public class Activator implements BundleActivator {
// register the racing service in the OSGi registry
racingEventService.setBundleContext(context);
context.registerService(RacingEventService.class.getName(), racingEventService, null);
Dictionary<String, String> properties = new Hashtable<String, String>();
properties.put(TypeBasedServiceFinder.TYPE, GPSFixImpl.class.getName());
registrations.add(context.registerService(GPSFixMongoHandler.class,
new GPSFixMongoHandlerImpl(racingEventService.getMongoObjectFactory(),
racingEventService.getDomainObjectFactory()), properties));
properties.put(TypeBasedServiceFinder.TYPE, GPSFixMovingImpl.class.getName());
registrations.add(context.registerService(GPSFixMongoHandler.class,
new GPSFixMovingMongoHandlerImpl(racingEventService.getMongoObjectFactory(),
racingEventService.getDomainObjectFactory()), properties));
logger.log(Level.INFO, "Started "+context.getBundle().getSymbolicName()+". Character encoding: "+
Charset.defaultCharset());
@@ -66,5 +89,9 @@ public class Activator implements BundleActivator {
for (Regatta regatta : racingEventService.getAllRegattas()) {
racingEventService.stopTracking(regatta);
}
for (ServiceRegistration<?> reg : registrations) {
reg.unregister();
}
registrations.clear();
}
}