Skip to content

Commit

Permalink
Incomplete changes to handle JSON to XML Array conversion. Status: AS…
Browse files Browse the repository at this point in the history
…N.1 encoder fails to encode messages.
  • Loading branch information
hmusavi committed Dec 4, 2018
1 parent a54f70c commit cd2cd16
Show file tree
Hide file tree
Showing 21 changed files with 237 additions and 106 deletions.
2 changes: 1 addition & 1 deletion docker-exec.bat
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
if [%1]==[] goto usage

docker exec -it %1 %2
docker exec --env-file ./.env -it %1 %2

goto :eof

Expand Down
2 changes: 1 addition & 1 deletion docker-run-adm.bat
Original file line number Diff line number Diff line change
@@ -1 +1 @@
docker run -it --env-file=.env -v %DOCKER_SHARED_VOLUME%:/asn1_codec_share -e DOCKER_HOST_IP=%DOCKER_HOST_IP% -e ACM_CONFIG_FILE=adm.properties jpoode_acm:latest %1
docker run -it --env-file=.env -v %DOCKER_SHARED_VOLUME%:/asn1_codec_share jpoode_acm:latest %1
2 changes: 1 addition & 1 deletion docker-run-aem.bat
Original file line number Diff line number Diff line change
@@ -1 +1 @@
docker run -it --env-file=.env -v %DOCKER_SHARED_VOLUME%:/asn1_codec_share -e DOCKER_HOST_IP=%DOCKER_HOST_IP% -e ACM_CONFIG_FILE=aem.properties jpoode_acm:latest %1
docker run -it --env-file=.env -v %DOCKER_SHARED_VOLUME%:/asn1_codec_share jpoode_acm:latest %1
2 changes: 1 addition & 1 deletion docker-run-ode.bat
Original file line number Diff line number Diff line change
@@ -1 +1 @@
docker run -it --env-file=.env -v %DOCKER_SHARED_VOLUME%:/ode_data -e DOCKER_HOST_IP=%DOCKER_HOST_IP% -p "8080:8080" -p "9090:9090" -p "46753:46753/udp" jpoode_ode:latest %1
docker run -it --env-file=.env -v %DOCKER_SHARED_VOLUME%:/ode_data -p "8080:8080" -p "9090:9090" -p "46753:46753/udp" jpoode_ode:latest %1
2 changes: 1 addition & 1 deletion docker-run-ode.sh
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
#!/bin/bash
docker run -it --env-file=.env -v /var/run/docker.sock:/var/run/docker.sock -v ${DOCKER_SHARED_VOLUME}:/ppm_data -p '8080:8080' -e DOCKER_HOST_IP=$DOCKER_HOST_IP jpoode_ode:latest $1
docker run -it --env-file=.env -v /var/run/docker.sock:/var/run/docker.sock -v ${DOCKER_SHARED_VOLUME}:/ppm_data -p '8080:8080' jpoode_ode:latest $1
2 changes: 1 addition & 1 deletion docker-run-ppm.bat
Original file line number Diff line number Diff line change
@@ -1 +1 @@
docker run -it --env-file=.env -v %DOCKER_SHARED_VOLUME%:/ppm_data -e DOCKER_HOST_IP=%DOCKER_HOST_IP% jpoode_ppm:latest %1
docker run -it --env-file=.env -v %DOCKER_SHARED_VOLUME%:/ppm_data jpoode_ppm:latest %1
2 changes: 1 addition & 1 deletion docker-run-ppm.sh
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
#!/bin/bash
docker run -it --env-file=.env -v ${DOCKER_SHARED_VOLUME}:/ppm_data -e DOCKER_HOST_IP=${DOCKER_HOST_IP} jpoode_ppm:latest $1
docker run -it --env-file=.env -v ${DOCKER_SHARED_VOLUME}:/ppm_data jpoode_ppm:latest $1
Binary file modified docs/ODE_Output_Schema_Reference.docx
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public String toJson(boolean verbose) {
}

public String toXml() throws XmlUtilsException, JsonProcessingException {
return XmlUtils.toXmlS(this);
return XmlUtils.toXmlStatic(this);
}

@Override
Expand Down
37 changes: 29 additions & 8 deletions jpo-ode-common/src/main/java/us/dot/its/jpo/ode/util/XmlUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;

Expand Down Expand Up @@ -67,14 +68,34 @@ public Object fromXml(String xml, Class<?> clazz) throws XmlUtilsException {
}
}

