diff --git a/java/com.sap.sailing.domain.persistence/META-INF/MANIFEST.MF b/java/com.sap.sailing.domain.persistence/META-INF/MANIFEST.MF index b2d0e24a852..ad804426d20 100755 --- a/java/com.sap.sailing.domain.persistence/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.domain.persistence/META-INF/MANIFEST.MF @@ -14,7 +14,11 @@ Require-Bundle: com.sap.sailing.mongodb, com.sap.sailing.server.gateway.serialization;bundle-version="1.0.0" Export-Package: com.sap.sailing.domain.persistence, com.sap.sailing.domain.persistence.devices, - com.sap.sailing.domain.persistence.impl;x-friends:="com.sap.sailing.mongodb.test,com.sap.sailing.domain.swisstimingadapter.test,com.sap.sailing.domain.persistence.test", + com.sap.sailing.domain.persistence.impl; + x-friends:="com.sap.sailing.mongodb.test, + com.sap.sailing.domain.swisstimingadapter.test, + com.sap.sailing.domain.persistence.test, + com.sap.sailing.server.gateway.test", com.sap.sailing.domain.persistence.media Bundle-ActivationPolicy: lazy Import-Package: org.json.simple, diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java index 3300fa3892b..b019ff4afbe 100755 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java @@ -1480,7 +1480,8 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { GPSFix fix = null; - if (GPSFixMoving.class.getSimpleName().equals(object.get(FieldNames.GPSFIX_TYPE.name()))) { + String type = (String) object.get(FieldNames.GPSFIX_TYPE.name()); + if (GPSFixMoving.class.getSimpleName().equals(type)) { SpeedWithBearing speed = loadSpeedWithBearing(object); fix = new GPSFixMovingImpl(position, timePoint, speed); } else { diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java index ec82fb51183..0ba2314914e 100755 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java @@ -983,23 +983,26 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { query.put(FieldNames.CONFIGURATION_MATCHER_ID.name(), matcher.getMatcherIdentifier()); configurationsCollections.remove(query); } + + public DBCollection getGPSFixCollection() { + return database.getCollection(CollectionNames.GPS_FIXES.name()); + } @Override public void storeGPSFixes(DeviceIdentifier device, Iterable fixes) { - DBCollection collection = database.getCollection(CollectionNames.GPS_FIXES.name()); DBObject dbDeviceId = DomainObjectFactoryImpl.storeDeviceId(deviceIdentifierServiceFinder, device); - + DBCollection collection = getGPSFixCollection(); for (GPSFix fix : fixes) { DBObject entry = new BasicDBObject(FieldNames.DEVICE_ID.name(), dbDeviceId); storeTimed(fix, entry); storePositioned(fix, entry); String type = GPSFix.class.getSimpleName(); - entry.put(FieldNames.GPSFIX_TYPE.name(), type); if (fix instanceof GPSFixMoving) { type = GPSFixMoving.class.getSimpleName(); storeSpeedWithBearing(((GPSFixMoving) fix).getSpeed(), entry); } + entry.put(FieldNames.GPSFIX_TYPE.name(), type); collection.insert(entry); } diff --git a/java/com.sap.sailing.domain.smartphoneadapter.test/META-INF/MANIFEST.MF b/java/com.sap.sailing.domain.smartphoneadapter.test/META-INF/MANIFEST.MF index f3449f7e285..5839c2200ae 100644 --- a/java/com.sap.sailing.domain.smartphoneadapter.test/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.domain.smartphoneadapter.test/META-INF/MANIFEST.MF @@ -6,4 +6,10 @@ Bundle-Version: 1.0.0.qualifier Bundle-Vendor: SAP Bundle-RequiredExecutionEnvironment: JavaSE-1.7 Bundle-ClassPath: . -Require-Bundle: org.junit4;bundle-version="4.8.2" +Require-Bundle: org.junit4;bundle-version="4.8.2", + com.sap.sailing.domain.shared.android;bundle-version="1.0.0", + com.sap.sailing.server.gateway.serialization;bundle-version="1.0.0", + com.sap.sailing.domain;bundle-version="1.0.0", + org.json.simple;bundle-version="1.1.0", + com.sap.sailing.domain.common;bundle-version="1.0.0" +Import-Package: com.sap.sailing.domain.common.impl diff --git a/java/com.sap.sailing.domain.smartphoneadapter.test/src/com/sap/sailing/domain/smartphoneadapter/test/JsonOverHttpTest.java b/java/com.sap.sailing.domain.smartphoneadapter.test/src/com/sap/sailing/domain/smartphoneadapter/test/JsonOverHttpTest.java new file mode 100644 index 00000000000..565e587b62d --- /dev/null +++ b/java/com.sap.sailing.domain.smartphoneadapter.test/src/com/sap/sailing/domain/smartphoneadapter/test/JsonOverHttpTest.java @@ -0,0 +1,75 @@ +package com.sap.sailing.domain.smartphoneadapter.test; + +import java.io.BufferedReader; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; + +import org.json.simple.JSONValue; +import org.json.simple.parser.ParseException; + +public abstract class JsonOverHttpTest { + protected static final String URL_BASE = "127.0.0.1"; + protected static final int PORT = 8888; + protected static final String URL_SS = "/sailingserver"; + protected static final String URL_RF = "/recordFixes"; + + protected String getUrl(String endOfUrl) { + return "http://" + URL_BASE + ":" + PORT + endOfUrl; + } + + protected String executeRequest(String method, String targetURL, String body) throws IOException { + // Create connection + URL url = new URL(targetURL); + System.out.println(url); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod(method); + connection.setRequestProperty("Content-Type", "application/json"); + + connection.setUseCaches(false); + connection.setDoInput(true); + + // Send request + if (method.equals("POST")) { + connection.setDoOutput(true); + DataOutputStream wr = new DataOutputStream(connection.getOutputStream()); + wr.writeBytes(body); + } + + InputStream is = null; + boolean error = false; + if (connection.getResponseCode() >= 400) { + is = connection.getErrorStream(); + error = true; + } else { + is = connection.getInputStream(); + } + + if (is == null) { + return ""; + } + + BufferedReader rd = new BufferedReader(new InputStreamReader(is)); + String line; + StringBuffer response = new StringBuffer(); + while ((line = rd.readLine()) != null) { + response.append(line); + response.append('\r'); + } + rd.close(); + if (error) { + System.err.println(response.toString()); + return ""; + } + + return response.toString(); + } + + protected Object getJson(String url) throws IllegalStateException, IOException, ParseException { + return JSONValue.parseWithException(executeRequest("GET", url, "")); + } + +} diff --git a/java/com.sap.sailing.domain.smartphoneadapter.test/src/com/sap/sailing/domain/smartphoneadapter/test/manual/PostFixes.java b/java/com.sap.sailing.domain.smartphoneadapter.test/src/com/sap/sailing/domain/smartphoneadapter/test/manual/PostFixes.java new file mode 100644 index 00000000000..27554c4f108 --- /dev/null +++ b/java/com.sap.sailing.domain.smartphoneadapter.test/src/com/sap/sailing/domain/smartphoneadapter/test/manual/PostFixes.java @@ -0,0 +1,105 @@ +package com.sap.sailing.domain.smartphoneadapter.test.manual; + +import java.io.IOException; +import java.io.Serializable; +import java.text.ParseException; +import java.util.Arrays; +import java.util.List; +import java.util.Timer; +import java.util.TimerTask; + +import com.sap.sailing.domain.common.Bearing; +import com.sap.sailing.domain.common.Distance; +import com.sap.sailing.domain.common.Position; +import com.sap.sailing.domain.common.SpeedWithBearing; +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.common.impl.Util.Triple; +import com.sap.sailing.domain.devices.SmartphoneImeiIdentifier; +import com.sap.sailing.domain.smartphoneadapter.test.JsonOverHttpTest; +import com.sap.sailing.domain.tracking.GPSFix; +import com.sap.sailing.domain.tracking.GPSFixMoving; +import com.sap.sailing.domain.tracking.impl.GPSFixImpl; +import com.sap.sailing.domain.tracking.impl.GPSFixMovingImpl; +import com.sap.sailing.server.gateway.serialization.impl.DeviceAndSessionIdentifierWithGPSFixesSerializer; +import com.sap.sailing.server.gateway.serialization.impl.GPSFixMovingNmeaDTOJsonSerializer; +import com.sap.sailing.server.gateway.serialization.impl.SmartphoneImeiIdentifierJsonSerializer; + +public class PostFixes extends JsonOverHttpTest { + protected static final SmartphoneImeiIdentifier device = new SmartphoneImeiIdentifier("a"); + + private final DeviceAndSessionIdentifierWithGPSFixesSerializer fixSerializer = + new DeviceAndSessionIdentifierWithGPSFixesSerializer<>(new SmartphoneImeiIdentifierJsonSerializer(), new GPSFixMovingNmeaDTOJsonSerializer()); + + private void recordFix(GPSFixMoving... fix) throws IOException { + String request = fixSerializer.serialize( + new Triple>( + device, null, Arrays.asList(fix))).toJSONString(); + + executeRequest("POST", getUrl(URL_SS + "/recordFixes"), request); + } + + private void recordFixes() { + final Timer timer = new Timer(); + final Position p1 = new DegreePosition(54.427119, 10.182583); + final Position p2 = new DegreePosition(54.435707, 10.200779); + final Position p3 = new DegreePosition(54.425921, 10.188248); + + final int nFirstLeg = 100; + final int nSecondLeg = 100; + final int n = nFirstLeg + nSecondLeg; + long period = 1000; + + timer.scheduleAtFixedRate(new TimerTask() { + int i = 0; + GPSFix lastFix; + + @Override + public void run() { + if (i++ > n) + timer.cancel(); + + Position start; + Position end; + int iLeg = i; + int nLeg; + + if (i < nFirstLeg) { + start = p1; + end = p2; + nLeg = nFirstLeg; + } else { + start = p2; + end = p3; + iLeg -= nFirstLeg; + nLeg = nSecondLeg; + } + + Distance distance = start.getDistance(end); + Bearing bearing = start.getBearingGreatCircle(end); + Position boat = start.translateGreatCircle(bearing, distance.scale(((double) iLeg) / nLeg)); + GPSFix fix = new GPSFixImpl(boat, MillisecondsTimePoint.now()); + SpeedWithBearing speed = lastFix == null ? new KnotSpeedWithBearingImpl(0, new DegreeBearingImpl(0)) + : lastFix.getSpeedAndBearingRequiredToReach(fix); + lastFix = fix; + + try { + recordFix(new GPSFixMovingImpl(fix.getPosition(), fix.getTimePoint(), speed)); + } catch (IOException e) { + e.printStackTrace(); + } + } + }, 0, period); + } + + public void run() throws IOException, IllegalStateException, ParseException, InterruptedException { + recordFixes(); + } + + public static void main(String[] args) throws IllegalStateException, IOException, ParseException, + InterruptedException { + new PostFixes().run(); + } +} diff --git a/java/com.sap.sailing.domain.smartphoneadapter.testsupport/META-INF/MANIFEST.MF b/java/com.sap.sailing.domain.smartphoneadapter.testsupport/META-INF/MANIFEST.MF index b3c6e68f58e..5bf2791f699 100644 --- a/java/com.sap.sailing.domain.smartphoneadapter.testsupport/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.domain.smartphoneadapter.testsupport/META-INF/MANIFEST.MF @@ -1,14 +1,16 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: Testsupport -Bundle-SymbolicName: com.sap.sailing.domain.smartphoneadapter.testsupport -Bundle-Version: 1.0.0.qualifier -Bundle-Vendor: SAP -Bundle-RequiredExecutionEnvironment: JavaSE-1.7 -Require-Bundle: com.sap.sailing.domain.shared.android, - com.sap.sailing.domain, - com.sap.sailing.domain.common, - com.mongodb.driver, - com.sap.sailing.domain.persistence, - com.sap.sailing.domain.smartphoneadapter -Export-Package: com.sap.sailing.domain.test.mock +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Testsupport +Bundle-SymbolicName: com.sap.sailing.domain.smartphoneadapter.testsupport +Bundle-Version: 1.0.0.qualifier +Bundle-Vendor: SAP +Bundle-RequiredExecutionEnvironment: JavaSE-1.7 +Require-Bundle: com.sap.sailing.domain.shared.android, + com.sap.sailing.domain, + com.sap.sailing.domain.common, + com.mongodb.driver, + com.sap.sailing.domain.persistence, + com.sap.sailing.domain.smartphoneadapter, + com.sap.sailing.server.gateway.serialization;bundle-version="1.0.0", + org.json.simple;bundle-version="1.1.0" +Export-Package: com.sap.sailing.domain.test.mock diff --git a/java/com.sap.sailing.domain.smartphoneadapter.testsupport/src/com/sap/sailing/domain/test/mock/MockGPSFixJsonSerializationHandler.java b/java/com.sap.sailing.domain.smartphoneadapter.testsupport/src/com/sap/sailing/domain/test/mock/MockGPSFixJsonSerializationHandler.java new file mode 100644 index 00000000000..a5e4956b264 --- /dev/null +++ b/java/com.sap.sailing.domain.smartphoneadapter.testsupport/src/com/sap/sailing/domain/test/mock/MockGPSFixJsonSerializationHandler.java @@ -0,0 +1,27 @@ +package com.sap.sailing.domain.test.mock; + +import org.json.simple.JSONObject; + +import com.sap.sailing.domain.tracking.GPSFix; +import com.sap.sailing.domain.tracking.GPSFixMoving; +import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; +import com.sap.sailing.server.gateway.deserialization.impl.GPSFixMovingJsonDeserializer; +import com.sap.sailing.server.gateway.serialization.devices.GPSFixJsonSerializationHandler; +import com.sap.sailing.server.gateway.serialization.impl.GPSFixMovingJsonSerializer; + +public class MockGPSFixJsonSerializationHandler implements + GPSFixJsonSerializationHandler { + + @Override + public JSONObject serialize(GPSFix object) throws IllegalArgumentException { + if (!(object instanceof GPSFixMoving)) throw new IllegalArgumentException("Only serializes GPSFixMoving"); + return new GPSFixMovingJsonSerializer().serialize((GPSFixMoving) object); + } + + @Override + public GPSFix deserialize(JSONObject json) + throws JsonDeserializationException { + return new GPSFixMovingJsonDeserializer().deserialize(json); + } + +} diff --git a/java/com.sap.sailing.domain.smartphoneadapter.testsupport/src/com/sap/sailing/domain/test/mock/MockGPSFixJsonSerializationServiceFinder.java b/java/com.sap.sailing.domain.smartphoneadapter.testsupport/src/com/sap/sailing/domain/test/mock/MockGPSFixJsonSerializationServiceFinder.java new file mode 100644 index 00000000000..552f9132e69 --- /dev/null +++ b/java/com.sap.sailing.domain.smartphoneadapter.testsupport/src/com/sap/sailing/domain/test/mock/MockGPSFixJsonSerializationServiceFinder.java @@ -0,0 +1,17 @@ +package com.sap.sailing.domain.test.mock; + +import com.sap.sailing.domain.devices.TypeBasedServiceFinder; +import com.sap.sailing.server.gateway.deserialization.impl.GPSFixMovingJsonDeserializer; +import com.sap.sailing.server.gateway.serialization.devices.GPSFixJsonSerializationHandler; + +public class MockGPSFixJsonSerializationServiceFinder implements TypeBasedServiceFinder { + private final MockGPSFixJsonSerializationHandler handler = new MockGPSFixJsonSerializationHandler(); + + @Override + public GPSFixJsonSerializationHandler findService(String fixType) { + if (fixType.equals(GPSFixMovingJsonDeserializer.TYPE)) { + return handler; + } + return null; + } +} diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreGPSFixTrackTest.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreGPSFixTrackTest.java index fecd12b5300..81e6601ca7b 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreGPSFixTrackTest.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreGPSFixTrackTest.java @@ -1,69 +1,76 @@ -package com.sap.sailing.mongodb.test; - -import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.List; - -import org.junit.After; -import org.junit.Test; - -import com.mongodb.DB; -import com.mongodb.MongoException; -import com.sap.sailing.domain.base.DomainFactory; -import com.sap.sailing.domain.common.impl.DegreePosition; -import com.sap.sailing.domain.common.impl.MillisecondsTimePoint; -import com.sap.sailing.domain.common.impl.Util; -import com.sap.sailing.domain.devices.DeviceIdentifier; -import com.sap.sailing.domain.devices.SmartphoneImeiIdentifier; -import com.sap.sailing.domain.devices.TypeBasedServiceFinderFactory; -import com.sap.sailing.domain.persistence.DomainObjectFactory; -import com.sap.sailing.domain.persistence.MongoObjectFactory; -import com.sap.sailing.domain.persistence.PersistenceFactory; -import com.sap.sailing.domain.persistence.impl.CollectionNames; -import com.sap.sailing.domain.test.mock.MockDeviceTypeServiceFinderFactory; -import com.sap.sailing.domain.tracking.DynamicTrack; -import com.sap.sailing.domain.tracking.GPSFix; -import com.sap.sailing.domain.tracking.impl.GPSFixImpl; - -import static org.junit.Assert.assertEquals; - -public class StoreGPSFixTrackTest extends AbstractMongoDBTest { - public StoreGPSFixTrackTest() throws UnknownHostException, MongoException { - super(); - } - - @After - public void dropCollection() { - DB db = getMongoService().getDB(); - db.getCollection(CollectionNames.GPS_FIXES.name()).drop(); - } - - @Test - public void testStoreAndLoadFixes() { - TypeBasedServiceFinderFactory factory = new MockDeviceTypeServiceFinderFactory(); - MongoObjectFactory mongoObjectFactory = PersistenceFactory.INSTANCE.getMongoObjectFactory(getMongoService(), factory); - DomainObjectFactory domainObjectFactory = PersistenceFactory.INSTANCE.getDomainObjectFactory(getMongoService(), DomainFactory.INSTANCE, factory); - - List fixes = new ArrayList<>(); - fixes.add(new GPSFixImpl(new DegreePosition(30, 40), new MillisecondsTimePoint(0))); - fixes.add(new GPSFixImpl(new DegreePosition(40, 50), new MillisecondsTimePoint(1))); - DeviceIdentifier device1 = new SmartphoneImeiIdentifier("a"); - mongoObjectFactory.storeGPSFixes(device1, fixes); - - fixes.clear(); - fixes.add(new GPSFixImpl(new DegreePosition(40, 50), new MillisecondsTimePoint(0))); - DeviceIdentifier device2 = new SmartphoneImeiIdentifier("b"); - mongoObjectFactory.storeGPSFixes(device2, fixes); - - DynamicTrack loadedTrack1 = domainObjectFactory.loadGPSFixTrack(device1); - DynamicTrack loadedTrack2 = domainObjectFactory.loadGPSFixTrack(device2); - loadedTrack1.lockForRead(); - assertEquals(2, Util.size(loadedTrack1.getRawFixes())); - loadedTrack1.unlockAfterRead(); - loadedTrack2.lockForRead(); - assertEquals(1, Util.size(loadedTrack2.getRawFixes())); - loadedTrack2.unlockAfterRead(); - - assertEquals(2, domainObjectFactory.loadAllGPSFixTracks().size()); - } -} +package com.sap.sailing.mongodb.test; + +import static junit.framework.Assert.assertTrue; +import static org.junit.Assert.assertEquals; + +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.List; + +import org.junit.After; +import org.junit.Test; + +import com.mongodb.DB; +import com.mongodb.MongoException; +import com.sap.sailing.domain.base.DomainFactory; +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.common.impl.Util; +import com.sap.sailing.domain.devices.DeviceIdentifier; +import com.sap.sailing.domain.devices.SmartphoneImeiIdentifier; +import com.sap.sailing.domain.devices.TypeBasedServiceFinderFactory; +import com.sap.sailing.domain.persistence.DomainObjectFactory; +import com.sap.sailing.domain.persistence.MongoObjectFactory; +import com.sap.sailing.domain.persistence.PersistenceFactory; +import com.sap.sailing.domain.persistence.impl.CollectionNames; +import com.sap.sailing.domain.test.mock.MockDeviceTypeServiceFinderFactory; +import com.sap.sailing.domain.tracking.DynamicTrack; +import com.sap.sailing.domain.tracking.GPSFix; +import com.sap.sailing.domain.tracking.GPSFixMoving; +import com.sap.sailing.domain.tracking.impl.GPSFixImpl; +import com.sap.sailing.domain.tracking.impl.GPSFixMovingImpl; + +public class StoreGPSFixTrackTest extends AbstractMongoDBTest { + public StoreGPSFixTrackTest() throws UnknownHostException, MongoException { + super(); + } + + @After + public void dropCollection() { + DB db = getMongoService().getDB(); + db.getCollection(CollectionNames.GPS_FIXES.name()).drop(); + } + + @Test + public void testStoreAndLoadFixes() { + TypeBasedServiceFinderFactory factory = new MockDeviceTypeServiceFinderFactory(); + MongoObjectFactory mongoObjectFactory = PersistenceFactory.INSTANCE.getMongoObjectFactory(getMongoService(), factory); + DomainObjectFactory domainObjectFactory = PersistenceFactory.INSTANCE.getDomainObjectFactory(getMongoService(), DomainFactory.INSTANCE, factory); + + List fixes = new ArrayList<>(); + fixes.add(new GPSFixMovingImpl(new DegreePosition(30, 40), new MillisecondsTimePoint(0), + new KnotSpeedWithBearingImpl(0, new DegreeBearingImpl(0)))); + fixes.add(new GPSFixImpl(new DegreePosition(40, 50), new MillisecondsTimePoint(1))); + DeviceIdentifier device1 = new SmartphoneImeiIdentifier("a"); + mongoObjectFactory.storeGPSFixes(device1, fixes); + + fixes.clear(); + fixes.add(new GPSFixImpl(new DegreePosition(40, 50), new MillisecondsTimePoint(0))); + DeviceIdentifier device2 = new SmartphoneImeiIdentifier("b"); + mongoObjectFactory.storeGPSFixes(device2, fixes); + + DynamicTrack loadedTrack1 = domainObjectFactory.loadGPSFixTrack(device1); + DynamicTrack loadedTrack2 = domainObjectFactory.loadGPSFixTrack(device2); + loadedTrack1.lockForRead(); + assertEquals(2, Util.size(loadedTrack1.getRawFixes())); + assertTrue(loadedTrack1.getFirstRawFix() instanceof GPSFixMoving); + loadedTrack1.unlockAfterRead(); + loadedTrack2.lockForRead(); + assertEquals(1, Util.size(loadedTrack2.getRawFixes())); + loadedTrack2.unlockAfterRead(); + + assertEquals(2, domainObjectFactory.loadAllGPSFixTracks().size()); + } +} diff --git a/java/com.sap.sailing.server.gateway.test/META-INF/MANIFEST.MF b/java/com.sap.sailing.server.gateway.test/META-INF/MANIFEST.MF index 50aa58f1d51..77cb62fb395 100644 --- a/java/com.sap.sailing.server.gateway.test/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.server.gateway.test/META-INF/MANIFEST.MF @@ -10,5 +10,7 @@ Require-Bundle: org.mockito.mockito-core;bundle-version="1.9.5", com.sap.sailing.domain.test, org.hamcrest;bundle-version="1.1.0", org.objenesis;bundle-version="1.3.0", - org.junit4;bundle-version="4.8.2" -Import-Package: com.sap.sailing.server.impl + org.junit4;bundle-version="4.8.2", + com.sap.sailing.domain.smartphoneadapter.testsupport;bundle-version="1.0.0" +Import-Package: com.sap.sailing.domain.persistence.impl, + com.sap.sailing.server.impl diff --git a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/impl/RecordFixesTest.java b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/impl/RecordFixesTest.java new file mode 100644 index 00000000000..c7c38049dd8 --- /dev/null +++ b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/impl/RecordFixesTest.java @@ -0,0 +1,85 @@ +package com.sap.sailing.server.gateway.impl; + +import static com.sap.sailing.domain.common.impl.Util.size; +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertTrue; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +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.common.impl.Util.Triple; +import com.sap.sailing.domain.devices.DeviceIdentifier; +import com.sap.sailing.domain.devices.SmartphoneImeiIdentifier; +import com.sap.sailing.domain.persistence.impl.MongoObjectFactoryImpl; +import com.sap.sailing.domain.test.mock.MockDeviceTypeServiceFinder; +import com.sap.sailing.domain.test.mock.MockDeviceTypeServiceFinderFactory; +import com.sap.sailing.domain.test.mock.MockGPSFixJsonSerializationServiceFinder; +import com.sap.sailing.domain.tracking.DynamicTrack; +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.RacingEventService; +import com.sap.sailing.server.gateway.deserialization.impl.DeviceAndSessionIdentifierWithGPSFixesDeserializer; +import com.sap.sailing.server.gateway.impl.RecordFixesPostServlet; +import com.sap.sailing.server.gateway.serialization.devices.DeviceIdentifierJsonSerializationHandler; +import com.sap.sailing.server.impl.RacingEventServiceImpl; + +public class RecordFixesTest { + private RacingEventService service; + private RecordFixesPostServlet servlet; + private final DeviceIdentifier device = new SmartphoneImeiIdentifier("a"); + + @Before + public void before() { + MockDeviceTypeServiceFinderFactory serviceFinderFactory = new MockDeviceTypeServiceFinderFactory(); + MockDeviceTypeServiceFinder deviceServiceFinder = new MockDeviceTypeServiceFinder(); + MockGPSFixJsonSerializationServiceFinder fixServiceFinder = new MockGPSFixJsonSerializationServiceFinder(); + DeviceAndSessionIdentifierWithGPSFixesDeserializer deserializer = new DeviceAndSessionIdentifierWithGPSFixesDeserializer( + fixServiceFinder, deviceServiceFinder); + service = new RacingEventServiceImpl(null, serviceFinderFactory); + servlet = new RecordFixesPostServlet(); + servlet = spy(servlet); + when(servlet.getRequestDeserializer()).thenReturn(deserializer); + doReturn(service).when(servlet).getService(); + } + + @After + public void after() { + MongoObjectFactoryImpl mongoOF = (MongoObjectFactoryImpl) service.getMongoObjectFactory(); + mongoOF.getGPSFixCollection().drop(); + } + + private GPSFixMoving createFix(long millis, long lat, long lng, long knots, long degrees) { + return new GPSFixMovingImpl(new DegreePosition(lat, lng), + new MillisecondsTimePoint(millis), new KnotSpeedWithBearingImpl(knots, new DegreeBearingImpl(degrees))); + } + + @Test + public void areFixesStoredInDb() { + int timepoint = 343; + List fixes = new ArrayList<>(); + fixes.add(createFix(timepoint, 0, 0, 0, 0)); + fixes.add(createFix(timepoint+1, 0, 0, 0, 0)); + Triple> data = new Triple<>(device, null, fixes); + servlet.process(null, data); + + DynamicTrack track = service.getDomainObjectFactory().loadGPSFixTrack(device); + track.lockForRead(); + assertEquals(2, size(track.getRawFixes())); + assertEquals(timepoint, track.getFirstRawFix().getTimePoint().asMillis()); + assertTrue(track.getFirstRawFix() instanceof GPSFixMoving); + track.unlockAfterRead(); + } +} diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/AbstractJsonPostServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/AbstractJsonPostServlet.java index 52c9a9570f6..f7ce2f3817b 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/AbstractJsonPostServlet.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/AbstractJsonPostServlet.java @@ -21,7 +21,7 @@ import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; import com.sap.sailing.server.gateway.deserialization.impl.Helpers; import com.sap.sailing.server.gateway.serialization.JsonSerializer; -public abstract class AbstractJsonPostServlet extends SailingServerHttpServlet { +public abstract class AbstractJsonPostServlet extends AbstractJsonHttpServlet { private static final long serialVersionUID = 8474205424939759851L; private final List requiredParameters; private final ArrayList optionalParameters; @@ -78,6 +78,7 @@ public abstract class AbstractJsonPostServlet extends Saili resp.sendError(HttpServletResponse.SC_BAD_REQUEST, String.format("Invalid JSON in request body:\n%s", e)); logger.warning(String.format("Exception while parsing post request:\n%s", e.toString())); + e.printStackTrace(); return; } } @@ -88,9 +89,11 @@ public abstract class AbstractJsonPostServlet extends Saili } catch (HttpExceptionWithMessage e) { e.sendError(resp); logger.warning(String.format("Exception while processing post request:\n%s", e.toString())); + e.printStackTrace(); return; } + setJsonResponseHeader(resp); resp.setStatus(HttpServletResponse.SC_OK); if (getResponseSerializer() != null && responseObject != null) { resp.getWriter().write(getResponseSerializer().serialize(responseObject).toJSONString()); diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/RecordFixesPostServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/RecordFixesPostServlet.java index abfb72a7504..f7b7e180697 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/RecordFixesPostServlet.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/RecordFixesPostServlet.java @@ -4,6 +4,9 @@ import java.io.Serializable; import java.util.List; import java.util.Map; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; + import com.sap.sailing.domain.common.impl.Util.Triple; import com.sap.sailing.domain.devices.DeviceIdentifier; import com.sap.sailing.domain.devices.TypeBasedServiceFinder; @@ -20,16 +23,17 @@ import com.sap.sailing.server.gateway.serialization.devices.GPSFixJsonSerializat public class RecordFixesPostServlet extends AbstractJsonPostServlet>, Void> { private static final long serialVersionUID = 2778739335260621119L; - private final DeviceAndSessionIdentifierWithGPSFixesDeserializer deserializer; - - public RecordFixesPostServlet() { + private DeviceAndSessionIdentifierWithGPSFixesDeserializer deserializer; + + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); TypeBasedServiceFinderFactory serviceFinderFactory = new CachedOsgiTypeBasedServiceFinderFactory(getContext()); TypeBasedServiceFinder fixServiceFinder = serviceFinderFactory.createServiceFinder(GPSFixJsonSerializationHandler.class); TypeBasedServiceFinder deviceServiceFinder = serviceFinderFactory.createServiceFinder(DeviceIdentifierJsonSerializationHandler.class); deserializer = new DeviceAndSessionIdentifierWithGPSFixesDeserializer(fixServiceFinder, deviceServiceFinder); - } @Override