Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
a2919fb
Merge remote-tracking branch 'origin/main' into release/v2.0
dmccoystephenson Apr 8, 2025
013c8ed
Merge branch 'dev' into release/v2.0
dmccoystephenson Apr 8, 2025
690acca
Merge branch 'main' into release/v2.0
dmccoystephenson Apr 8, 2025
f435655
Merge branch 'dev' into release/v2.0
dmccoystephenson Apr 9, 2025
d64bb9f
Added warn log statement for when 'itis' or 'text' not found in item …
dmccoystephenson Apr 9, 2025
6f3fba5
Added another warn log statement for when 'itis' or 'text' not found …
dmccoystephenson Apr 9, 2025
e0c5c74
Set default frameType to 'advisory' when missing in JSON.
dmccoystephenson Apr 9, 2025
4921818
Replaced usages of `System.out` with slf4j logging in JsonToJavaConve…
dmccoystephenson Apr 9, 2025
8c912f4
Refactor: remove unused conversion methods and imports
dmccoystephenson Apr 9, 2025
bdb6408
Make ObjectMapper instance final in JsonToJavaConverter
dmccoystephenson Apr 9, 2025
a9aa1ec
Refactor TIM test data handling with external JSON file
dmccoystephenson Apr 9, 2025
13adeb1
Set ACM_LOG_LEVEL via environment variable for local deployment
dmccoystephenson Apr 9, 2025
ed575b4
Merge remote-tracking branch 'origin/dev' into pr/addressing-comments…
dmccoystephenson Apr 10, 2025
9a5970f
Merge remote-tracking branch 'origin/dev' into release/v2.0
dmccoystephenson Apr 10, 2025
98992ab
Merge branch 'release/v2.0' into pr/addressing-comments-for-release-2.0
dmccoystephenson Apr 10, 2025
a035a84
Merge pull request #52 from Trihydro/pr/addressing-comments-for-relea…
payneBrandon Apr 18, 2025
23f789f
Merge pull request #49 from Trihydro/release/v2.0
dmccoystephenson Apr 22, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import java.util.List;
import java.util.Map;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import com.fasterxml.jackson.core.JsonProcessingException;
Expand All @@ -29,8 +30,6 @@
import us.dot.its.jpo.ode.plugin.SNMP;
import us.dot.its.jpo.ode.plugin.ServiceRequest;
import us.dot.its.jpo.ode.plugin.SnmpProtocol;
import us.dot.its.jpo.ode.plugin.j2735.J2735SpecialVehicleExtensions;
import us.dot.its.jpo.ode.plugin.j2735.J2735SupplementalVehicleExtensions;
import us.dot.its.jpo.ode.plugin.j2735.OdePosition3D;
import us.dot.its.jpo.ode.plugin.j2735.OdeTravelerInformationMessage;
import us.dot.its.jpo.ode.plugin.j2735.OdeTravelerInformationMessage.DataFrame.Region;
Expand All @@ -40,45 +39,15 @@
import us.dot.its.jpo.ode.util.JsonUtils;

