diff --git a/workspace/ttnhabbridge/src/main/java/nl/sikken/bertrik/hab/habitat/docs/ListenerDoc.java b/workspace/ttnhabbridge/src/main/java/nl/sikken/bertrik/hab/habitat/docs/ListenerDoc.java new file mode 100644 index 0000000..cab7823 --- /dev/null +++ b/workspace/ttnhabbridge/src/main/java/nl/sikken/bertrik/hab/habitat/docs/ListenerDoc.java @@ -0,0 +1,61 @@ +package nl.sikken.bertrik.hab.habitat.docs; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import com.fasterxml.jackson.databind.node.ObjectNode; + +/** + * @author bertrik + * + */ +public abstract class ListenerDoc { + + private final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX"); + private final JsonNodeFactory factory = new JsonNodeFactory(false); + + private final String type; + private final Date date; + + /** + * Constructor. + * + * @param type the document type + * @param date the date + */ + protected ListenerDoc(String type, Date date) { + this.type = type; + this.date = date; + } + + /** + * @return the JSON representation + */ + public String format() { + final ObjectNode topNode = factory.objectNode(); + topNode.set("type", factory.textNode(type)); + topNode.set("time_created", factory.textNode(dateFormat.format(date))); + topNode.set("time_uploaded", factory.textNode(dateFormat.format(date))); + topNode.set("data", createDataNode()); + + return topNode.toString(); + } + + /** + * @return the json node factory + */ + protected final JsonNodeFactory factory() { + return factory; + } + + /** + * Creates the sub-type specific 'data' part of the listener doc. + * + * @return the 'data' node contents + */ + abstract JsonNode createDataNode(); + +} diff --git a/workspace/ttnhabbridge/src/main/java/nl/sikken/bertrik/hab/habitat/docs/ListenerInformationDoc.java b/workspace/ttnhabbridge/src/main/java/nl/sikken/bertrik/hab/habitat/docs/ListenerInformationDoc.java new file mode 100644 index 0000000..6020ea7 --- /dev/null +++ b/workspace/ttnhabbridge/src/main/java/nl/sikken/bertrik/hab/habitat/docs/ListenerInformationDoc.java @@ -0,0 +1,33 @@ +package nl.sikken.bertrik.hab.habitat.docs; + +import java.util.Date; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; + +/** + * Listener information doc. + */ +public final class ListenerInformationDoc extends ListenerDoc { + + private final String callSign; + + /** + * Constructor. + * + * @param date the date + * @param callSign the listener call sign + */ + public ListenerInformationDoc(Date date, String callSign) { + super("listener_information", date); + this.callSign = callSign; + } + + @Override + protected JsonNode createDataNode() { + final ObjectNode node = factory().objectNode(); + node.set("callsign", factory().textNode(callSign)); + return node; + } + +} diff --git a/workspace/ttnhabbridge/src/main/java/nl/sikken/bertrik/hab/habitat/docs/ListenerTelemetryDoc.java b/workspace/ttnhabbridge/src/main/java/nl/sikken/bertrik/hab/habitat/docs/ListenerTelemetryDoc.java new file mode 100644 index 0000000..6c7ec13 --- /dev/null +++ b/workspace/ttnhabbridge/src/main/java/nl/sikken/bertrik/hab/habitat/docs/ListenerTelemetryDoc.java @@ -0,0 +1,38 @@ +package nl.sikken.bertrik.hab.habitat.docs; + +import java.util.Date; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; + +import nl.sikken.bertrik.hab.habitat.IHabReceiver; + +/** + * Listener telemetry doc. + */ +public final class ListenerTelemetryDoc extends ListenerDoc { + + private final IHabReceiver receiver; + + /** + * Constructor. + * + * @param date the date + * @param receiver the receiver info + */ + public ListenerTelemetryDoc(Date date, IHabReceiver receiver) { + super("listener_telemetry", date); + this.receiver = receiver; + } + + @Override + protected JsonNode createDataNode() { + final ObjectNode node = factory().objectNode(); + node.set("callsign", factory().textNode(receiver.getCallsign())); + node.set("latitude", factory().numberNode(receiver.getLocation().getLat())); + node.set("longitude", factory().numberNode(receiver.getLocation().getLon())); + node.set("altitude", factory().numberNode(receiver.getLocation().getAlt())); + return node; + } + +} diff --git a/workspace/ttnhabbridge/src/main/java/nl/sikken/bertrik/hab/habitat/docs/PayloadTelemetryDoc.java b/workspace/ttnhabbridge/src/main/java/nl/sikken/bertrik/hab/habitat/docs/PayloadTelemetryDoc.java new file mode 100644 index 0000000..8fedf3e --- /dev/null +++ b/workspace/ttnhabbridge/src/main/java/nl/sikken/bertrik/hab/habitat/docs/PayloadTelemetryDoc.java @@ -0,0 +1,60 @@ +package nl.sikken.bertrik.hab.habitat.docs; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import com.fasterxml.jackson.databind.node.ObjectNode; + +/** + * @author bertrik + * + */ +public final class PayloadTelemetryDoc { + + private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX"); + + private final String callSign; + private final byte[] rawBytes; + private final Date dateCreated; + private final Date dateUploaded; + + /** + * Constructor. + * @param date the date + * @param callSign the receiver call sign + * @param rawBytes the raw telemetry string as bytes + */ + public PayloadTelemetryDoc(Date date, String callSign, byte[] rawBytes) { + this.callSign = callSign; + this.rawBytes = rawBytes; + this.dateCreated = date; + this.dateUploaded = date; + } + + /** + * @return the payload telemetry doc as JSON string + */ + public String format() { + final JsonNodeFactory factory = new JsonNodeFactory(false); + final ObjectNode topNode = factory.objectNode(); + + // create data node + final ObjectNode dataNode = factory.objectNode(); + dataNode.set("_raw", factory.binaryNode(rawBytes)); + + // create receivers node + final ObjectNode receiverNode = factory.objectNode(); + receiverNode.set("time_created", factory.textNode(dateFormat.format(dateCreated))); + receiverNode.set("time_uploaded", factory.textNode(dateFormat.format(dateUploaded))); + final ObjectNode receiversNode = factory.objectNode(); + receiversNode.set(callSign, receiverNode); + + // put it together in the top node + topNode.set("data", dataNode); + topNode.set("receivers", receiversNode); + + return topNode.toString(); + } +} diff --git a/workspace/ttnhabbridge/src/test/java/nl/sikken/bertrik/hab/habitat/docs/ListenerInfoDocTest.java b/workspace/ttnhabbridge/src/test/java/nl/sikken/bertrik/hab/habitat/docs/ListenerInfoDocTest.java new file mode 100644 index 0000000..8e2f90a --- /dev/null +++ b/workspace/ttnhabbridge/src/test/java/nl/sikken/bertrik/hab/habitat/docs/ListenerInfoDocTest.java @@ -0,0 +1,25 @@ +package nl.sikken.bertrik.hab.habitat.docs; + +import java.util.Date; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Unit tests for ListenerInfoDoc + */ +public final class ListenerInfoDocTest { + + /** + * Verifies basic formatting. + */ + @Test + public void testFormat() { + final Date date = new Date(); + final ListenerInformationDoc doc = new ListenerInformationDoc(date, "BERTRIK"); + final String json = doc.format(); + + Assert.assertNotNull(json); + } + +} diff --git a/workspace/ttnhabbridge/src/test/java/nl/sikken/bertrik/hab/habitat/docs/ListenerTelemetryDocTest.java b/workspace/ttnhabbridge/src/test/java/nl/sikken/bertrik/hab/habitat/docs/ListenerTelemetryDocTest.java new file mode 100644 index 0000000..a34e9d8 --- /dev/null +++ b/workspace/ttnhabbridge/src/test/java/nl/sikken/bertrik/hab/habitat/docs/ListenerTelemetryDocTest.java @@ -0,0 +1,43 @@ +package nl.sikken.bertrik.hab.habitat.docs; + +import java.util.Date; + +import org.junit.Assert; +import org.junit.Test; + +import nl.sikken.bertrik.hab.habitat.IHabReceiver; +import nl.sikken.bertrik.hab.habitat.Location; + +/** + * Unit tests for ListenerTelemetryDoc. + */ +public final class ListenerTelemetryDocTest { + + /** + * Verifies basic formatting. + */ + @Test + public void testFormat() { + final Date date = new Date(); + final IHabReceiver receiver = createHabReceiver("BERTRIK", new Location(1.23, 4.56, 7.8)); + final ListenerTelemetryDoc doc = new ListenerTelemetryDoc(date, receiver); + final String json = doc.format(); + + Assert.assertNotNull(json); + } + + private IHabReceiver createHabReceiver(String callSign, Location location) { + return new IHabReceiver() { + @Override + public Location getLocation() { + return location; + } + + @Override + public String getCallsign() { + return callSign; + } + }; + } + +}