add additional servlet to receive fixes in flat JSON serialization

This commit is contained in:
Fredrik Teschke
2014-10-09 18:05:25 +02:00
parent 7f94d255d4
commit ba21f6e70d
5 changed files with 116 additions and 1 deletions
@@ -23,6 +23,15 @@
<servlet-mapping>
<servlet-name>RecordFixesPostServlet</servlet-name>
<url-pattern>/recordFixes</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>RecordFixesFlatJsonPostServlet</servlet-name>
<servlet-class>com.sap.sailing.domain.racelogtracking.servlet.RecordFixesFlatJsonPostServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RecordFixesFlatJsonPostServlet</servlet-name>
<url-pattern>/recordFixesFlatJson</url-pattern>
</servlet-mapping>
</web-app>
@@ -0,0 +1,50 @@
package com.sap.sailing.domain.racelogtracking.servlet;
import java.util.Map;
import java.util.UUID;
import java.util.logging.Level;
import com.sap.sailing.domain.common.racelog.tracking.NoCorrespondingServiceRegisteredException;
import com.sap.sailing.domain.common.racelog.tracking.TransformationException;
import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier;
import com.sap.sailing.domain.racelog.tracking.impl.SmartphoneUUIDIdentifierImpl;
import com.sap.sailing.domain.tracking.GPSFixMoving;
import com.sap.sailing.server.gateway.AbstractJsonPostServlet;
import com.sap.sailing.server.gateway.HttpExceptionWithMessage;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.FlatSmartphoneUuidAndGPSFixMovingJsonDeserializer;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
import com.sap.sse.common.Util.Pair;
public class RecordFixesFlatJsonPostServlet extends AbstractJsonPostServlet<Pair<UUID, GPSFixMoving>, Void> {
private static final long serialVersionUID = -4618399862031700634L;
private final JsonDeserializer<Pair<UUID, GPSFixMoving>> deserializer =
new FlatSmartphoneUuidAndGPSFixMovingJsonDeserializer();
@Override
public JsonDeserializer<Pair<UUID, GPSFixMoving>> getRequestDeserializer() {
return deserializer;
}
@Override
public JsonSerializer<Void> getResponseSerializer() {
return null;
}
@Override
public Void process(Map<String, String> parameterValues, Pair<UUID, GPSFixMoving> domainObject)
throws HttpExceptionWithMessage {
DeviceIdentifier device = new SmartphoneUUIDIdentifierImpl(domainObject.getA());
GPSFixMoving fix = domainObject.getB();
try {
getService().getGPSFixStore().storeFix(device, fix);
} catch (TransformationException | NoCorrespondingServiceRegisteredException e) {
logger.log(Level.WARNING, "Could not load store fix from device " + device);
}
return null;
}
}
@@ -2,6 +2,8 @@ package com.sap.sailing.domain.tracking.impl;
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;
/**
@@ -36,4 +38,8 @@ public class GPSFixImpl extends AbstractGPSFixImpl implements GPSFix {
return getTimePoint()+": "+getPosition();
}
public static GPSFixImpl create(double lonDeg, double latDeg, long timeMillis) {
return new GPSFixImpl(new DegreePosition(latDeg, lonDeg), new MillisecondsTimePoint(timeMillis));
}
}
@@ -3,6 +3,10 @@ package com.sap.sailing.domain.tracking.impl;
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.common.impl.DegreeBearingImpl;
import com.sap.sailing.domain.common.impl.DegreePosition;
import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl;
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.tracking.GPSFixMoving;
public class GPSFixMovingImpl extends GPSFixImpl implements GPSFixMoving {
@@ -33,5 +37,11 @@ public class GPSFixMovingImpl extends GPSFixImpl implements GPSFixMoving {
public boolean equals(Object other) {
return super.equals(other) && other instanceof GPSFixMoving && getSpeed().equals(((GPSFixMoving) other).getSpeed());
}
public static GPSFixMovingImpl create(double lonDeg, double latDeg, long timeMillis,
double speedInKnots, double bearingDeg) {
return new GPSFixMovingImpl(new DegreePosition(latDeg, lonDeg),
new MillisecondsTimePoint(timeMillis), new KnotSpeedWithBearingImpl(
speedInKnots, new DegreeBearingImpl(bearingDeg)));
}
}
@@ -0,0 +1,40 @@
package com.sap.sailing.server.gateway.deserialization.impl;
import java.util.UUID;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.common.impl.MeterPerSecondSpeedImpl;
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.JsonDeserializer;
import com.sap.sse.common.Util.Pair;
/**
* Make serialization on the smartphone easier by providing a flat structure rather
* than nested JSON documents.
* @author Fredrik Teschke
*
*/
public class FlatSmartphoneUuidAndGPSFixMovingJsonDeserializer implements JsonDeserializer<Pair<UUID, GPSFixMoving>> {
public static final String DEVICE_UUID = "deviceUuid";
public static final String LON_DEG = "lonDeg";
public static final String LAT_DEG = "latDeg";
public static final String TIME_MILLIS = "timeMillis";
public static final String SPEED_M_PER_S = "speedMperS";
public static final String BEARING_DEG = "bearingDeg";
@Override
public Pair<UUID, GPSFixMoving> deserialize(JSONObject object) throws JsonDeserializationException {
UUID device = UUID.fromString(object.get(DEVICE_UUID).toString());
double lonDeg = Double.parseDouble(object.get(LON_DEG).toString());
double latDeg = Double.parseDouble(object.get(LAT_DEG).toString());
long timeMillis = Long.parseLong(object.get(TIME_MILLIS).toString());
double speedMperS = Double.parseDouble(object.get(SPEED_M_PER_S).toString());
double speedKnots = new MeterPerSecondSpeedImpl(speedMperS).getKnots();
double bearingDeg = Double.parseDouble(object.get(BEARING_DEG).toString());
GPSFixMoving fix = GPSFixMovingImpl.create(lonDeg, latDeg, timeMillis, speedKnots, bearingDeg);
return new Pair<UUID, GPSFixMoving>(device, fix);
}
}