@Component
@Slf4j
public class JsonToJavaConverter {

private ObjectMapper mapper = new ObjectMapper();
private final ObjectMapper mapper = new ObjectMapper();

public JsonToJavaConverter() {
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}

public J2735SpecialVehicleExtensions convertJ2735SpecialVehicleExtensionsJsonToJava(String value, int i) {

JsonNode part2Node = getPart2Node(value, i);
J2735SpecialVehicleExtensions spve = null;
try {
spve = mapper.treeToValue(part2Node, J2735SpecialVehicleExtensions.class);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return spve;
}

public J2735SupplementalVehicleExtensions convertJ2735SupplementalVehicleExtensionsJsonToJava(String value, int i) {

JsonNode part2Node = getPart2Node(value, i);
J2735SupplementalVehicleExtensions suve = null;
try {
suve = mapper.treeToValue(part2Node, J2735SupplementalVehicleExtensions.class);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return suve;
}

public JsonNode getPart2Node(String value, int i) {
JsonNode part2 = JsonUtils.getJsonNode(value, "payload").get("data").get("partII");
if (part2 != null)
return part2.get(i).get("value");
return null;
}

public OdeLogMetadata convertTimMetadataJsonToJava(String value) {

OdeLogMetadata odeTimMetadata = null;
Expand All @@ -95,13 +64,12 @@ public OdeLogMetadata convertTimMetadataJsonToJava(String value) {
((ObjectNode) metaDataNode).replace("receivedMessageDetails", receivedMessageDetailsNode);
}
}
// System.out.println(metaDataNode);
log.trace("MetaDataNode: {}", metaDataNode);
odeTimMetadata = mapper.treeToValue(metaDataNode, OdeLogMetadata.class);
} catch (IOException e) {
System.out.println("IOException");
System.out.println(e.getStackTrace());
log.error("An IOException occurred while converting TIM metadata JSON to Java", e);
} catch (NullPointerException e) {
System.out.println(e.getMessage());
log.error("A NullPointerException occurred while converting TIM metadata JSON to Java: {}", e.getMessage());
}

return odeTimMetadata;
Expand Down Expand Up @@ -166,10 +134,10 @@ public OdeRequestMsgMetadata convertBroadcastTimMetadataJsonToJava(String value)
}

} catch (IOException e) {
System.out.println("IOException");
System.out.println(e.getStackTrace());
log.error("An IOException occurred while converting Broadcast TIM metadata JSON to Java", e);
} catch (NullPointerException e) {
System.out.println(e.getMessage());
log.error("A NullPointerException occurred while converting Broadcast TIM metadata JSON to Java: {}",
e.getMessage());
}
return odeTimMetadata;
}
Expand Down Expand Up @@ -359,7 +327,7 @@ else if (sequenceArrNode.get("item").get("text") != null)
regions.add(region);
}
} else {
System.out.println("warning: geographicalPathNode is not an object or an array");
log.warn("geographicalPathNode is not an object or an array");
}

dataFrame.setRegions(regions.toArray(new OdeTravelerInformationMessage.DataFrame.Region[regions.size()]));
Expand All @@ -369,9 +337,9 @@ else if (sequenceArrNode.get("item").get("text") != null)
odeTimPayload = new OdeTimPayload();
odeTimPayload.setData(tim);
} catch (IOException e) {
System.out.println(e.getStackTrace());
log.error("An IOException occurred while converting TIM JSON to Java", e);
} catch (NullPointerException e) {
System.out.println(e.getMessage());
log.error("A NullPointerException occurred while converting TIM JSON to Java: {}", e.getMessage());
}

return odeTimPayload;
Expand Down Expand Up @@ -523,21 +491,28 @@ public OdeTimPayload convertTmcTimTopicJsonToJava(String value) {
String item = null;
if (sequenceArrNode != null && sequenceArrNode.isArray()) {
for (final JsonNode objNode : sequenceArrNode) {
if (objNode.get("item").get("itis") != null)
if (objNode.get("item").get("itis") != null) {
item = mapper.treeToValue(objNode.get("item").get("itis"), String.class);
else if (objNode.get("item").get("text") != null)
} else if (objNode.get("item").get("text") != null) {
item = mapper.treeToValue(objNode.get("item").get("text"), String.class);
if (!itemsList.contains(item))
} else {
log.warn("'itis' or 'text' not found in item when converting TMC TIM");
}
if (!itemsList.contains(item)) {
itemsList.add(item);
}
}
}

// ADD NON ARRAY ELEMENT
if (sequenceArrNode != null && !sequenceArrNode.isArray()) {
if (sequenceArrNode.get("item").get("itis") != null)
if (sequenceArrNode.get("item").get("itis") != null) {
item = mapper.treeToValue(sequenceArrNode.get("item").get("itis"), String.class);
else if (sequenceArrNode.get("item").get("text") != null)
} else if (sequenceArrNode.get("item").get("text") != null) {
item = mapper.treeToValue(sequenceArrNode.get("item").get("text"), String.class);
} else {
log.warn("'itis' or 'text' not found in item when converting TMC TIM");
}

itemsList.add(item);
}
Expand All @@ -547,6 +522,9 @@ else if (sequenceArrNode.get("item").get("text") != null)
if (frameTypeNode != null && frameTypeNode.fieldNames().hasNext()) {
TravelerInfoType frameType = TravelerInfoType.valueOf(frameTypeNode.fieldNames().next());
dataFrame.setFrameType(frameType);
} else {
log.warn("frameType not found in TravelerDataFrame when converting TMC TIM. Defaulting to 'advisory'");
dataFrame.setFrameType(TravelerInfoType.advisory);
}

JsonNode startTimeNode = travelerDataFrame.get("startTime");
Expand Down Expand Up @@ -576,7 +554,7 @@ else if (sequenceArrNode.get("item").get("text") != null)
regions.add(region);
}
} else {
System.out.println("warning: geographicalPathNode is not an object or an array");
log.warn("geographicalPathNode is not an object or an array");
}