public static String toXmlS(Object o) throws XmlUtilsException {
String xml;
try {
xml = staticXmlMapper.writeValueAsString(o);
} catch (Exception e) {
throw new XmlUtilsException("Error encoding object to XML", e);
}
return xml;
/**
* Embeds the arrayNode into an ObjectNode with the given childKey. By default a JSON array
* such as {"parent":[1, 2, 3,]} will be converted to:
* <ObjectNode><parent>1</parent><parent>2</parent><parent>3</parent></ObjectNode>.
* This is not often desired as there is no paren object to encompass the array. By calling
* this method given childKey = "child" and arrayNode = [1, 2, 3,], method will return
* {"parent":{"child":[1, 2, 3,]}} which as a result will be encoded to
* <ObjectNode><parent><child>1</child><child>2</child><child>3</child></parent></ObjectNode>.
* Which is a more representative of the JSON ObjectNode.
*
* @param childKey: The key to be given to the child array object
* @param arrayNode: The array node to be embedded in a ObjectNode
* @return OBjectNode representation of the given arrayNode redy to be converted to XML
*/
public static ObjectNode createEmbeddedJsonArrayForXmlConversion(String childKey, ArrayNode arrayNode) {
ObjectNode childNode = staticXmlMapper.createObjectNode();
childNode.set(childKey, arrayNode);
return childNode;
}

public static String toXmlStatic(Object o) throws XmlUtilsException {
String xml;
try {
xml = staticXmlMapper.writeValueAsString(o);
} catch (Exception e) {
throw new XmlUtilsException("Error encoding object to XML", e);
}
return xml;
}

public static Object fromXmlS(String xml, Class<?> clazz) throws XmlUtilsException {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ public class AppContext {
public static final String METADATA_STRING = "metadata";
public static final String ODE_ASN1_DATA = "OdeAsn1Data";
public static final String DATA_STRING = "data";
public static final String ENCODING_STRING = "encodings";
public static final String ENCODINGS_STRING = "encodings";
public static final String PAYLOAD_TYPE_STRING = "payloadType";
public static final String DATA_TYPE_STRING = "dataType";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public static JsonNode transformDataFrames(JsonNode dataFrames) throws JsonUtils

if (dataFrames == null) {
return JsonUtils.newNode();
}
}

ArrayNode replacedDataFrames = JsonUtils.newNode().arrayNode();

Expand All @@ -66,7 +66,7 @@ public static JsonNode transformDataFrames(JsonNode dataFrames) throws JsonUtils
ObjectNode oldFrame = (ObjectNode) dataFramesIter.next();
replaceDataFrame(oldFrame);
// wrap each data frame inside a TravelerDataFrame
replacedDataFrames.add(JsonUtils.newObjectNode("TravelerDataFrame", oldFrame));
replacedDataFrames.add(oldFrame);
}
}

Expand Down Expand Up @@ -250,6 +250,13 @@ public static void replaceContent(ObjectNode dataFrame) {
dataFrame.remove("items");
}

// public static JsonNode jsonArray2Asn1Array (ArrayNode items) {
// ArrayNode newItems = JsonUtils.newNode().arrayNode();
// // transform into a sequence array
// JsonNode sequence = JsonUtils.newNode().set("SEQUENCE", newItems);
// return sequence;
// }

