mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-09-24 06:28:41 +00:00
added serialization of fixes, and device identifier
This commit is contained in:
@@ -1,20 +1,21 @@
|
||||
Manifest-Version: 1.0
|
||||
Bundle-ManifestVersion: 2
|
||||
Bundle-Name: Smartphone Tracking Adapter
|
||||
Bundle-SymbolicName: com.sap.sailing.domain.smartphoneadapter
|
||||
Bundle-Version: 1.0.0.qualifier
|
||||
Bundle-Vendor: SAP
|
||||
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
|
||||
Bundle-ActivationPolicy: lazy
|
||||
Require-Bundle: com.sap.sailing.domain,
|
||||
com.sap.sailing.domain.persistence,
|
||||
com.mongodb.driver;bundle-version="2.6.2",
|
||||
com.sap.sailing.domain.common,
|
||||
net.sf.marineapi;bundle-version="0.5.0",
|
||||
javax.servlet;bundle-version="2.5.0",
|
||||
com.sap.sailing.domain.shared.android
|
||||
Import-Package: org.osgi.framework;version="1.6.0",
|
||||
org.json.simple,
|
||||
org.json.simple.parser
|
||||
Export-Package: com.sap.sailing.domain.smartphoneadapter.impl;x-friends:="com.sap.sailing.domain.smartphoneadapter.testsupport"
|
||||
Bundle-Activator: com.sap.sailing.domain.smartphoneadapter.impl.Activator
|
||||
Manifest-Version: 1.0
|
||||
Bundle-ManifestVersion: 2
|
||||
Bundle-Name: Smartphone Tracking Adapter
|
||||
Bundle-SymbolicName: com.sap.sailing.domain.smartphoneadapter
|
||||
Bundle-Version: 1.0.0.qualifier
|
||||
Bundle-Vendor: SAP
|
||||
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
|
||||
Bundle-ActivationPolicy: lazy
|
||||
Require-Bundle: com.sap.sailing.domain,
|
||||
com.sap.sailing.domain.persistence,
|
||||
com.mongodb.driver;bundle-version="2.6.2",
|
||||
com.sap.sailing.domain.common,
|
||||
net.sf.marineapi;bundle-version="0.5.0",
|
||||
javax.servlet;bundle-version="2.5.0",
|
||||
com.sap.sailing.domain.shared.android,
|
||||
com.sap.sailing.server.gateway.serialization;bundle-version="1.0.0"
|
||||
Import-Package: org.osgi.framework;version="1.6.0",
|
||||
org.json.simple,
|
||||
org.json.simple.parser
|
||||
Export-Package: com.sap.sailing.domain.smartphoneadapter.impl;x-friends:="com.sap.sailing.domain.smartphoneadapter.testsupport"
|
||||
Bundle-Activator: com.sap.sailing.domain.smartphoneadapter.impl.Activator
|
||||
|
||||
+43
-32
@@ -1,32 +1,43 @@
|
||||
package com.sap.sailing.domain.smartphoneadapter.impl;
|
||||
|
||||
import java.util.Dictionary;
|
||||
import java.util.Hashtable;
|
||||
|
||||
import org.osgi.framework.BundleActivator;
|
||||
import org.osgi.framework.BundleContext;
|
||||
|
||||
import com.sap.sailing.domain.devices.SmartphoneImeiIdentifier;
|
||||
import com.sap.sailing.domain.devices.TypeBasedServiceFinder;
|
||||
import com.sap.sailing.domain.persistence.devices.DeviceIdentifierPersistenceHandler;
|
||||
|
||||
/**
|
||||
* Registers an instance of {@link SmartphoneImeiHandlerImpl} as both, a {@link RaceLogTrackingDeviceHandler} as well as a
|
||||
* {@link DeviceIdentifierPersistenceHandler} for devices of type {@link SmartphoneImeiIdentifier#TYPE}.
|
||||
*
|
||||
* @author Fredrik Teschke
|
||||
*
|
||||
*/
|
||||
public class Activator implements BundleActivator {
|
||||
@Override
|
||||
public void start(BundleContext context) throws Exception {
|
||||
SmartphoneImeiHandlerImpl handler = new SmartphoneImeiHandlerImpl();
|
||||
Dictionary<String, String> properties = new Hashtable<String, String>();
|
||||
properties.put(TypeBasedServiceFinder.TYPE, SmartphoneImeiIdentifier.TYPE);
|
||||
context.registerService(DeviceIdentifierPersistenceHandler.class, handler, properties);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stop(BundleContext context) throws Exception {
|
||||
}
|
||||
}
|
||||
package com.sap.sailing.domain.smartphoneadapter.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.devices.SmartphoneImeiIdentifier;
|
||||
import com.sap.sailing.domain.devices.TypeBasedServiceFinder;
|
||||
import com.sap.sailing.domain.persistence.devices.DeviceIdentifierPersistenceHandler;
|
||||
import com.sap.sailing.server.gateway.serialization.devices.DeviceIdentifierJsonSerializationHandler;
|
||||
|
||||
/**
|
||||
* Registers an instance of {@link SmartphoneImeiHandlerImpl} as both, a {@link RaceLogTrackingDeviceHandler} as well as a
|
||||
* {@link DeviceIdentifierPersistenceHandler} for devices of type {@link SmartphoneImeiIdentifier#TYPE}.
|
||||
*
|
||||
* @author Fredrik Teschke
|
||||
*
|
||||
*/
|
||||
public class Activator implements BundleActivator {
|
||||
private Set<ServiceRegistration<?>> registrations = new HashSet<>();
|
||||
|
||||
@Override
|
||||
public void start(BundleContext context) throws Exception {
|
||||
SmartphoneImeiHandlerImpl handler = new SmartphoneImeiHandlerImpl();
|
||||
Dictionary<String, String> properties = new Hashtable<String, String>();
|
||||
properties.put(TypeBasedServiceFinder.TYPE, SmartphoneImeiIdentifier.TYPE);
|
||||
registrations.add(context.registerService(DeviceIdentifierPersistenceHandler.class, handler, properties));
|
||||
registrations.add(context.registerService(DeviceIdentifierJsonSerializationHandler.class, handler, properties));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stop(BundleContext context) throws Exception {
|
||||
for (ServiceRegistration<?> reg : registrations) {
|
||||
reg.unregister();
|
||||
}
|
||||
registrations.clear();
|
||||
}
|
||||
}
|
||||
|
||||
+44
-25
@@ -1,25 +1,44 @@
|
||||
package com.sap.sailing.domain.smartphoneadapter.impl;
|
||||
|
||||
import com.sap.sailing.domain.devices.DeviceIdentifier;
|
||||
import com.sap.sailing.domain.devices.SmartphoneImeiIdentifier;
|
||||
import com.sap.sailing.domain.persistence.devices.DeviceIdentifierPersistenceHandler;
|
||||
|
||||
public class SmartphoneImeiHandlerImpl implements DeviceIdentifierPersistenceHandler {
|
||||
// private static final Logger logger = Logger.getLogger(SmartphoneImeiHandlerImpl.class.getName());
|
||||
|
||||
@Override
|
||||
public Object store(DeviceIdentifier deviceIdentifier) throws IllegalArgumentException {
|
||||
if (!(deviceIdentifier instanceof SmartphoneImeiIdentifier)) {
|
||||
throw new IllegalArgumentException(String.format(
|
||||
"Unexpected device identifier of type %s while trying to persist smartphone IMEI identifier",
|
||||
deviceIdentifier.getClass().getName()));
|
||||
}
|
||||
SmartphoneImeiIdentifier imeiIdentifier = (SmartphoneImeiIdentifier) deviceIdentifier;
|
||||
return imeiIdentifier.getImei();
|
||||
}
|
||||
|
||||
@Override
|
||||
public SmartphoneImeiIdentifier load(Object input) {
|
||||
return new SmartphoneImeiIdentifier((String) input);
|
||||
}
|
||||
}
|
||||
package com.sap.sailing.domain.smartphoneadapter.impl;
|
||||
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
import com.sap.sailing.domain.devices.DeviceIdentifier;
|
||||
import com.sap.sailing.domain.devices.SmartphoneImeiIdentifier;
|
||||
import com.sap.sailing.domain.persistence.devices.DeviceIdentifierPersistenceHandler;
|
||||
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
|
||||
import com.sap.sailing.server.gateway.deserialization.impl.SmartphoneImeiIdentifierJsonDeserializer;
|
||||
import com.sap.sailing.server.gateway.serialization.devices.DeviceIdentifierJsonSerializationHandler;
|
||||
import com.sap.sailing.server.gateway.serialization.impl.SmartphoneImeiIdentifierJsonSerializer;
|
||||
|
||||
public class SmartphoneImeiHandlerImpl implements DeviceIdentifierPersistenceHandler, DeviceIdentifierJsonSerializationHandler {
|
||||
// private static final Logger logger = Logger.getLogger(SmartphoneImeiHandlerImpl.class.getName());
|
||||
|
||||
private final SmartphoneImeiIdentifierJsonDeserializer deserializer = new SmartphoneImeiIdentifierJsonDeserializer();
|
||||
private final SmartphoneImeiIdentifierJsonSerializer serializer = new SmartphoneImeiIdentifierJsonSerializer();
|
||||
|
||||
|
||||
private SmartphoneImeiIdentifier castIdentifier(DeviceIdentifier identifier) throws IllegalArgumentException {
|
||||
if (! (identifier instanceof SmartphoneImeiIdentifier)) throw new IllegalArgumentException("Expected a SmartphoneImeiIdentifier, got instead: " + identifier);
|
||||
return (SmartphoneImeiIdentifier) identifier;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object store(DeviceIdentifier deviceIdentifier) throws IllegalArgumentException {
|
||||
return castIdentifier(deviceIdentifier).getImei();
|
||||
}
|
||||
|
||||
@Override
|
||||
public DeviceIdentifier load(Object input) {
|
||||
return new SmartphoneImeiIdentifier((String) input);
|
||||
}
|
||||
|
||||
@Override
|
||||
public JSONObject serialize(DeviceIdentifier deviceIdentifier) throws IllegalArgumentException {
|
||||
return serializer.serialize(castIdentifier(deviceIdentifier));
|
||||
}
|
||||
|
||||
@Override
|
||||
public DeviceIdentifier deserialize(JSONObject json) throws JsonDeserializationException {
|
||||
return deserializer.deserialize(json);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,8 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.6
|
||||
Import-Package: org.json.simple
|
||||
Require-Bundle: com.sap.sailing.domain.common;bundle-version="1.0.0",
|
||||
com.sap.sailing.domain.shared.android;bundle-version="1.0.0",
|
||||
com.sap.sailing.domain;bundle-version="1.0.0"
|
||||
com.sap.sailing.domain;bundle-version="1.0.0",
|
||||
net.sf.marineapi;bundle-version="0.5.0"
|
||||
Export-Package: com.sap.sailing.server.gateway.deserialization,
|
||||
com.sap.sailing.server.gateway.deserialization.coursedata.impl,
|
||||
com.sap.sailing.server.gateway.deserialization.impl,
|
||||
@@ -16,6 +17,7 @@ Export-Package: com.sap.sailing.server.gateway.deserialization,
|
||||
com.sap.sailing.server.gateway.deserialization.racelog.impl,
|
||||
com.sap.sailing.server.gateway.serialization,
|
||||
com.sap.sailing.server.gateway.serialization.coursedata.impl,
|
||||
com.sap.sailing.server.gateway.serialization.devices,
|
||||
com.sap.sailing.server.gateway.serialization.impl,
|
||||
com.sap.sailing.server.gateway.serialization.masterdata.impl,
|
||||
com.sap.sailing.server.gateway.serialization.racegroup.impl,
|
||||
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
package com.sap.sailing.server.gateway.deserialization;
|
||||
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
import com.sap.sailing.domain.devices.TypeBasedServiceFinder;
|
||||
import com.sap.sailing.server.gateway.serialization.devices.JsonSerializationHandler;
|
||||
|
||||
public abstract class TypeBasedJsonDeserializer<T> implements JsonDeserializer<T> {
|
||||
public static final String FIELD_TYPE = "type";
|
||||
|
||||
protected abstract String getType();
|
||||
|
||||
protected abstract T deserializeAfterCheckingType(JSONObject object) throws JsonDeserializationException;
|
||||
|
||||
@Override
|
||||
public T deserialize(JSONObject object) throws JsonDeserializationException {
|
||||
if (!getType().equals(object.get(FIELD_TYPE))) {
|
||||
throw new JsonDeserializationException("Wrong type found");
|
||||
}
|
||||
return deserializeAfterCheckingType(object);
|
||||
}
|
||||
|
||||
public static <T> T deserialize(TypeBasedServiceFinder<? extends JsonSerializationHandler<T>> serviceFinder, JSONObject object)
|
||||
throws JsonDeserializationException {
|
||||
return serviceFinder.findService((String) object.get(FIELD_TYPE)).deserialize(object);
|
||||
}
|
||||
}
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
package com.sap.sailing.server.gateway.deserialization.impl;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.json.simple.JSONArray;
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
import com.sap.sailing.domain.common.impl.Util.Triple;
|
||||
import com.sap.sailing.domain.devices.DeviceIdentifier;
|
||||
import com.sap.sailing.domain.devices.TypeBasedServiceFinder;
|
||||
import com.sap.sailing.domain.tracking.GPSFix;
|
||||
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
|
||||
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
|
||||
import com.sap.sailing.server.gateway.deserialization.TypeBasedJsonDeserializer;
|
||||
import com.sap.sailing.server.gateway.serialization.devices.DeviceIdentifierJsonSerializationHandler;
|
||||
import com.sap.sailing.server.gateway.serialization.devices.GPSFixJsonSerializationHandler;
|
||||
|
||||
public class DeviceAndSessionIdentifierWithGPSFixesDeserializer
|
||||
implements JsonDeserializer<Triple<DeviceIdentifier, Serializable, List<GPSFix>>> {
|
||||
|
||||
public static final String FIELD_DEVICE_ID = "deviceId";
|
||||
public static final String FIELD_SESSION_UUID = "sessionId";
|
||||
public static final String FIELD_FIXES = "fixes";
|
||||
|
||||
private final TypeBasedServiceFinder<GPSFixJsonSerializationHandler> fixServiceFinder;
|
||||
private final TypeBasedServiceFinder<DeviceIdentifierJsonSerializationHandler> deviceServiceFinder;
|
||||
|
||||
public DeviceAndSessionIdentifierWithGPSFixesDeserializer(
|
||||
TypeBasedServiceFinder<GPSFixJsonSerializationHandler> fixServiceFinder,
|
||||
TypeBasedServiceFinder<DeviceIdentifierJsonSerializationHandler> deviceServiceFinder) {
|
||||
this.fixServiceFinder = fixServiceFinder;
|
||||
this.deviceServiceFinder = deviceServiceFinder;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Triple<DeviceIdentifier, Serializable, List<GPSFix>> deserialize(JSONObject object) throws JsonDeserializationException {
|
||||
JSONObject deviceIdJson = Helpers.getNestedObjectSafe(object, FIELD_DEVICE_ID);
|
||||
DeviceIdentifier deviceId = TypeBasedJsonDeserializer.deserialize(deviceServiceFinder, deviceIdJson);
|
||||
|
||||
Serializable sessionId = Helpers.tryUuidConversion(((Serializable) object.get(FIELD_SESSION_UUID)));
|
||||
|
||||
JSONArray fixesJson = Helpers.getNestedArraySafe(object, FIELD_FIXES);
|
||||
List<GPSFix> fixes = new ArrayList<GPSFix>();
|
||||
for (Object fixObject : fixesJson) {
|
||||
JSONObject fixJson = (JSONObject) fixObject;
|
||||
GPSFix fix = TypeBasedJsonDeserializer.deserialize(fixServiceFinder, fixJson);
|
||||
fixes.add(fix);
|
||||
}
|
||||
|
||||
return new Triple<DeviceIdentifier, Serializable, List<GPSFix>>(deviceId, sessionId, fixes);
|
||||
}
|
||||
|
||||
}
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
package com.sap.sailing.server.gateway.deserialization.impl;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
import com.sap.sailing.domain.common.Position;
|
||||
import com.sap.sailing.domain.common.TimePoint;
|
||||
import com.sap.sailing.domain.common.impl.DegreePosition;
|
||||
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
|
||||
import com.sap.sailing.domain.tracking.GPSFix;
|
||||
import com.sap.sailing.domain.tracking.impl.GPSFixImpl;
|
||||
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
|
||||
import com.sap.sailing.server.gateway.deserialization.TypeBasedJsonDeserializer;
|
||||
|
||||
public class GPSFixJsonDeserializer extends TypeBasedJsonDeserializer<GPSFix> {
|
||||
public static final String TYPE = "GPSFix";
|
||||
|
||||
public static final String FIELD_LAT_DEG = "lat_deg";
|
||||
public static final String FIELD_LON_DEG = "lon_deg";
|
||||
public static final String FIELD_TIME = "unixtime";
|
||||
|
||||
|
||||
@Override
|
||||
protected GPSFix deserializeAfterCheckingType(JSONObject object) throws JsonDeserializationException {
|
||||
Date time = new Date((Long) object.get(FIELD_TIME));
|
||||
double latDeg = (Double) object.get(FIELD_LAT_DEG);
|
||||
double lonDeg = (Double) object.get(FIELD_LON_DEG);
|
||||
|
||||
Position position = new DegreePosition(latDeg, lonDeg);
|
||||
TimePoint timePoint = new MillisecondsTimePoint(time);
|
||||
|
||||
GPSFix fix = new GPSFixImpl(position, timePoint);
|
||||
|
||||
return fix;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected String getType() {
|
||||
return TYPE;
|
||||
}
|
||||
|
||||
}
|
||||
+45
@@ -0,0 +1,45 @@
|
||||
package com.sap.sailing.server.gateway.deserialization.impl;
|
||||
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
import com.sap.sailing.domain.common.Bearing;
|
||||
import com.sap.sailing.domain.common.SpeedWithBearing;
|
||||
import com.sap.sailing.domain.common.impl.DegreeBearingImpl;
|
||||
import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl;
|
||||
import com.sap.sailing.domain.tracking.GPSFix;
|
||||
import com.sap.sailing.domain.tracking.GPSFixMoving;
|
||||
import com.sap.sailing.domain.tracking.impl.GPSFixMovingImpl;
|
||||
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
|
||||
import com.sap.sailing.server.gateway.deserialization.TypeBasedJsonDeserializer;
|
||||
|
||||
public class GPSFixMovingJsonDeserializer extends TypeBasedJsonDeserializer<GPSFixMoving> {
|
||||
public static final String TYPE = "GPSFixMoving";
|
||||
|
||||
public static final String FIELD_BEARING_DEG = "bearing_deg";
|
||||
public static final String FIELD_SPEED_KNOTS = "speed_knots";
|
||||
|
||||
@Override
|
||||
protected GPSFixMoving deserializeAfterCheckingType(JSONObject object) throws JsonDeserializationException {
|
||||
double bearingDeg = (Double) object.get(FIELD_BEARING_DEG);
|
||||
double speedKnots = (Double) object.get(FIELD_SPEED_KNOTS);
|
||||
|
||||
GPSFix baseFix = new GPSFixJsonDeserializer()
|
||||
.deserialize(object);
|
||||
|
||||
// TODO do we have to use corrected course here? (corrected by magnetic
|
||||
// variation)
|
||||
Bearing bearing = new DegreeBearingImpl(bearingDeg);
|
||||
SpeedWithBearing speed = new KnotSpeedWithBearingImpl(
|
||||
speedKnots, bearing);
|
||||
|
||||
GPSFixMoving fix = new GPSFixMovingImpl(baseFix.getPosition(),
|
||||
baseFix.getTimePoint(), speed);
|
||||
|
||||
return fix;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getType() {
|
||||
return TYPE;
|
||||
}
|
||||
}
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
package com.sap.sailing.server.gateway.deserialization.impl;
|
||||
|
||||
import net.sf.marineapi.nmea.parser.RMCParser;
|
||||
import net.sf.marineapi.nmea.sentence.RMCSentence;
|
||||
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
import com.sap.sailing.domain.common.Bearing;
|
||||
import com.sap.sailing.domain.common.SpeedWithBearing;
|
||||
import com.sap.sailing.domain.common.impl.DegreeBearingImpl;
|
||||
import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl;
|
||||
import com.sap.sailing.domain.tracking.GPSFix;
|
||||
import com.sap.sailing.domain.tracking.GPSFixMoving;
|
||||
import com.sap.sailing.domain.tracking.impl.GPSFixMovingImpl;
|
||||
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
|
||||
import com.sap.sailing.server.gateway.deserialization.TypeBasedJsonDeserializer;
|
||||
|
||||
public class GPSFixMovingNmeaDTOJsonDeserializer extends TypeBasedJsonDeserializer<GPSFixMoving> {
|
||||
public static final String TYPE = "GPSFixMovingNmea";
|
||||
|
||||
@Override
|
||||
protected String getType() {
|
||||
return TYPE;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected GPSFixMoving deserializeAfterCheckingType(JSONObject object) throws JsonDeserializationException {
|
||||
String nmea = (String) object.get(GPSFixNmeaDTOJsonDeserializer.FIELD_NMEA);
|
||||
|
||||
RMCSentence sentence = new RMCParser(nmea);
|
||||
|
||||
GPSFix baseFix = new GPSFixNmeaDTOJsonDeserializer().deserialize(object);
|
||||
|
||||
//TODO do we have to use corrected course here? (corrected by magnetic variation)
|
||||
Bearing bearing = new DegreeBearingImpl(sentence.getCourse());
|
||||
SpeedWithBearing speed = new KnotSpeedWithBearingImpl(sentence.getSpeed(), bearing);
|
||||
|
||||
GPSFixMoving fix = new GPSFixMovingImpl(baseFix.getPosition(), baseFix.getTimePoint(), speed);
|
||||
|
||||
return fix;
|
||||
}
|
||||
|
||||
}
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
package com.sap.sailing.server.gateway.deserialization.impl;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import net.sf.marineapi.nmea.parser.RMCParser;
|
||||
import net.sf.marineapi.nmea.sentence.RMCSentence;
|
||||
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
import com.sap.sailing.domain.common.Position;
|
||||
import com.sap.sailing.domain.common.TimePoint;
|
||||
import com.sap.sailing.domain.common.impl.DegreePosition;
|
||||
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
|
||||
import com.sap.sailing.domain.tracking.GPSFix;
|
||||
import com.sap.sailing.domain.tracking.impl.GPSFixImpl;
|
||||
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
|
||||
import com.sap.sailing.server.gateway.deserialization.TypeBasedJsonDeserializer;
|
||||
|
||||
public class GPSFixNmeaDTOJsonDeserializer extends TypeBasedJsonDeserializer<GPSFix> {
|
||||
public static final String TYPE = "GPSFixNmea";
|
||||
|
||||
public static final String FIELD_TIME = "unixtime";
|
||||
public static final String FIELD_NMEA = "nmea";
|
||||
|
||||
@Override
|
||||
protected String getType() {
|
||||
return TYPE;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected GPSFix deserializeAfterCheckingType(JSONObject object) throws JsonDeserializationException {
|
||||
Date time = new Date((Long) object.get(FIELD_TIME));
|
||||
String nmea = (String) object.get(FIELD_NMEA);
|
||||
|
||||
RMCSentence sentence = new RMCParser(nmea);
|
||||
|
||||
Position position = new DegreePosition(sentence.getPosition().getLatitude(),
|
||||
sentence.getPosition().getLongitude());
|
||||
TimePoint timePoint = new MillisecondsTimePoint(time);
|
||||
|
||||
GPSFix fix = new GPSFixImpl(position, timePoint);
|
||||
|
||||
return fix;
|
||||
}
|
||||
|
||||
}
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
package com.sap.sailing.server.gateway.deserialization.impl;
|
||||
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
import com.sap.sailing.domain.devices.SmartphoneImeiIdentifier;
|
||||
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
|
||||
import com.sap.sailing.server.gateway.deserialization.TypeBasedJsonDeserializer;
|
||||
|
||||
public class SmartphoneImeiIdentifierJsonDeserializer extends TypeBasedJsonDeserializer<SmartphoneImeiIdentifier> {
|
||||
public static final String TYPE = "imei";
|
||||
public static final String FIELD_IMEI = "imei";
|
||||
|
||||
@Override
|
||||
protected String getType() {
|
||||
return TYPE;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected SmartphoneImeiIdentifier deserializeAfterCheckingType(JSONObject object)
|
||||
throws JsonDeserializationException {
|
||||
String imei = (String) object.get(FIELD_IMEI);
|
||||
return (SmartphoneImeiIdentifier) new SmartphoneImeiIdentifier(imei).resolve(null);
|
||||
}
|
||||
}
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
package com.sap.sailing.server.gateway.serialization.devices;
|
||||
|
||||
import com.sap.sailing.domain.devices.DeviceIdentifier;
|
||||
|
||||
public interface DeviceIdentifierJsonSerializationHandler extends JsonSerializationHandler<DeviceIdentifier> {
|
||||
}
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
package com.sap.sailing.server.gateway.serialization.devices;
|
||||
|
||||
import com.sap.sailing.domain.tracking.GPSFix;
|
||||
|
||||
public interface GPSFixJsonSerializationHandler extends JsonSerializationHandler<GPSFix> {
|
||||
}
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
package com.sap.sailing.server.gateway.serialization.devices;
|
||||
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
|
||||
|
||||
public interface JsonSerializationHandler<T> {
|
||||
JSONObject serialize(T object) throws IllegalArgumentException;
|
||||
T deserialize(JSONObject json) throws JsonDeserializationException;
|
||||
}
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
package com.sap.sailing.server.gateway.serialization.impl;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
import org.json.simple.JSONArray;
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
import com.sap.sailing.domain.common.impl.Util.Triple;
|
||||
import com.sap.sailing.domain.devices.DeviceIdentifier;
|
||||
import com.sap.sailing.domain.tracking.GPSFix;
|
||||
import com.sap.sailing.server.gateway.deserialization.impl.DeviceAndSessionIdentifierWithGPSFixesDeserializer;
|
||||
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
|
||||
|
||||
public class DeviceAndSessionIdentifierWithGPSFixesSerializer<D extends DeviceIdentifier, F extends GPSFix> implements
|
||||
JsonSerializer<Triple<D, Serializable, List<F>>> {
|
||||
|
||||
private final JsonSerializer<D> deviceSerializer;
|
||||
private JsonSerializer<F> fixSerializer;
|
||||
|
||||
public DeviceAndSessionIdentifierWithGPSFixesSerializer(JsonSerializer<D> deviceSerializer,
|
||||
JsonSerializer<F> fixSerializer) {
|
||||
this.deviceSerializer = deviceSerializer;
|
||||
this.fixSerializer = fixSerializer;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JSONObject serialize(Triple<D, Serializable, List<F>> data) {
|
||||
JSONObject result = new JSONObject();
|
||||
|
||||
JSONObject deviceIdJson = deviceSerializer.serialize(data.getA());
|
||||
JSONArray fixesJson = new JSONArray();
|
||||
for (F fix : data.getC()) {
|
||||
fixesJson.add(fixSerializer.serialize(fix));
|
||||
}
|
||||
|
||||
result.put(DeviceAndSessionIdentifierWithGPSFixesDeserializer.FIELD_DEVICE_ID, deviceIdJson);
|
||||
if (data.getB() != null) {
|
||||
result.put(DeviceAndSessionIdentifierWithGPSFixesDeserializer.FIELD_SESSION_UUID, data.getB().toString());
|
||||
}
|
||||
result.put(DeviceAndSessionIdentifierWithGPSFixesDeserializer.FIELD_FIXES, fixesJson);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
package com.sap.sailing.server.gateway.serialization.impl;
|
||||
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
import com.sap.sailing.domain.tracking.GPSFix;
|
||||
import com.sap.sailing.server.gateway.deserialization.TypeBasedJsonDeserializer;
|
||||
import com.sap.sailing.server.gateway.deserialization.impl.GPSFixJsonDeserializer;
|
||||
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
|
||||
|
||||
public class GPSFixJsonSerializer implements JsonSerializer<GPSFix> {
|
||||
@Override
|
||||
public JSONObject serialize(GPSFix object) {
|
||||
JSONObject result = new JSONObject();
|
||||
|
||||
result.put(TypeBasedJsonDeserializer.FIELD_TYPE, GPSFixJsonDeserializer.TYPE);
|
||||
result.put(GPSFixJsonDeserializer.FIELD_LAT_DEG, object.getPosition().getLatDeg());
|
||||
result.put(GPSFixJsonDeserializer.FIELD_LON_DEG, object.getPosition().getLngDeg());
|
||||
result.put(GPSFixJsonDeserializer.FIELD_TIME, object.getTimePoint().asMillis());
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
package com.sap.sailing.server.gateway.serialization.impl;
|
||||
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
import com.sap.sailing.domain.tracking.GPSFixMoving;
|
||||
import com.sap.sailing.server.gateway.deserialization.TypeBasedJsonDeserializer;
|
||||
import com.sap.sailing.server.gateway.deserialization.impl.GPSFixMovingJsonDeserializer;
|
||||
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
|
||||
|
||||
public class GPSFixMovingJsonSerializer implements JsonSerializer<GPSFixMoving> {
|
||||
@Override
|
||||
public JSONObject serialize(GPSFixMoving object) {
|
||||
JSONObject result = new GPSFixJsonSerializer().serialize(object);
|
||||
|
||||
result.put(TypeBasedJsonDeserializer.FIELD_TYPE, GPSFixMovingJsonDeserializer.TYPE);
|
||||
result.put(GPSFixMovingJsonDeserializer.FIELD_BEARING_DEG, object.getSpeed().getBearing().getDegrees());
|
||||
result.put(GPSFixMovingJsonDeserializer.FIELD_SPEED_KNOTS, object.getSpeed().getKnots());
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
package com.sap.sailing.server.gateway.serialization.impl;
|
||||
|
||||
import net.sf.marineapi.nmea.parser.RMCParser;
|
||||
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
import com.sap.sailing.domain.tracking.GPSFixMoving;
|
||||
import com.sap.sailing.server.gateway.deserialization.TypeBasedJsonDeserializer;
|
||||
import com.sap.sailing.server.gateway.deserialization.impl.GPSFixMovingNmeaDTOJsonDeserializer;
|
||||
import com.sap.sailing.server.gateway.deserialization.impl.GPSFixNmeaDTOJsonDeserializer;
|
||||
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
|
||||
|
||||
public class GPSFixMovingNmeaDTOJsonSerializer implements JsonSerializer<GPSFixMoving> {
|
||||
|
||||
@Override
|
||||
public JSONObject serialize(GPSFixMoving object) {
|
||||
JSONObject result = new JSONObject();
|
||||
|
||||
RMCParser parser = GPSFixNmeaDTOJsonSerializer.getParser(object);
|
||||
|
||||
double bearing = object.getSpeed().getBearing().getDegrees();
|
||||
double speed = object.getSpeed().getKnots();
|
||||
|
||||
parser.setCourse(bearing);
|
||||
parser.setSpeed(speed);
|
||||
|
||||
String nmea = parser.toSentence();
|
||||
|
||||
result.put(TypeBasedJsonDeserializer.FIELD_TYPE, GPSFixMovingNmeaDTOJsonDeserializer.TYPE);
|
||||
result.put(GPSFixNmeaDTOJsonDeserializer.FIELD_NMEA, nmea);
|
||||
result.put(GPSFixNmeaDTOJsonDeserializer.FIELD_TIME, object.getTimePoint().asMillis());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
package com.sap.sailing.server.gateway.serialization.impl;
|
||||
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.GregorianCalendar;
|
||||
|
||||
import net.sf.marineapi.nmea.parser.RMCParser;
|
||||
import net.sf.marineapi.nmea.sentence.TalkerId;
|
||||
import net.sf.marineapi.nmea.util.CompassPoint;
|
||||
import net.sf.marineapi.nmea.util.Position;
|
||||
import net.sf.marineapi.nmea.util.Time;
|
||||
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
import com.sap.sailing.domain.tracking.GPSFix;
|
||||
import com.sap.sailing.server.gateway.deserialization.TypeBasedJsonDeserializer;
|
||||
import com.sap.sailing.server.gateway.deserialization.impl.GPSFixNmeaDTOJsonDeserializer;
|
||||
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
|
||||
|
||||
public class GPSFixNmeaDTOJsonSerializer implements JsonSerializer<GPSFix> {
|
||||
|
||||
public static RMCParser getParser(GPSFix fix) {
|
||||
RMCParser parser = new RMCParser(TalkerId.GP);
|
||||
|
||||
double lat = fix.getPosition().getLatDeg();
|
||||
double lng = fix.getPosition().getLngDeg();
|
||||
Date timepoint = fix.getTimePoint().asDate();
|
||||
|
||||
CompassPoint latCP = lat < 0 ? CompassPoint.SOUTH : CompassPoint.NORTH;
|
||||
CompassPoint lngCP = lng < 0 ? CompassPoint.WEST : CompassPoint.EAST;
|
||||
Calendar calendar = new GregorianCalendar();
|
||||
calendar.setTime(timepoint);
|
||||
Time time = new Time(calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE),
|
||||
calendar.get(Calendar.SECOND));
|
||||
|
||||
parser.setPosition(new Position(Math.abs(lat), latCP, Math.abs(lng), lngCP));
|
||||
parser.setTime(time);
|
||||
|
||||
return parser;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JSONObject serialize(GPSFix object) {
|
||||
JSONObject result = new JSONObject();
|
||||
|
||||
String nmea = getParser(object).toSentence();
|
||||
|
||||
result.put(TypeBasedJsonDeserializer.FIELD_TYPE, GPSFixNmeaDTOJsonDeserializer.TYPE);
|
||||
result.put(GPSFixNmeaDTOJsonDeserializer.FIELD_NMEA, nmea);
|
||||
result.put(GPSFixNmeaDTOJsonDeserializer.FIELD_TIME, object.getTimePoint().asMillis());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
package com.sap.sailing.server.gateway.serialization.impl;
|
||||
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
import com.sap.sailing.domain.devices.SmartphoneImeiIdentifier;
|
||||
import com.sap.sailing.server.gateway.deserialization.TypeBasedJsonDeserializer;
|
||||
import com.sap.sailing.server.gateway.deserialization.impl.SmartphoneImeiIdentifierJsonDeserializer;
|
||||
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
|
||||
|
||||
public class SmartphoneImeiIdentifierJsonSerializer implements JsonSerializer<SmartphoneImeiIdentifier> {
|
||||
|
||||
@Override
|
||||
public JSONObject serialize(SmartphoneImeiIdentifier identifier) {
|
||||
JSONObject result = new JSONObject();
|
||||
|
||||
result.put(TypeBasedJsonDeserializer.FIELD_TYPE, SmartphoneImeiIdentifierJsonDeserializer.TYPE);
|
||||
result.put(SmartphoneImeiIdentifierJsonDeserializer.FIELD_IMEI, identifier.getImei());
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -42,3 +42,4 @@ Require-Bundle: com.sap.sailing.domain,
|
||||
Bundle-ClassPath: .
|
||||
Web-ContextPath: /sailingserver
|
||||
Export-Package: com.sap.sailing.server.gateway
|
||||
Bundle-Activator: com.sap.sailing.server.gateway.impl.Activator
|
||||
|
||||
+80
@@ -0,0 +1,80 @@
|
||||
package com.sap.sailing.server.gateway.impl;
|
||||
|
||||
import java.util.Dictionary;
|
||||
import java.util.HashSet;
|
||||
import java.util.Hashtable;
|
||||
import java.util.Set;
|
||||
|
||||
import org.json.simple.JSONObject;
|
||||
import org.osgi.framework.BundleActivator;
|
||||
import org.osgi.framework.BundleContext;
|
||||
import org.osgi.framework.ServiceRegistration;
|
||||
|
||||
import com.sap.sailing.domain.devices.TypeBasedServiceFinder;
|
||||
import com.sap.sailing.domain.tracking.GPSFix;
|
||||
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
|
||||
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
|
||||
import com.sap.sailing.server.gateway.deserialization.impl.GPSFixJsonDeserializer;
|
||||
import com.sap.sailing.server.gateway.deserialization.impl.GPSFixMovingJsonDeserializer;
|
||||
import com.sap.sailing.server.gateway.deserialization.impl.GPSFixMovingNmeaDTOJsonDeserializer;
|
||||
import com.sap.sailing.server.gateway.deserialization.impl.GPSFixNmeaDTOJsonDeserializer;
|
||||
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
|
||||
import com.sap.sailing.server.gateway.serialization.devices.GPSFixJsonSerializationHandler;
|
||||
import com.sap.sailing.server.gateway.serialization.impl.GPSFixJsonSerializer;
|
||||
import com.sap.sailing.server.gateway.serialization.impl.GPSFixMovingJsonSerializer;
|
||||
import com.sap.sailing.server.gateway.serialization.impl.GPSFixMovingNmeaDTOJsonSerializer;
|
||||
import com.sap.sailing.server.gateway.serialization.impl.GPSFixNmeaDTOJsonSerializer;
|
||||
|
||||
public class Activator implements BundleActivator {
|
||||
private Set<ServiceRegistration<?>> registrations = new HashSet<>();
|
||||
|
||||
private class GPSFixJsonSerializationService<T extends GPSFix> implements GPSFixJsonSerializationHandler {
|
||||
private final JsonDeserializer<T> deserializer;
|
||||
private final JsonSerializer<T> serializer;
|
||||
|
||||
GPSFixJsonSerializationService(JsonDeserializer<T> deserializer, JsonSerializer<T> serializer) {
|
||||
this.deserializer = deserializer;
|
||||
this.serializer = serializer;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public JSONObject serialize(GPSFix fix) throws IllegalArgumentException {
|
||||
return serializer.serialize((T) fix);
|
||||
}
|
||||
|
||||
@Override
|
||||
public T deserialize(JSONObject json) throws JsonDeserializationException {
|
||||
return deserializer.deserialize(json);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private Dictionary<String, String> getDict(String type) {
|
||||
Dictionary<String, String> properties = new Hashtable<String, String>();
|
||||
properties.put(TypeBasedServiceFinder.TYPE, type);
|
||||
return properties;
|
||||
}
|
||||
|
||||
private <T extends GPSFix> void register(BundleContext context, JsonDeserializer<T> deserializer,
|
||||
JsonSerializer<T> serializer, String type) {
|
||||
registrations.add(context.registerService(GPSFixJsonSerializationHandler.class,
|
||||
new GPSFixJsonSerializationService<T>(deserializer, serializer), getDict(type)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start(BundleContext context) throws Exception {
|
||||
register(context, new GPSFixJsonDeserializer(), new GPSFixJsonSerializer(), GPSFixJsonDeserializer.TYPE);
|
||||
register(context, new GPSFixMovingJsonDeserializer(), new GPSFixMovingJsonSerializer(), GPSFixMovingJsonDeserializer.TYPE);
|
||||
register(context, new GPSFixNmeaDTOJsonDeserializer(), new GPSFixNmeaDTOJsonSerializer(), GPSFixNmeaDTOJsonDeserializer.TYPE);
|
||||
register(context, new GPSFixMovingNmeaDTOJsonDeserializer(), new GPSFixMovingNmeaDTOJsonSerializer(), GPSFixMovingNmeaDTOJsonDeserializer.TYPE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stop(BundleContext context) throws Exception {
|
||||
for (ServiceRegistration<?> reg : registrations) {
|
||||
reg.unregister();
|
||||
}
|
||||
registrations.clear();
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,7 @@ Bundle-Version: 0.5.0.qualifier
|
||||
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
|
||||
Export-Package: net.sf.marineapi.nmea.event,
|
||||
net.sf.marineapi.nmea.io,
|
||||
net.sf.marineapi.nmea.parser,
|
||||
net.sf.marineapi.nmea.sentence,
|
||||
net.sf.marineapi.nmea.util,
|
||||
net.sf.marineapi.provider,
|
||||
|
||||
Reference in New Issue
Block a user