dataFrame.setRegions(regions.toArray(OdeTravelerInformationMessage.DataFrame.Region[]::new));
Expand All @@ -587,9 +565,9 @@ else if (sequenceArrNode.get("item").get("text") != null)
odeTimPayload = new OdeTimPayload();
odeTimPayload.setData(tim);
} catch (IOException e) {
System.out.println(e.getStackTrace());
log.error("An IOException occurred while converting TMC TIM JSON to Java", e);
} catch (NullPointerException e) {
System.out.println(e.getMessage());
log.error("A NullPointerException occurred while converting TMC TIM JSON to Java: {}", e.getMessage());
}

return odeTimPayload;
Expand All @@ -603,9 +581,9 @@ public OdeTravelerInformationMessage convertBroadcastTimPayloadJsonToJava(String
JsonNode timNode = JsonUtils.getJsonNode(value, "payload").get("data");
odeTim = mapper.treeToValue(timNode, OdeTravelerInformationMessage.class);
} catch (IOException e) {
System.out.println(e.getStackTrace());
log.error("An IOException occurred while converting Broadcast TIM JSON to Java", e);
} catch (NullPointerException e) {
System.out.println(e.getMessage());
log.error("A NullPointerException occurred while converting Broadcast TIM JSON to Java: {}", e.getMessage());
}

return odeTim;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,11 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import java.io.IOException;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
Expand Down Expand Up @@ -142,14 +146,14 @@ private List<ActiveTim> getActiveTims(boolean isSat) {
return activeTims;
}

