added serialization of fixes, and device identifier

This commit is contained in:
Fredrik Teschke
2014-02-09 19:45:17 +01:00
parent e753f7eee8
commit 87f7ebc18d
23 changed files with 699 additions and 78 deletions
@@ -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
@@ -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();
}
}
@@ -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,
@@ -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);
}
}
@@ -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);
}
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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);
}
}
@@ -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> {
}
@@ -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> {
}
@@ -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;
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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
@@ -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,