private static JsonNode buildItem(String itemStr) {
JsonNode item = null;
// check to see if it is a itis code or text
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public class TravelerInformation extends Asn1Object {
private String urlB;

@JsonProperty("dataFrames")
private DataFrame[] dataFrames;
private TravelerDataFrame[] dataFrames;

public int getTimeStamp() {
return timeStamp;
Expand All @@ -50,15 +50,15 @@ public void setPacketID(String packetID) {
this.packetID = packetID;
}

public DataFrame[] getDataFrames() {
return dataFrames;
}
public TravelerDataFrame[] getDataFrames() {
return dataFrames;
}

public void setDataFrames(DataFrame[] dataFrames) {
this.dataFrames = dataFrames;
}
public void setDataFrames(TravelerDataFrame[] dataFrames) {
this.dataFrames = dataFrames;
}

public String getMsgCnt() {
public String getMsgCnt() {
return msgCnt;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public static JSONObject createOdeTimData(JSONObject timData) throws XmlUtilsExc

JSONObject metadata = timData.getJSONObject(AppContext.METADATA_STRING);
metadata.put("payloadType", OdeTimPayload.class.getName());
metadata.remove("encodings");
metadata.remove(AppContext.ENCODINGS_STRING);

JSONObject payload = timData.getJSONObject(AppContext.PAYLOAD_STRING);
payload.put(AppContext.DATA_TYPE_STRING, "TravelerInformation");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

Expand All @@ -23,7 +22,6 @@
import us.dot.its.jpo.ode.dds.DdsRequestManager.DdsRequestManagerException;
import us.dot.its.jpo.ode.dds.DdsStatusMessage;
import us.dot.its.jpo.ode.eventlog.EventLogger;
import us.dot.its.jpo.ode.model.Asn1Encoding;
import us.dot.its.jpo.ode.model.Asn1Encoding.EncodingRule;
import us.dot.its.jpo.ode.model.OdeAsdPayload;
import us.dot.its.jpo.ode.model.OdeMsgMetadata;
Expand All @@ -44,6 +42,7 @@

public class Asn1CommandManager {

public static final String ADVISORY_SITUATION_DATA_STRING = "AdvisorySituationData";
private static final Logger logger = LoggerFactory.getLogger(Asn1CommandManager.class);

public static class Asn1CommandManagerException extends Exception {
Expand All @@ -54,6 +53,10 @@ public Asn1CommandManagerException(String string) {
super(string);
}

public Asn1CommandManagerException(String msg, Exception e) {
super(msg, e);
}

}

private String signatureUri;
Expand All @@ -73,14 +76,15 @@ public Asn1CommandManager(OdeProperties odeProperties) {

}

public void depositToDDS(String asdBytes) {
public void depositToDDS(String asdBytes) throws Asn1CommandManagerException {
try {
depositor.deposit(asdBytes);
EventLogger.logger.info("Message Deposited to SDW: {}", asdBytes);
logger.info("Message deposited to SDW: {}", asdBytes);
} catch (DdsRequestManagerException e) {
EventLogger.logger.error("Failed to deposit message to SDW: {}", e);
logger.error("Failed to deposit message to SDW: {}", e);
String msg = "Failed to deposit message to SDW";
EventLogger.logger.error(msg, e);
throw new Asn1CommandManagerException(msg, e);
}
}

Expand Down Expand Up @@ -186,7 +190,7 @@ public String packageSignedTimIntoAsd(ServiceRequest request, String signedMsg)
admDetailsObj.remove("advisoryMessage");
admDetailsObj.put("advisoryMessage", signedMsg);

dataBodyObj.set("AdvisorySituationData", asdObj);
dataBodyObj.set(ADVISORY_SITUATION_DATA_STRING, asdObj);

payload = new OdeAsdPayload(asd);

Expand All @@ -202,19 +206,19 @@ public String packageSignedTimIntoAsd(ServiceRequest request, String signedMsg)

metaObject.set("request", requestObj);

metaObject.set("encodings_placeholder", null);

ArrayNode encodings = buildEncodings();
ObjectNode enc = XmlUtils.createEmbeddedJsonArrayForXmlConversion(AppContext.ENCODING_STRING, encodings);
metaObject.set(AppContext.ENCODINGS_STRING, enc);

ObjectNode message = JsonUtils.newNode();
message.set(AppContext.METADATA_STRING, metaObject);
message.set(AppContext.PAYLOAD_STRING, payloadObj);

ObjectNode root = JsonUtils.newNode();
root.set(AppContext.ODE_ASN1_DATA, message);

outputXml = XmlUtils.toXmlS(root);
outputXml = XmlUtils.toXmlStatic(root);

String encStr = buildEncodings();
outputXml = outputXml.replace("<encodings_placeholder/>", encStr);

// remove the surrounding <ObjectNode></ObjectNode>
outputXml = outputXml.replace("<ObjectNode>", "");
Expand All @@ -229,22 +233,10 @@ public String packageSignedTimIntoAsd(ServiceRequest request, String signedMsg)
return outputXml;
}

private String buildEncodings() throws JsonUtilsException, XmlUtilsException {
public static ArrayNode buildEncodings() throws JsonUtilsException, XmlUtilsException {
ArrayNode encodings = JsonUtils.newArrayNode();
encodings.add(addEncoding("AdvisorySituationData", "AdvisorySituationData", EncodingRule.UPER));
ObjectNode encodingWrap = (ObjectNode) JsonUtils.newNode().set("wrap", encodings);
String encStr = XmlUtils.toXmlS(encodingWrap)
.replace("</wrap><wrap>", "")
.replace("<wrap>", "")
.replace("</wrap>", "")
.replace("<ObjectNode>", "<encodings>")
.replace("</ObjectNode>", "</encodings>");
return encStr;
}

private JsonNode addEncoding(String name, String type, EncodingRule rule) throws JsonUtilsException {
Asn1Encoding mfEnc = new Asn1Encoding(name, type, rule);
return JsonUtils.newNode().set("encodings", JsonUtils.toObjectNode(mfEnc.toJson()));
encodings.add(TimController.buildEncodingNode(ADVISORY_SITUATION_DATA_STRING, ADVISORY_SITUATION_DATA_STRING, EncodingRule.UPER));
return encodings;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.util.HashMap;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -12,6 +13,7 @@
import us.dot.its.jpo.ode.eventlog.EventLogger;
import us.dot.its.jpo.ode.model.OdeAsn1Data;
import us.dot.its.jpo.ode.plugin.ServiceRequest;
import us.dot.its.jpo.ode.services.asn1.Asn1CommandManager.Asn1CommandManagerException;
import us.dot.its.jpo.ode.traveler.TimController;
import us.dot.its.jpo.ode.util.CodecUtils;
import us.dot.its.jpo.ode.util.JsonUtils;
Expand Down Expand Up @@ -64,15 +66,15 @@ public Object process(String consumedData) {
*/
JSONObject metadata = consumedObj.getJSONObject(AppContext.METADATA_STRING);

if (metadata.has(TimController.REQUEST)) {
JSONObject request = metadata.getJSONObject(TimController.REQUEST);
if (metadata.has(TimController.REQUEST_STRING)) {
JSONObject request = metadata.getJSONObject(TimController.REQUEST_STRING);

if (request.has("rsus")) {
Object rsu = request.get("rsus");
if (request.has(TimController.RSUS_STRING)) {
Object rsu = request.get(TimController.RSUS_STRING);
if (!(rsu instanceof JSONArray)) {
JSONArray rsus = new JSONArray();
rsus.put(rsu);
request.put("rsus", rsus);
request.put(TimController.RSUS_STRING, rsus);
}
}

Expand All @@ -93,7 +95,7 @@ public Object process(String consumedData) {
}

public ServiceRequest getServicerequest(JSONObject consumedObj) {
String sr = consumedObj.getJSONObject(AppContext.METADATA_STRING).getJSONObject(TimController.REQUEST).toString();
String sr = consumedObj.getJSONObject(AppContext.METADATA_STRING).getJSONObject(TimController.REQUEST_STRING).toString();
logger.debug("ServiceRequest: {}", sr);

// Convert JSON to POJO
Expand Down Expand Up @@ -127,7 +129,7 @@ public void processEncodedTim(ServiceRequest request, JSONObject consumedObj)
// CASE 3: If SDW in metadata and ASD in body (double encoding complete)
// - send to DDS

if (!dataObj.has("AdvisorySituationData")) {
if (!dataObj.has(Asn1CommandManager.ADVISORY_SITUATION_DATA_STRING)) {
logger.debug("Unsigned message received");
// We don't have ASD, therefore it must be just a MessageFrame that needs to be signed
// No support for unsecured MessageFrame only payload.
Expand Down Expand Up @@ -176,8 +178,12 @@ public void processEncodedTim(ServiceRequest request, JSONObject consumedObj)
logger.debug("Signed message received. Depositing it to SDW.");
// We have a ASD with signed MessageFrame
// Case 3
JSONObject asdObj = dataObj.getJSONObject("AdvisorySituationData");
asn1CommandManager.depositToDDS(asdObj.getString("bytes"));
JSONObject asdObj = dataObj.getJSONObject(Asn1CommandManager.ADVISORY_SITUATION_DATA_STRING);
try {
asn1CommandManager.depositToDDS(asdObj.getString("bytes"));
} catch (JSONException | Asn1CommandManagerException e) {
logger.error("Error on DDS deposit.", e);
}
} else {
logger.debug("Unsigned ASD received. Depositing it to SDW.");
//We have ASD with UNSECURED MessageFrame
Expand All @@ -197,8 +203,8 @@ public void processEncodedTimUnsecured(ServiceRequest request, JSONObject consum

if (null != request.getSdw()) {
JSONObject asdObj = null;
if (dataObj.has("AdvisorySituationData")) {
asdObj = dataObj.getJSONObject("AdvisorySituationData");
if (dataObj.has(Asn1CommandManager.ADVISORY_SITUATION_DATA_STRING)) {
asdObj = dataObj.getJSONObject(Asn1CommandManager.ADVISORY_SITUATION_DATA_STRING);
} else {
logger.error("ASD structure present in metadata but not in JSONObject!");
}
Expand Down
Loading

0 comments on commit cd2cd16

Please sign in to comment.