diff --git a/README.md b/README.md index 3fe5937..e4ce89f 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ Installing the built jar files: * ArcGIS GeoEvent Extension for Server. * ArcGIS GeoEvent Extension SDK. -* Java JDK 1.7 or greater. +* Java JDK 1.8 or greater. * Maven. ## Resources diff --git a/http-handler-for-geoevent.iml b/http-handler-for-geoevent.iml new file mode 100644 index 0000000..45fccf8 --- /dev/null +++ b/http-handler-for-geoevent.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/httpHandler-processor/pom.xml b/httpHandler-processor/pom.xml index 8c0d45f..15596e5 100644 --- a/httpHandler-processor/pom.xml +++ b/httpHandler-processor/pom.xml @@ -4,7 +4,7 @@ com.esri.geoevent.parent httpHandler - 10.5.0 + 11.3.0 com.esri.geoevent.processor httpHandler-processor @@ -14,7 +14,12 @@ org.json json - 20160810 + 20240303 + + + com.fasterxml.jackson.core + jackson-databind + 2.10.0 @@ -22,6 +27,7 @@ org.apache.felix maven-bundle-plugin + 5.1.2 true @@ -30,8 +36,10 @@ ${project.version} com.esri.geoevent.processor.httpHandler - *,!org.son - json + + * + + json,jackson-databind diff --git a/httpHandler-processor/src/main/java/com/esri/geoevent/processor/httpHandler/HttpHandler.java b/httpHandler-processor/src/main/java/com/esri/geoevent/processor/httpHandler/HttpHandler.java index dd9ff2f..697b10a 100644 --- a/httpHandler-processor/src/main/java/com/esri/geoevent/processor/httpHandler/HttpHandler.java +++ b/httpHandler-processor/src/main/java/com/esri/geoevent/processor/httpHandler/HttpHandler.java @@ -20,6 +20,7 @@ Redlands, California, USA 92373 email: contracts@esri.com + clean install -Dcontact.address=[hjose@img.com.br] */ package com.esri.geoevent.processor.httpHandler; @@ -48,7 +49,7 @@ import org.apache.http.StatusLine; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.util.EntityUtils; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.json.JSONObject; import org.json.XML; @@ -344,7 +345,64 @@ else if(tempPostBodyParts[i].equals("$currentDateTime")) { LOGGER.debug("New PostBody " + newPostBody); } - + String[] processedHeaders = new String[headers.length]; //To get params from header + List fdl = gd.getFieldDefinitions(); + for (int i = 0; i < headers.length; i++) + { + String[] nameValue = headers[i].split(":"); //To get params from header name if needed + // Process header name + String[] nameParts = nameValue[0].split("[{*}]"); + String processedName = ""; + for (String part : nameParts) + { + + if (part != null && !part.isEmpty()) { + Integer idx = gd.getIndexOf(part); + if (idx >= 0) + { + Field field = geoevent.getField(new FieldExpression(part)); + if (field != null) + { + part = field.getValue().toString(); + } + } + } + processedName += part; + } + + // Process header value + String processedValue = ""; //To get params from header values if needed + if (nameValue.length > 1) // To avoid ArrayIndexOutOfBoundsException + { + String[] valueParts = nameValue[1].split("[{*}]"); + for (String part : valueParts) + { + if (part != null && !part.isEmpty()) { + Integer idx = gd.getIndexOf(part); + if (idx >= 0) + { + Field field = geoevent.getField(new FieldExpression(part)); + if (field != null) + { + part = field.getValue().toString(); + } + } + } + processedValue += part; + } + } + else + { + LOGGER.error("Invalid header format for: " + headers[i]); + } + + // Store the processed header + processedHeaders[i] = processedName + ":" + processedValue; + } + + // Set processed headers for use in getFeed + headers = processedHeaders; + LOGGER.info("headers: \n" + headers.toString()); HttpRequester httpRequester = new HttpRequester(newURL, newPostBody); executor.execute(httpRequester); @@ -501,7 +559,7 @@ private String csvToJson(String responseBody) { for (Integer i = 0; i < values.length; i++) { - if (NumberUtils.isNumber(values[i])) + if (NumberUtils.isCreatable(values[i])) { json += "\"field" + i.toString() + "\":" + values[i]; } @@ -556,7 +614,7 @@ private String csvToJson(String responseBody) { FieldDefinition fd = fds.get(i); String fieldName = fd.getName(); - if (NumberUtils.isNumber(values[i])) + if (NumberUtils.isCreatable(values[i])) { json += "\"" + fieldName + "\":" + values[i]; } diff --git a/httpHandler-processor/src/main/java/com/esri/geoevent/processor/httpHandler/HttpHandlerAdapter.java b/httpHandler-processor/src/main/java/com/esri/geoevent/processor/httpHandler/HttpHandlerAdapter.java index 257091d..0926372 100644 --- a/httpHandler-processor/src/main/java/com/esri/geoevent/processor/httpHandler/HttpHandlerAdapter.java +++ b/httpHandler-processor/src/main/java/com/esri/geoevent/processor/httpHandler/HttpHandlerAdapter.java @@ -34,15 +34,17 @@ import java.util.Iterator; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.List; + +import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.core.JsonLocation; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.databind.ObjectMapper; -import org.codehaus.jackson.JsonFactory; -import org.codehaus.jackson.JsonLocation; -import org.codehaus.jackson.JsonNode; -import org.codehaus.jackson.JsonParseException; -import org.codehaus.jackson.JsonParser; -import org.codehaus.jackson.JsonProcessingException; -import org.codehaus.jackson.JsonToken; -import org.codehaus.jackson.map.ObjectMapper; import com.esri.ges.adapter.AdapterDefinition; import com.esri.ges.adapter.InboundAdapterBase; @@ -217,7 +219,7 @@ public void receive(String json) { String jsonStrings = StringUtil.removeUTF8BOM(stringBuilder.toString()); - ArrayList objectStrings = parseToIndividualObjects(jsonStrings); + List objectStrings = parseToIndividualObjects(jsonStrings); for (String jsonString : objectStrings) { remainingString = jsonString; @@ -240,64 +242,60 @@ public void receive(String json) LOGGER.error("PARSE_ERROR"); LOGGER.info(ex.getMessage(), ex); } + catch (Exception ex) + { + LOGGER.debug(ex.getMessage(), ex); + } } - private ArrayList parseToIndividualObjects(String inputString) throws JsonProcessingException, IOException + private List parseToIndividualObjects(String inputString) throws JsonProcessingException, IOException { - ArrayList results = new ArrayList<>(); - JsonParser parser = new JsonFactory().createJsonParser(inputString); - LOGGER.debug("At the very beginning, the current location is " + parser.getCurrentLocation().getCharOffset()); - // JsonNode tree = parser.readValueAsTree(); - int depth = 0; - int start = 0; - JsonToken currentToken = null; - while (true) - { - try - { - currentToken = parser.nextToken(); - } - catch (JsonParseException ex) - { - String leftovers = inputString.substring(start); - LOGGER.debug("Leftovers = " + leftovers); - results.add(leftovers); - currentToken = null; - } - if (currentToken == null) - break; - if (currentToken == JsonToken.START_OBJECT || currentToken == JsonToken.START_ARRAY) - { - if (depth == 0) - { - LOGGER.debug("At the start of an object, the current location is " + parser.getCurrentLocation().getCharOffset()); - start = (int) parser.getCurrentLocation().getCharOffset(); - } - depth++; - } - else if (currentToken == JsonToken.END_OBJECT || currentToken == JsonToken.END_ARRAY) - { - depth--; - if (depth == 0) - { - // we have a complete object - LOGGER.debug("At the end of an object, the current location is " + parser.getCurrentLocation().getCharOffset()); - int end = (int) parser.getCurrentLocation().getCharOffset() + 1; - String jsonObjectString = inputString.substring(start, end); - start = end; - LOGGER.debug("jsonObject = " + jsonObjectString); - results.add(jsonObjectString); - } + List results = new ArrayList<>(); + JsonFactory factory = new JsonFactory(); + ObjectMapper mapper = new ObjectMapper(factory); + + try (JsonParser parser = factory.createParser(inputString)) { + int depth = 0; + int start = 0; + JsonToken currentToken; + + while ((currentToken = parser.nextToken()) != null) { + if (currentToken.isStructStart()) { + if (depth == 0) { + start = (int) parser.getTokenLocation().getCharOffset(); + } + depth++; + } else if (currentToken.isStructEnd()) { + depth--; + if (depth == 0) { + int end = (int) parser.getTokenLocation().getCharOffset() + 1; + String jsonObjectString = inputString.substring(start, end); + results.add(jsonObjectString); + start = end; + } + } + } + + // If there is leftover JSON after parsing, add it to the results + if (depth > 0) { + String leftovers = inputString.substring(start); + results.add(leftovers); + } + } catch (JsonProcessingException e) { + throw new IOException("Error processing JSON", e); } - } - return results; + + return results; + } public static void main(String[] args) throws JsonParseException, IOException { String test = "{\"name\":\"ryan\"}{\"name\":\"ric"; - JsonParser outerParser = new JsonFactory().createJsonParser(test); - ObjectMapper mapper = new ObjectMapper(); + JsonFactory factory = new JsonFactory(); + ObjectMapper mapper = new ObjectMapper(factory); + JsonParser outerParser = factory.createParser(test); + Iterator itr = mapper.readValues(outerParser, JsonNode.class); while (itr.hasNext()) { diff --git a/httpHandler-processor/src/main/java/com/esri/geoevent/processor/httpHandler/HttpHandlerDefinition.java b/httpHandler-processor/src/main/java/com/esri/geoevent/processor/httpHandler/HttpHandlerDefinition.java index 9835af4..aef2f2d 100644 --- a/httpHandler-processor/src/main/java/com/esri/geoevent/processor/httpHandler/HttpHandlerDefinition.java +++ b/httpHandler-processor/src/main/java/com/esri/geoevent/processor/httpHandler/HttpHandlerDefinition.java @@ -70,7 +70,7 @@ public HttpHandlerDefinition() propertyDefinitions.put("NewGeoEventDefinitionName", new PropertyDefinition("NewGeoEventDefinitionName", PropertyType.String, "NewGeoEventDefinition", "New GeoEvent Definition Name", "New GeoEvent Definition Name", "CreateGeoEventDefinition=true", false, false)); propertyDefinitions.put("ExistingGeoEventDefinitionName", new PropertyDefinition("ExistingGeoEventDefinitionName", PropertyType.String, "ExistingGeoEventDefinition", "Existing GeoEvent Definition Name", "Existing GeoEvent Definition Name", "CreateGeoEventDefinition=false", false, false)); - propertyDefinitions.put("headers", new PropertyDefinition("headers", PropertyType.String, "", "Headers", "HTTP headers name:value with | separator", false, false)); + propertyDefinitions.put("headers", new PropertyDefinition("headers", PropertyType.String, "", "Headers", "HTTP headers name:value with | separator (params after :{field})", false, false)); propertyDefinitions.put("body", new PropertyDefinition("body", PropertyType.String, "", "Body", "HTTP body", "httpMethod=POST,httpMethod=PUT", false, false)); propertyDefinitions.put("TrackIdField", new PropertyDefinition("TrackIdField", PropertyType.String, "", "TrackId Field", "TrackId Field", false, false)); @@ -109,13 +109,14 @@ public String getDomain() @Override public String getVersion() { - return "10.5.0"; + return "11.3.0"; } @Override public String getLabel() { - return "${com.esri.geoevent.processor.httpHandler-processor.PROCESSOR_LABEL}"; + return "Http Handlerv2"; + //return "${com.esri.geoevent.processor.httpHandler-processor.PROCESSOR_LABEL}"; } @Override diff --git a/httpHandler-processor/src/main/java/com/esri/geoevent/processor/httpHandler/JsonInboundParser.java b/httpHandler-processor/src/main/java/com/esri/geoevent/processor/httpHandler/JsonInboundParser.java index a7167da..c8b18d3 100644 --- a/httpHandler-processor/src/main/java/com/esri/geoevent/processor/httpHandler/JsonInboundParser.java +++ b/httpHandler-processor/src/main/java/com/esri/geoevent/processor/httpHandler/JsonInboundParser.java @@ -34,8 +34,8 @@ import java.util.List; import java.util.regex.Pattern; -import org.codehaus.jackson.JsonNode; -import org.codehaus.jackson.node.NullNode; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.NullNode; import com.esri.core.geometry.Line; import com.esri.core.geometry.MapGeometry; @@ -117,7 +117,7 @@ public void findNodes(JsonNode tree, String nodeName, GeoEventProducer geoEventP { if (tree.isArray()) { - Iterator elements = tree.getElements(); + Iterator elements = tree.elements(); while (elements.hasNext()) { JsonNode element = elements.next(); @@ -148,7 +148,7 @@ else if (tree.has(nodeName)) } else { - Iterator elements = tree.getElements(); + Iterator elements = tree.elements(); while (elements.hasNext()) { JsonNode element = elements.next(); @@ -375,7 +375,7 @@ private void populateGeoEvent(FieldGroup event, JsonNode node, List fieldNames = node.getFieldNames(); fieldNames != null && fieldNames.hasNext();) + for (Iterator fieldNames = node.fieldNames(); fieldNames != null && fieldNames.hasNext();) { String fieldName = null; try @@ -398,7 +398,7 @@ private void populateGeoEvent(FieldGroup event, JsonNode node, List results = new ArrayList(); - for (Iterator arrayElements = n.getElements(); arrayElements.hasNext();) + for (Iterator arrayElements = n.elements(); arrayElements.hasNext();) results.add(convert(event, fd, arrayElements.next())); event.setField(fieldName, results); } @@ -424,11 +424,11 @@ private Object getJsonNodeValue(JsonNode node) if (node.isValueNode()) { if (node.isNumber()) - return node.getNumberValue(); + return node.numberValue(); if (node.isTextual()) - return node.getTextValue(); + return node.textValue(); if (node.isBoolean()) - return node.getBooleanValue(); + return node.booleanValue(); } else if (node.isObject()) return node.toString(); @@ -524,7 +524,7 @@ private List generateFieldDefinitions(JsonNode attributes, List List fieldDefinitions = workingList; if (fieldDefinitions == null) fieldDefinitions = new ArrayList(); - Iterator fieldNames = attributes.getFieldNames(); + Iterator fieldNames = attributes.fieldNames(); while (fieldNames.hasNext()) { String fieldName = fieldNames.next(); @@ -540,7 +540,7 @@ private List generateFieldDefinitions(JsonNode attributes, List if (field.isArray()) { cardinality = FieldCardinality.Many; - arrayElements = field.getElements(); + arrayElements = field.elements(); if (arrayElements.hasNext()) field = arrayElements.next(); else diff --git a/httpHandler-processor/src/main/resources/com/esri/geoevent/processor/httpHandler-processor.properties b/httpHandler-processor/src/main/resources/com/esri/geoevent/processor/httpHandler-processor.properties index cb4f446..8a0003c 100644 --- a/httpHandler-processor/src/main/resources/com/esri/geoevent/processor/httpHandler-processor.properties +++ b/httpHandler-processor/src/main/resources/com/esri/geoevent/processor/httpHandler-processor.properties @@ -1,5 +1,5 @@ # Processor Definition -PROCESSOR_LABEL=Http Handler +PROCESSOR_LABEL=Http Handlerv2 PROCESSOR_DESC=Sending HTTP request using the URL composed from fields of the incoming GeoEvent. # Log Messages diff --git a/pom.xml b/pom.xml index cb7b455..45ca740 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.esri.geoevent.parent httpHandler - 10.5.0 + 11.3.0 pom Esri :: GeoEvent :: HttpHandler @@ -13,9 +13,9 @@ geoevent@esri.com UTF-8 - 2.3.6 + 5.1.2 4.8.1 - 1.9.5 + 2.10.0 @@ -35,6 +35,11 @@ ${junit.version} test + + com.fasterxml.jackson.core + jackson-databind + 2.0.0 + @@ -49,10 +54,10 @@ org.apache.maven.plugins maven-compiler-plugin - 2.5.1 + - 1.7 - 1.7 + 8 + 8