added placeholder identifier and ping identifier

This commit is contained in:
Fredrik Teschke committed 2014-03-07 19:00:42 +01:00
1 parent dea531e6d0
commit 335e090ebc
14 files changed
+255 -21

No files matched your search

@@ -0,0 +1,14 @@
package com.sap.sailing.domain.racelog.tracking;
import java.util.UUID;
/**
* 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).
*
* @author Fredrik Teschke
*
*/
public interface PingDeviceIdentifier extends DeviceIdentifier {
UUID getId();
}
@@ -52,6 +52,8 @@ public class Activator implements BundleActivator {
registrations.add(context.registerService(DeviceIdentifierMongoHandler.class, new SmartphoneImeiMongoHandlerImpl(), getDict(SmartphoneImeiIdentifier.TYPE)));
registrations.add(context.registerService(DeviceIdentifierJsonHandler.class, new SmartphoneImeiJsonHandlerImpl(), getDict(SmartphoneImeiIdentifier.TYPE)));
registrations.add(context.registerService(DeviceIdentifierMongoHandler.class, new PingDeviceMongoHandlerImpl(), getDict(PingDeviceIdentifierImpl.TYPE)));
registerGPSFixJsonService(context, new GPSFixJsonDeserializer(), new GPSFixJsonSerializer(), GPSFixJsonDeserializer.TYPE);
registerGPSFixJsonService(context, new GPSFixMovingJsonDeserializer(), new GPSFixMovingJsonSerializer(), GPSFixMovingJsonDeserializer.TYPE);
registerGPSFixJsonService(context, new GPSFixNmeaDTOJsonDeserializer(), new GPSFixNmeaDTOJsonSerializer(), GPSFixNmeaDTOJsonDeserializer.TYPE);
@@ -0,0 +1,44 @@
package com.sap.sailing.domain.racelog.tracking.impl;
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;
public static final String TYPE = "PING";
private final UUID id;
public PingDeviceIdentifierImpl() {
this.id = UUID.randomUUID();
}
public PingDeviceIdentifierImpl(UUID id) {
this.id = id;
}
@Override
public String getIdentifierType() {
return TYPE;
}
@Override
public IsManagedBySharedDomainFactory resolve(SharedDomainFactory domainFactory) {
//No resolving necessary, only relevant on the creating server
return this;
}
@Override
public UUID getId() {
return id;
}
@Override
public String getStringRepresentation() {
return id.toString();
}
}
@@ -0,0 +1,26 @@
package com.sap.sailing.domain.racelog.tracking.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;
public class PingDeviceMongoHandlerImpl implements DeviceIdentifierMongoHandler {
private PingDeviceIdentifier castIdentifier(DeviceIdentifier identifier) throws TransformationException {
if (!(identifier instanceof PingDeviceIdentifier))
throw new TransformationException("Expected a PingDeviceIdentifier, got instead: " + identifier);
return (PingDeviceIdentifier) identifier;
}
@Override
public Object transformForth(DeviceIdentifier deviceIdentifier) throws TransformationException {
return castIdentifier(deviceIdentifier).getId().toString();
}
@Override
public DeviceIdentifier transformBack(Object input) {
return new PingDeviceIdentifierImpl(UUID.fromString((String) input));
}
}
@@ -19,5 +19,12 @@ public interface DeviceIdentifier extends IsManagedBySharedDomainFactory, Serial
* have to register new OSGi service, and not touch the SAP Sailing Analytics code.
*/
String getIdentifierType();
/**
* Create a string representation, that can identify this device.
* The returned values should be unique for this identifier within its {@link #getIdentifierType() type},
* but need not include the {@link #getIdentifierType() type} itself in the representation.
*/
String getStringRepresentation();
}
@@ -0,0 +1,41 @@
package com.sap.sailing.domain.racelog.tracking;
import com.sap.sailing.domain.base.IsManagedBySharedDomainFactory;
import com.sap.sailing.domain.base.SharedDomainFactory;
/**
* If the proper identifier cannot be resolved, for example because the OSGi context is not available
* on the smartphone receiving the {@code DevicieIdentifier} via its {@code RaceLog}, then this
* class can be used as a placeholder, that will at least offer the {@code type} and {@code string representation}
* of the original identifier.
*
* @author Fredrik Teschke
*
*/
public class PlaceHolderDeviceIdentifier implements DeviceIdentifier {
private static final long serialVersionUID = 8642469389180406246L;
private final String type;
private final String stringRepresentation;
public PlaceHolderDeviceIdentifier(String type, String stringRepresentation) {
this.type = type;
this.stringRepresentation = stringRepresentation;
}
@Override
public IsManagedBySharedDomainFactory resolve(SharedDomainFactory domainFactory) {
return this;
}
@Override
public String getIdentifierType() {
return type;
}
@Override
public String getStringRepresentation() {
return stringRepresentation;
}
}
@@ -51,4 +51,9 @@ public class SmartphoneImeiIdentifier implements DeviceIdentifier {
}
return false;
}
@Override
public String getStringRepresentation() {
return imei;
}
}
@@ -0,0 +1,20 @@
package com.sap.sailing.server.gateway.deserialization.impl;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.racelog.tracking.PlaceHolderDeviceIdentifier;
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.impl.DeviceIdentifierBaseJsonSerializer;
public class PlaceHolderDeviceIdentifierJsonDeserializer implements JsonDeserializer<PlaceHolderDeviceIdentifier> {
@Override
public PlaceHolderDeviceIdentifier deserialize(JSONObject object) throws JsonDeserializationException {
String type = (String) object.get(TypeBasedJsonDeserializer.FIELD_TYPE);
String stringRepresentation = (String) object.get(DeviceIdentifierBaseJsonSerializer.FIELD_STRING_REPRESENTATION);
return new PlaceHolderDeviceIdentifier(type, stringRepresentation);
}
}
@@ -4,10 +4,8 @@ import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.SharedDomainFactory;
import com.sap.sailing.domain.common.racelog.tracking.SingleTypeBasedServiceFinderImpl;
import com.sap.sailing.domain.common.racelog.tracking.TypeBasedServiceFinder;
import com.sap.sailing.domain.racelog.RaceLogEvent;
import com.sap.sailing.domain.racelog.tracking.SmartphoneImeiIdentifier;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.coursedata.impl.ControlPointDeserializer;
@@ -40,14 +38,13 @@ import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogStartTim
import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogStartTrackingEventSerializer;
import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogWindFixEventSerializer;
import com.sap.sailing.server.gateway.serialization.racelog.tracking.DeviceIdentifierJsonHandler;
import com.sap.sailing.server.gateway.serialization.racelog.tracking.impl.SmartphoneImeiJsonHandlerImpl;
import com.sap.sailing.server.gateway.serialization.racelog.tracking.impl.SmartphoneImeiJsonHandlerFactoryDefaultingToPlaceHolder;
public class RaceLogEventDeserializer implements JsonDeserializer<RaceLogEvent> {
public static RaceLogEventDeserializer create(SharedDomainFactory domainFactory) {
return create(domainFactory,
new SingleTypeBasedServiceFinderImpl<DeviceIdentifierJsonHandler>(
new SmartphoneImeiJsonHandlerImpl(), SmartphoneImeiIdentifier.TYPE));
new SmartphoneImeiJsonHandlerFactoryDefaultingToPlaceHolder());
}
public static RaceLogEventDeserializer create(SharedDomainFactory domainFactory,
@@ -0,0 +1,22 @@
package com.sap.sailing.server.gateway.serialization.impl;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier;
import com.sap.sailing.server.gateway.deserialization.TypeBasedJsonDeserializer;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
public abstract class DeviceIdentifierBaseJsonSerializer<T extends DeviceIdentifier> implements JsonSerializer<T> {
public static final String FIELD_STRING_REPRESENTATION = "stringRepresentation";
protected abstract JSONObject furtherSerialize(T object, JSONObject result);
@Override
public JSONObject serialize(T object) {
JSONObject result = new JSONObject();
result.put(TypeBasedJsonDeserializer.FIELD_TYPE, object.getIdentifierType());
result.put(FIELD_STRING_REPRESENTATION, object.getStringRepresentation());
return furtherSerialize(object, result);
}
}
@@ -3,18 +3,14 @@ package com.sap.sailing.server.gateway.serialization.impl;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.racelog.tracking.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> {
public class SmartphoneImeiIdentifierJsonSerializer extends DeviceIdentifierBaseJsonSerializer<SmartphoneImeiIdentifier>
implements JsonSerializer<SmartphoneImeiIdentifier> {
@Override
public JSONObject serialize(SmartphoneImeiIdentifier identifier) {
JSONObject result = new JSONObject();
result.put(TypeBasedJsonDeserializer.FIELD_TYPE, SmartphoneImeiIdentifier.TYPE);
result.put(SmartphoneImeiIdentifierJsonDeserializer.FIELD_IMEI, identifier.getImei());
protected JSONObject furtherSerialize(SmartphoneImeiIdentifier object, JSONObject result) {
result.put(SmartphoneImeiIdentifierJsonDeserializer.FIELD_IMEI, object.getImei());
return result;
}
}
@@ -3,7 +3,6 @@ package com.sap.sailing.server.gateway.serialization.racelog.impl;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.common.racelog.tracking.SingleTypeBasedServiceFinderImpl;
import com.sap.sailing.domain.common.racelog.tracking.TypeBasedServiceFinder;
import com.sap.sailing.domain.racelog.RaceLogCourseAreaChangedEvent;
import com.sap.sailing.domain.racelog.RaceLogCourseDesignChangedEvent;
@@ -22,12 +21,11 @@ import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent;
import com.sap.sailing.domain.racelog.RaceLogWindFixEvent;
import com.sap.sailing.domain.racelog.RevokeEvent;
import com.sap.sailing.domain.racelog.tracking.DefineMarkEvent;
import com.sap.sailing.domain.racelog.tracking.RegisterCompetitorEvent;
import com.sap.sailing.domain.racelog.tracking.StartTrackingEvent;
import com.sap.sailing.domain.racelog.tracking.DenoteForTrackingEvent;
import com.sap.sailing.domain.racelog.tracking.DeviceCompetitorMappingEvent;
import com.sap.sailing.domain.racelog.tracking.DeviceMarkMappingEvent;
import com.sap.sailing.domain.racelog.tracking.SmartphoneImeiIdentifier;
import com.sap.sailing.domain.racelog.tracking.RegisterCompetitorEvent;
import com.sap.sailing.domain.racelog.tracking.StartTrackingEvent;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
import com.sap.sailing.server.gateway.serialization.coursedata.impl.ControlPointJsonSerializer;
import com.sap.sailing.server.gateway.serialization.coursedata.impl.CourseBaseJsonSerializer;
@@ -37,13 +35,11 @@ import com.sap.sailing.server.gateway.serialization.coursedata.impl.WaypointJson
import com.sap.sailing.server.gateway.serialization.impl.PositionJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.WindJsonSerializer;
import com.sap.sailing.server.gateway.serialization.racelog.tracking.DeviceIdentifierJsonHandler;
import com.sap.sailing.server.gateway.serialization.racelog.tracking.impl.SmartphoneImeiJsonHandlerImpl;
import com.sap.sailing.server.gateway.serialization.racelog.tracking.impl.SmartphoneImeiJsonHandlerFactoryDefaultingToPlaceHolder;
public class RaceLogEventSerializer implements JsonSerializer<RaceLogEvent>, RaceLogEventVisitor {
public static JsonSerializer<RaceLogEvent> create(JsonSerializer<Competitor> competitorSerializer) {
return create(competitorSerializer,
new SingleTypeBasedServiceFinderImpl<DeviceIdentifierJsonHandler>(
new SmartphoneImeiJsonHandlerImpl(), SmartphoneImeiIdentifier.TYPE));
return create(competitorSerializer, new SmartphoneImeiJsonHandlerFactoryDefaultingToPlaceHolder());
}
public static JsonSerializer<RaceLogEvent> create(JsonSerializer<Competitor> competitorSerializer,
TypeBasedServiceFinder<DeviceIdentifierJsonHandler> deviceServiceFinder) {
@@ -0,0 +1,52 @@
package com.sap.sailing.server.gateway.serialization.racelog.tracking.impl;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.common.racelog.tracking.NoCorrespondingServiceRegisteredException;
import com.sap.sailing.domain.common.racelog.tracking.SingleTypeBasedServiceFinderImpl;
import com.sap.sailing.domain.common.racelog.tracking.TransformationException;
import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier;
import com.sap.sailing.server.gateway.deserialization.impl.PlaceHolderDeviceIdentifierJsonDeserializer;
import com.sap.sailing.server.gateway.serialization.impl.DeviceIdentifierBaseJsonSerializer;
import com.sap.sailing.server.gateway.serialization.racelog.tracking.DeviceIdentifierJsonHandler;
public class DeviceIdentifierJsonHandlerFactoryDefaultingToPlaceHolder extends
SingleTypeBasedServiceFinderImpl<DeviceIdentifierJsonHandler> {
private final DeviceIdentifierJsonHandler placeHolderHandler;
public DeviceIdentifierJsonHandlerFactoryDefaultingToPlaceHolder(DeviceIdentifierJsonHandler service, String type) {
super(service, type);
final PlaceHolderDeviceIdentifierJsonDeserializer placeHolderDeserializer =
new PlaceHolderDeviceIdentifierJsonDeserializer();
final DeviceIdentifierBaseJsonSerializer<DeviceIdentifier> placeHolderSerializer =
new DeviceIdentifierBaseJsonSerializer<DeviceIdentifier>() {
@Override
protected JSONObject furtherSerialize(DeviceIdentifier object, JSONObject result) {
return result;
}
};
placeHolderHandler = new DeviceIdentifierJsonHandler() {
@Override
public JSONObject transformForth(DeviceIdentifier object) throws TransformationException {
return placeHolderSerializer.serialize(object);
}
@Override
public DeviceIdentifier transformBack(JSONObject object) throws TransformationException {
return placeHolderDeserializer.deserialize(object);
}
};
}
@Override
public DeviceIdentifierJsonHandler findService(String type) {
try {
return super.findService(type);
} catch (NoCorrespondingServiceRegisteredException e) {
return placeHolderHandler;
}
}
}
@@ -0,0 +1,12 @@
package com.sap.sailing.server.gateway.serialization.racelog.tracking.impl;
import com.sap.sailing.domain.racelog.tracking.SmartphoneImeiIdentifier;
public class SmartphoneImeiJsonHandlerFactoryDefaultingToPlaceHolder extends
DeviceIdentifierJsonHandlerFactoryDefaultingToPlaceHolder {
public SmartphoneImeiJsonHandlerFactoryDefaultingToPlaceHolder() {
super(new SmartphoneImeiJsonHandlerImpl(), SmartphoneImeiIdentifier.TYPE);
}
}