private OdeTravelerInformationMessage getMockOdeTravelerInformationMessage() {
String timJson = "{\"msgCnt\":\"1\",\"timeStamp\":\"2017-08-03T22:25:36.297Z\",\"urlB\":\"null\",\"packetID\":\"EC9C236B0000000000\",\"dataframes\":[{\"startDateTime\":\"2017-08-02T22:25:00.000Z\",\"durationTime\":1,\"doNotUse1\":\"0\",\"frameType\":\"advisory\",\"msgId\":{\"roadSignID\":{\"position\":{\"latitude\":\"41.678473\",\"longitude\":\"-108.782775\",\"elevation\":\"917.1432\"},\"viewAngle\":\"1010101010101010\",\"mutcdCode\":\"warning\",\"crc\":\"0000\"}},\"priority\":\"0\",\"doNotUse2\":\"3\",\"regions\":[{\"name\":\"Testing TIM\",\"regulatorID\":\"0\",\"segmentID\":\"33\",\"anchorPosition\":{\"latitude\":\"41.2500807\",\"longitude\":\"-111.0093847\",\"elevation\":\"2020.6969900289998\"},\"laneWidth\":\"7\",\"directionality\":\"3\",\"closedPath\":\"false\",\"description\":\"path\",\"path\":{\"scale\":\"0\",\"type\":\"ll\",\"nodes\":[{\"nodeLong\":\"0.0030982\",\"nodeLat\":\"0.0014562\",\"delta\":\"node-LL3\"},{\"nodeLong\":\"-111.0093847\",\"nodeLat\":\"41.2500807\",\"delta\":\"node-LatLon\"}]},\"direction\":\"0000000000001010\"}],\"doNotUse4\":\"2\",\"doNotUse3\":\"3\",\"content\":\"Advisory\",\"items\":[\"125\",\"some text\",\"250\",\"'98765\"],\"url\":\"null\"}]}";
private OdeTravelerInformationMessage getMockOdeTravelerInformationMessage() throws IOException {
String timJson =
new String(Files.readAllBytes(Paths.get("src/test/resources/com/trihydro/library/service/mockOdeTravelerInformationMessage.json")));
Gson gson = new Gson();
OdeTravelerInformationMessage mockOdeTravelerInformationMessage = gson.fromJson(timJson, OdeTravelerInformationMessage.class);
return mockOdeTravelerInformationMessage;
return gson.fromJson(timJson, OdeTravelerInformationMessage.class);
}

private WydotOdeTravelerInformationMessage getMockWydotOdeTravelerInformationMessage() {
private WydotOdeTravelerInformationMessage getMockWydotOdeTravelerInformationMessage() throws IOException {
OdeTravelerInformationMessage mockOdeTravelerInformationMessage = getMockOdeTravelerInformationMessage();
WydotOdeTravelerInformationMessage mockWydotOdeTravelerInformationMessage = new WydotOdeTravelerInformationMessage();
mockWydotOdeTravelerInformationMessage.setMsgCnt(mockOdeTravelerInformationMessage.getMsgCnt());
Expand Down Expand Up @@ -191,7 +195,7 @@ private WydotTim getMockWydotTim() {
return wydotTim;
}

private WydotTravelerInputData getMockWydotTravelerInputDataWithServiceRequest() {
private WydotTravelerInputData getMockWydotTravelerInputDataWithServiceRequest() throws IOException {
WydotTravelerInputData wydotTravelerInputData = new WydotTravelerInputData();
wydotTravelerInputData.setTim(getMockOdeTravelerInformationMessage());
ServiceRequest serviceRequest = new ServiceRequest();
Expand Down Expand Up @@ -379,7 +383,7 @@ public void getAllMilepostsForTim_EndPointNull() {
}

@Test
public void sendTimToSDW_MultipleActiveSatTimsFound() {
public void sendTimToSDW_MultipleActiveSatTimsFound() throws IOException {
// Arrange
List<ActiveTim> activeSatTims = getActiveTims(true);
when(mockActiveTimService.getActiveTimsByClientIdDirection(any(), any(), any())).thenReturn(activeSatTims);
Expand All @@ -403,7 +407,7 @@ public void sendTimToSDW_MultipleActiveSatTimsFound() {
}

@Test
public void sendTimToSDW_NoActiveSatTimsFound() {
public void sendTimToSDW_NoActiveSatTimsFound() throws IOException {
// Arrange
when(mockActiveTimService.getActiveTimsByClientIdDirection(any(), any(), any())).thenReturn(new ArrayList<>());
WydotTim wydotTim = getMockWydotTim();
Expand All @@ -424,7 +428,7 @@ public void sendTimToSDW_NoActiveSatTimsFound() {
}

@Test
public void sendTimToSDW_SingleActiveSatTimFound() {
public void sendTimToSDW_SingleActiveSatTimFound() throws IOException {
// Arrange
List<ActiveTim> activeSatTims = getActiveTims(true).subList(0, 1);
when(mockActiveTimService.getActiveTimsByClientIdDirection(any(), any(), any())).thenReturn(activeSatTims);
Expand All @@ -448,7 +452,7 @@ public void sendTimToSDW_SingleActiveSatTimFound() {
}

@Test
public void sendTimToRsus_NoRsusFound() {
public void sendTimToRsus_NoRsusFound() throws IOException {
// Arrange
when(mockRsuService.getRsusByLatLong(any(), any(), any(), any())).thenReturn(new ArrayList<>());

Expand All @@ -468,7 +472,7 @@ public void sendTimToRsus_NoRsusFound() {
}

@Test
public void sendTimToRsus_RsusFound_NoActiveTIMs() {
public void sendTimToRsus_RsusFound_NoActiveTIMs() throws IOException {
// Arrange
List<WydotRsu> rsus = new ArrayList<>();
WydotRsu rsu = new WydotRsu();
Expand Down Expand Up @@ -499,7 +503,7 @@ public void sendTimToRsus_RsusFound_NoActiveTIMs() {
}

@Test
public void sendTimToRsus_RsusFound_ActiveTIMsExist() {
public void sendTimToRsus_RsusFound_ActiveTIMsExist() throws IOException {
// Arrange
List<WydotRsu> rsus = new ArrayList<>();
WydotRsu rsu = new WydotRsu();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
{
"msgCnt": "1",
"timeStamp": "2017-08-03T22:25:36.297Z",
"urlB": "null",
"packetID": "EC9C236B0000000000",
"dataframes": [
{
"startDateTime": "2017-08-02T22:25:00.000Z",
"durationTime": 1,
"doNotUse1": "0",
"frameType": "advisory",
"msgId": {
"roadSignID": {
"position": {
"latitude": "41.678473",
"longitude": "-108.782775",
"elevation": "917.1432"
},
"viewAngle": "1010101010101010",
"mutcdCode": "warning",
"crc": "0000"
}
},
"priority": "0",
"doNotUse2": "3",
"regions": [
{
"name": "Testing TIM",
"regulatorID": "0",
"segmentID": "33",
"anchorPosition": {
"latitude": "41.2500807",
"longitude": "-111.0093847",
"elevation": "2020.6969900289998"
},
"laneWidth": "7",
"directionality": "3",
"closedPath": "false",
"description": "path",
"path": {
"scale": "0",
"type": "ll",
"nodes": [
{
"nodeLong": "0.0030982",
"nodeLat": "0.0014562",
"delta": "node-LL3"
},
{
"nodeLong": "-111.0093847",
"nodeLat": "41.2500807",
"delta": "node-LatLon"
}
]
},
"direction": "0000000000001010"
}
],
"doNotUse4": "2",
"doNotUse3": "3",
"content": "Advisory",
"items": [
"125",
"some text",
"250",
"'98765"
],
"url": "null"
}
]
}
4 changes: 2 additions & 2 deletions local-deployment/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ services:
ACM_CONFIG_FILE: adm.properties
ACM_LOG_TO_CONSOLE: "true"
ACM_LOG_TO_FILE: "false"
ACM_LOG_LEVEL: ERROR
ACM_LOG_LEVEL: ${ACM_LOG_LEVEL}
depends_on:
- kafka
volumes:
Expand All @@ -109,7 +109,7 @@ services:
ACM_CONFIG_FILE: aem.properties
ACM_LOG_TO_CONSOLE: "true"
ACM_LOG_TO_FILE: "false"
ACM_LOG_LEVEL: ERROR
ACM_LOG_LEVEL: ${ACM_LOG_LEVEL}
depends_on:
- kafka
volumes:
Expand Down
5 changes: 4 additions & 1 deletion local-deployment/sample.env
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,7 @@ LOGGING_LEVEL_COM_TRIHYDRO=DEBUG
REFRESH_CRON_EXPRESSION="0 0 1 * * *"

# URI for the Neo4j database (which is not included in the local deployment)
NEO4J_URI=bolt://${DOCKER_HOST_IP}:6687
NEO4J_URI=bolt://${DOCKER_HOST_IP}:6687

# log level of asn1_codec instances
ACM_LOG_LEVEL=ERROR
Loading