METRON-1430: Isolate jackson from being used as arguments or returns from 
JSONUtils closes apache/metron#910


Project: http://git-wip-us.apache.org/repos/asf/metron/repo
Commit: http://git-wip-us.apache.org/repos/asf/metron/commit/878003a3
Tree: http://git-wip-us.apache.org/repos/asf/metron/tree/878003a3
Diff: http://git-wip-us.apache.org/repos/asf/metron/diff/878003a3

Branch: refs/heads/feature/METRON-1344-test-infrastructure
Commit: 878003a3caf55380bd9e5898a9abe848586a278b
Parents: 92c2e22
Author: cstella <ceste...@gmail.com>
Authored: Fri Jan 26 15:43:35 2018 -0500
Committer: cstella <ceste...@gmail.com>
Committed: Fri Jan 26 15:43:35 2018 -0500

----------------------------------------------------------------------
 .../metron/maas/functions/MaaSFunctions.java    |  4 +-
 .../common/configuration/Configurations.java    |  4 +-
 .../configuration/ConfigurationsUtils.java      |  5 +-
 .../GlobalConfigurationOperations.java          |  4 +-
 .../IndexingConfigurationOperations.java        |  4 +-
 .../configuration/IndexingConfigurations.java   |  4 +-
 .../apache/metron/common/utils/JSONUtils.java   | 60 ++++++++++++++++----
 .../apache/metron/common/utils/KafkaUtils.java  |  5 +-
 .../configuration/StellarEnrichmentTest.java    |  4 +-
 .../metron/common/utils/JSONUtilsTest.java      | 14 ++---
 .../ZKConfigurationsCacheIntegrationTest.java   | 10 ++--
 .../TransformFilterExtractorDecorator.java      |  4 +-
 .../nonbulk/geo/GeoEnrichmentLoader.java        |  4 +-
 .../bulk/ElasticsearchImportExport.java         |  4 +-
 .../ElasticsearchSearchIntegrationTest.java     |  6 ++
 .../ElasticsearchUpdateIntegrationTest.java     |  7 +--
 .../components/ElasticSearchComponent.java      |  4 +-
 .../enrichment/cli/LatencySummarizer.java       |  3 +-
 .../integration/EnrichmentIntegrationTest.java  |  6 +-
 .../apache/metron/indexing/dao/HBaseDao.java    |  3 +-
 .../apache/metron/indexing/dao/IndexDao.java    | 13 ++++-
 .../metron/indexing/dao/update/Document.java    |  4 +-
 .../apache/metron/indexing/dao/InMemoryDao.java |  3 +-
 .../indexing/dao/SearchIntegrationTest.java     |  6 +-
 .../HDFSIndexingIntegrationTest.java            |  4 +-
 .../integration/IndexingIntegrationTest.java    |  3 +-
 .../apache/metron/parsers/bolt/ParserBolt.java  |  4 +-
 .../metron/parsers/json/JSONMapParser.java      |  4 +-
 .../parsers/topology/ParserTopologyCLI.java     |  4 +-
 .../parsers/topology/config/ConfigHandlers.java |  4 +-
 .../parsers/integration/ParserDriver.java       |  4 +-
 .../integration/WriterBoltIntegrationTest.java  |  3 +-
 .../common/benchmark/StellarMicrobenchmark.java |  4 +-
 .../common/configuration/ConfigurationType.java |  4 +-
 .../shell/DefaultStellarShellExecutor.java      |  5 +-
 .../stellar/common/shell/cli/StellarShell.java  |  3 +-
 .../metron/stellar/common/utils/JSONUtils.java  | 43 ++++++++++++--
 .../stellar/dsl/functions/StringFunctions.java  | 27 +++++----
 .../stellar/common/utils/JSONUtilsTest.java     |  4 +-
 .../dsl/functions/StringFunctionsTest.java      | 11 ++--
 40 files changed, 169 insertions(+), 147 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-analytics/metron-maas-common/src/main/java/org/apache/metron/maas/functions/MaaSFunctions.java
----------------------------------------------------------------------
diff --git 
a/metron-analytics/metron-maas-common/src/main/java/org/apache/metron/maas/functions/MaaSFunctions.java
 
b/metron-analytics/metron-maas-common/src/main/java/org/apache/metron/maas/functions/MaaSFunctions.java
index eacb64d..a260f25 100644
--- 
a/metron-analytics/metron-maas-common/src/main/java/org/apache/metron/maas/functions/MaaSFunctions.java
+++ 
b/metron-analytics/metron-maas-common/src/main/java/org/apache/metron/maas/functions/MaaSFunctions.java
@@ -17,7 +17,6 @@
  */
 package org.apache.metron.maas.functions;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import com.google.common.cache.Cache;
 import com.google.common.cache.CacheBuilder;
 import java.lang.invoke.MethodHandles;
@@ -174,8 +173,7 @@ public class MaaSFunctions {
           URL u = new URL(url + "/" + modelFunction);
 
           String results = RESTUtil.INSTANCE.getRESTJSONResults(u, modelArgs);
-          ret = JSONUtils.INSTANCE.load(results, new TypeReference<Map<String, 
Object>>() {
-          });
+          ret = JSONUtils.INSTANCE.load(results, JSONUtils.MAP_SUPPLIER);
           resultCache.put(cacheKey, ret);
           return ret;
         } catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/Configurations.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/Configurations.java
 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/Configurations.java
index ecf8a1b..af421a9 100644
--- 
a/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/Configurations.java
+++ 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/Configurations.java
@@ -17,7 +17,6 @@
  */
 package org.apache.metron.common.configuration;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -61,8 +60,7 @@ public class Configurations implements Serializable {
   }
 
   public void updateGlobalConfig(InputStream io) throws IOException {
-    Map<String, Object> globalConfig = JSONUtils.INSTANCE.load(io, new 
TypeReference<Map<String, Object>>() {
-    });
+    Map<String, Object> globalConfig = JSONUtils.INSTANCE.load(io, 
JSONUtils.MAP_SUPPLIER);
     updateGlobalConfig(globalConfig);
   }
 

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/ConfigurationsUtils.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/ConfigurationsUtils.java
 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/ConfigurationsUtils.java
index 5183788..a89db63 100644
--- 
a/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/ConfigurationsUtils.java
+++ 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/ConfigurationsUtils.java
@@ -596,10 +596,7 @@ public class ConfigurationsUtils {
           byte[] patchData, CuratorFramework client) throws Exception {
 
     byte[] configData = readConfigBytesFromZookeeper(configurationType, 
configName, client);
-    JsonNode source = JSONUtils.INSTANCE.readTree(configData);
-    JsonNode patch = JSONUtils.INSTANCE.readTree(patchData);
-    JsonNode patchedConfig = JSONUtils.INSTANCE.applyPatch(patch, source);
-    byte[] prettyPatchedConfig = 
JSONUtils.INSTANCE.toJSONPretty(patchedConfig);
+    byte[] prettyPatchedConfig = JSONUtils.INSTANCE.applyPatch(patchData, 
configData);
 
     // ensure the patch produces a valid result; otherwise exception thrown 
during deserialization
     String prettyPatchedConfigStr = new String(prettyPatchedConfig);

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/GlobalConfigurationOperations.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/GlobalConfigurationOperations.java
 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/GlobalConfigurationOperations.java
index 4842c91..581ec3e 100644
--- 
a/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/GlobalConfigurationOperations.java
+++ 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/GlobalConfigurationOperations.java
@@ -18,7 +18,6 @@
 
 package org.apache.metron.common.configuration;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import java.io.IOException;
 import java.util.Map;
 import org.apache.curator.framework.CuratorFramework;
@@ -38,8 +37,7 @@ public class GlobalConfigurationOperations implements 
ConfigurationOperations {
 
   @Override
   public Object deserialize(String s) throws IOException {
-    return JSONUtils.INSTANCE.load(s, new TypeReference<Map<String, Object>>() 
{
-    });
+    return JSONUtils.INSTANCE.load(s, JSONUtils.MAP_SUPPLIER);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/IndexingConfigurationOperations.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/IndexingConfigurationOperations.java
 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/IndexingConfigurationOperations.java
index a75c84e..7884e4d 100644
--- 
a/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/IndexingConfigurationOperations.java
+++ 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/IndexingConfigurationOperations.java
@@ -18,7 +18,6 @@
 
 package org.apache.metron.common.configuration;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import java.io.IOException;
 import java.util.Map;
 import org.apache.curator.framework.CuratorFramework;
@@ -33,8 +32,7 @@ public class IndexingConfigurationOperations implements 
ConfigurationOperations
 
   @Override
   public Object deserialize(String s) throws IOException {
-    return JSONUtils.INSTANCE.load(s, new TypeReference<Map<String, Object>>() 
{
-    });
+    return JSONUtils.INSTANCE.load(s, JSONUtils.MAP_SUPPLIER);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/IndexingConfigurations.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/IndexingConfigurations.java
 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/IndexingConfigurations.java
index 003b6df..7ef9f00 100644
--- 
a/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/IndexingConfigurations.java
+++ 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/IndexingConfigurations.java
@@ -17,7 +17,6 @@
  */
 package org.apache.metron.common.configuration;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import org.apache.metron.stellar.common.utils.ConversionUtils;
 import org.apache.metron.common.utils.JSONUtils;
 
@@ -77,8 +76,7 @@ public class IndexingConfigurations extends Configurations {
   }
 
   public void updateSensorIndexingConfig(String sensorType, InputStream io) 
throws IOException {
-    Map<String, Object> sensorIndexingConfig = JSONUtils.INSTANCE.load(io, new 
TypeReference<Map<String, Object>>() {
-    });
+    Map<String, Object> sensorIndexingConfig = JSONUtils.INSTANCE.load(io, 
JSONUtils.MAP_SUPPLIER);
     updateSensorIndexingConfig(sensorType, sensorIndexingConfig);
   }
 

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-platform/metron-common/src/main/java/org/apache/metron/common/utils/JSONUtils.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-common/src/main/java/org/apache/metron/common/utils/JSONUtils.java
 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/utils/JSONUtils.java
index 280b167..135546d 100644
--- 
a/metron-platform/metron-common/src/main/java/org/apache/metron/common/utils/JSONUtils.java
+++ 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/utils/JSONUtils.java
@@ -29,6 +29,15 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Supplier;
+
+import com.google.common.reflect.TypeToken;
 import org.json.simple.JSONObject;
 import org.json.simple.parser.JSONParser;
 import org.json.simple.parser.ParseException;
@@ -36,6 +45,31 @@ import org.json.simple.parser.ParseException;
 public enum JSONUtils {
   INSTANCE;
 
+  public static class ReferenceSupplier<T> implements 
Supplier<TypeReference<T>> {
+    Type type;
+    protected ReferenceSupplier() {
+      Type superClass = this.getClass().getGenericSuperclass();
+      if(superClass instanceof Class) {
+        throw new IllegalArgumentException("Internal error: ReferenceSupplier 
constructed without actual type information");
+      } else {
+        this.type = 
((ParameterizedType)superClass).getActualTypeArguments()[0];
+      }
+    }
+
+    @Override
+    public TypeReference<T> get() {
+      return new TypeReference<T>() {
+        @Override
+        public Type getType() {
+          return type;
+        }
+      };
+    }
+  }
+
+  public final static ReferenceSupplier<Map<String, Object>> MAP_SUPPLIER = 
new ReferenceSupplier<Map<String, Object>>() {};
+  public final static ReferenceSupplier<List<Object>> LIST_SUPPLIER = new 
ReferenceSupplier<List<Object>>(){};
+
   private static ThreadLocal<JSONParser> _parser = ThreadLocal.withInitial(() 
->
       new JSONParser());
 
@@ -51,17 +85,17 @@ public enum JSONUtils {
   }
 
 
-  public <T> T load(InputStream is, TypeReference<T> ref) throws IOException {
-    return _mapper.get().readValue(is, ref);
+  public <T> T load(InputStream is, ReferenceSupplier<T> ref) throws 
IOException {
+    return _mapper.get().readValue(is, (TypeReference<T>)ref.get());
   }
 
-  public <T> T load(String is, TypeReference<T> ref) throws IOException {
-    return _mapper.get().readValue(is, ref);
+  public <T> T load(String is, ReferenceSupplier<T> ref) throws IOException {
+    return _mapper.get().readValue(is, (TypeReference<T>)ref.get());
   }
 
-  public <T> T load(File f, TypeReference<T> ref) throws IOException {
+  public <T> T load(File f, ReferenceSupplier<T> ref) throws IOException {
     try (InputStream is = new BufferedInputStream(new FileInputStream(f))) {
-      return _mapper.get().readValue(is, ref);
+      return _mapper.get().readValue(is, (TypeReference<T>)ref.get());
     }
   }
 
@@ -108,7 +142,7 @@ public enum JSONUtils {
    * @param json JSON value to deserialize
    * @return deserialized JsonNode Object
    */
-  public JsonNode readTree(String json) throws IOException {
+  JsonNode readTree(String json) throws IOException {
     return _mapper.get().readTree(json);
   }
 
@@ -118,7 +152,7 @@ public enum JSONUtils {
    * @param json JSON value to deserialize
    * @return deserialized JsonNode Object
    */
-  public JsonNode readTree(byte[] json) throws IOException {
+  JsonNode readTree(byte[] json) throws IOException {
     return _mapper.get().readTree(json);
   }
 
@@ -138,14 +172,16 @@ public enum JSONUtils {
    * @param source Source JSON to apply patch to
    * @return new json after applying the patch
    */
-  public JsonNode applyPatch(String patch, String source) throws IOException {
+  public byte[] applyPatch(String patch, String source) throws IOException {
     JsonNode patchNode = readTree(patch);
     JsonNode sourceNode = readTree(source);
-    return applyPatch(patchNode, sourceNode);
+    return toJSONPretty(JsonPatch.apply(patchNode, sourceNode));
   }
 
-  public JsonNode applyPatch(JsonNode patch, JsonNode source) throws 
IOException {
-    return JsonPatch.apply(patch, source);
+  public byte[] applyPatch(byte[] patch, byte[] source) throws IOException {
+    JsonNode patchNode = readTree(patch);
+    JsonNode sourceNode = readTree(source);
+    return toJSONPretty(JsonPatch.apply(patchNode, sourceNode));
   }
 
 }

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-platform/metron-common/src/main/java/org/apache/metron/common/utils/KafkaUtils.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-common/src/main/java/org/apache/metron/common/utils/KafkaUtils.java
 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/utils/KafkaUtils.java
index a26a3bb..d54e2b8 100644
--- 
a/metron-platform/metron-common/src/main/java/org/apache/metron/common/utils/KafkaUtils.java
+++ 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/utils/KafkaUtils.java
@@ -18,7 +18,7 @@
 
 package org.apache.metron.common.utils;
 
-import com.fasterxml.jackson.core.type.TypeReference;
+import com.google.common.base.Joiner;
 import com.google.common.base.Splitter;
 import com.google.common.collect.Iterables;
 import org.apache.curator.RetryPolicy;
@@ -48,8 +48,7 @@ public enum KafkaUtils {
     for(String id : client.getChildren().forPath("/brokers/ids")) {
       byte[] data = client.getData().forPath("/brokers/ids/" + id);
       String brokerInfoStr = new String(data);
-      Map<String, Object> brokerInfo = JSONUtils.INSTANCE.load(brokerInfoStr, 
new TypeReference<Map<String, Object>>() {
-      });
+      Map<String, Object> brokerInfo = JSONUtils.INSTANCE.load(brokerInfoStr, 
JSONUtils.MAP_SUPPLIER);
       String host = (String) brokerInfo.get("host");
       if(host != null) {
         ret.add(host + ":" + brokerInfo.get("port"));

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-platform/metron-common/src/test/java/org/apache/metron/common/configuration/StellarEnrichmentTest.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-common/src/test/java/org/apache/metron/common/configuration/StellarEnrichmentTest.java
 
b/metron-platform/metron-common/src/test/java/org/apache/metron/common/configuration/StellarEnrichmentTest.java
index 8eb9bbc..60a7d82 100644
--- 
a/metron-platform/metron-common/src/test/java/org/apache/metron/common/configuration/StellarEnrichmentTest.java
+++ 
b/metron-platform/metron-common/src/test/java/org/apache/metron/common/configuration/StellarEnrichmentTest.java
@@ -17,7 +17,6 @@
  */
 package org.apache.metron.common.configuration;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import com.google.common.collect.ImmutableList;
 import org.adrianwalker.multilinestring.Multiline;
 import org.apache.metron.common.utils.JSONUtils;
@@ -221,8 +220,7 @@ public class StellarEnrichmentTest {
   public static String message;
 
   public static JSONObject getMessage() throws IOException {
-    Map<String, Object> ret = JSONUtils.INSTANCE.load(message, new 
TypeReference<Map<String, Object>>() {
-    });
+    Map<String, Object> ret = JSONUtils.INSTANCE.load(message, 
JSONUtils.MAP_SUPPLIER);
     return new JSONObject(ret);
   }
 

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-platform/metron-common/src/test/java/org/apache/metron/common/utils/JSONUtilsTest.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-common/src/test/java/org/apache/metron/common/utils/JSONUtilsTest.java
 
b/metron-platform/metron-common/src/test/java/org/apache/metron/common/utils/JSONUtilsTest.java
index 7f4846e..4676591 100644
--- 
a/metron-platform/metron-common/src/test/java/org/apache/metron/common/utils/JSONUtilsTest.java
+++ 
b/metron-platform/metron-common/src/test/java/org/apache/metron/common/utils/JSONUtilsTest.java
@@ -21,7 +21,6 @@ package org.apache.metron.common.utils;
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.junit.Assert.assertThat;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.JsonNode;
 import java.io.File;
 import java.io.IOException;
@@ -56,8 +55,7 @@ public class JSONUtilsTest {
       put("b", "world");
     }};
     Map<String, Object> actual = JSONUtils.INSTANCE
-        .load(configFile, new TypeReference<Map<String, Object>>() {
-        });
+        .load(configFile, JSONUtils.MAP_SUPPLIER);
     assertThat("config not equal", actual, equalTo(expected));
   }
 
@@ -123,9 +121,8 @@ public class JSONUtilsTest {
 
   @Test
   public void applyPatch_modifies_source_json_doc() throws IOException {
-    JsonNode actual = JSONUtils.INSTANCE.applyPatch(patchJson, sourceJson);
-    JsonNode expected = JSONUtils.INSTANCE.readTree(expectedJson);
-    assertThat(actual, equalTo(expected));
+    String actual = new String(JSONUtils.INSTANCE.applyPatch(patchJson, 
sourceJson));
+    assertThat(JSONUtils.INSTANCE.load(actual, JSONUtils.MAP_SUPPLIER), 
equalTo(JSONUtils.INSTANCE.load(expectedJson, JSONUtils.MAP_SUPPLIER)));
   }
 
   /**
@@ -160,9 +157,8 @@ public class JSONUtilsTest {
 
   @Test
   public void applyPatch_modifies_complex_source_json_doc() throws IOException 
{
-    JsonNode actual = JSONUtils.INSTANCE.applyPatch(patchComplexJson, 
complexJson);
-    JsonNode expected = JSONUtils.INSTANCE.readTree(expectedComplexJson);
-    assertThat(actual, equalTo(expected));
+    String actual = new String(JSONUtils.INSTANCE.applyPatch(patchComplexJson, 
complexJson));
+    assertThat(JSONUtils.INSTANCE.load(actual, JSONUtils.MAP_SUPPLIER), 
equalTo(JSONUtils.INSTANCE.load(expectedComplexJson, JSONUtils.MAP_SUPPLIER)));
   }
 
 }

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-platform/metron-common/src/test/java/org/apache/metron/common/zookeeper/ZKConfigurationsCacheIntegrationTest.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-common/src/test/java/org/apache/metron/common/zookeeper/ZKConfigurationsCacheIntegrationTest.java
 
b/metron-platform/metron-common/src/test/java/org/apache/metron/common/zookeeper/ZKConfigurationsCacheIntegrationTest.java
index 64bf986..ec4a98a 100644
--- 
a/metron-platform/metron-common/src/test/java/org/apache/metron/common/zookeeper/ZKConfigurationsCacheIntegrationTest.java
+++ 
b/metron-platform/metron-common/src/test/java/org/apache/metron/common/zookeeper/ZKConfigurationsCacheIntegrationTest.java
@@ -17,7 +17,6 @@
  */
 package org.apache.metron.common.zookeeper;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import org.adrianwalker.multilinestring.Multiline;
 import org.apache.commons.io.IOUtils;
 import org.apache.curator.framework.CuratorFramework;
@@ -226,14 +225,14 @@ public class ZKConfigurationsCacheIntegrationTest {
     ConfigurationsUtils.writeProfilerConfigToZookeeper( 
profilerConfig.getBytes(), client);
     //indexing
     {
-      Map<String, Object> expectedConfig = 
JSONUtils.INSTANCE.load(testIndexingConfig, new TypeReference<Map<String, 
Object>>() {});
+      Map<String, Object> expectedConfig = 
JSONUtils.INSTANCE.load(testIndexingConfig, JSONUtils.MAP_SUPPLIER);
       IndexingConfigurations config = cache.get( IndexingConfigurations.class);
       assertEventually(() -> Assert.assertEquals(expectedConfig, 
config.getSensorIndexingConfig("test")));
     }
     //enrichment
     {
       SensorEnrichmentConfig expectedConfig = 
JSONUtils.INSTANCE.load(testEnrichmentConfig, SensorEnrichmentConfig.class);
-      Map<String, Object> expectedGlobalConfig = 
JSONUtils.INSTANCE.load(globalConfig, new TypeReference<Map<String, Object>>() 
{});
+      Map<String, Object> expectedGlobalConfig = 
JSONUtils.INSTANCE.load(globalConfig, JSONUtils.MAP_SUPPLIER);
       EnrichmentConfigurations config = cache.get( 
EnrichmentConfigurations.class);
       assertEventually(() -> Assert.assertEquals(expectedConfig, 
config.getSensorEnrichmentConfig("test")));
       assertEventually(() -> Assert.assertEquals(expectedGlobalConfig, 
config.getGlobalConfig()));
@@ -255,12 +254,11 @@ public class ZKConfigurationsCacheIntegrationTest {
   @Test
   public void validateBaseWrite() throws Exception {
     File globalConfigFile = new File(TestConstants.SAMPLE_CONFIG_PATH + 
"/global.json");
-    Map<String, Object> expectedGlobalConfig = 
JSONUtils.INSTANCE.load(globalConfigFile, new TypeReference<Map<String, 
Object>>() { });
+    Map<String, Object> expectedGlobalConfig = 
JSONUtils.INSTANCE.load(globalConfigFile, JSONUtils.MAP_SUPPLIER);
     //indexing
     {
       File inFile = new File(TestConstants.SAMPLE_CONFIG_PATH + 
"/indexing/test.json");
-      Map<String, Object> expectedConfig = JSONUtils.INSTANCE.load(inFile, new 
TypeReference<Map<String, Object>>() {
-      });
+      Map<String, Object> expectedConfig = JSONUtils.INSTANCE.load(inFile, 
JSONUtils.MAP_SUPPLIER);
       IndexingConfigurations config = cache.get( IndexingConfigurations.class);
       assertEventually(() -> Assert.assertEquals(expectedConfig, 
config.getSensorIndexingConfig("test")));
       assertEventually(() -> Assert.assertEquals(expectedGlobalConfig, 
config.getGlobalConfig()));

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-platform/metron-data-management/src/main/java/org/apache/metron/dataloads/extractor/TransformFilterExtractorDecorator.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-data-management/src/main/java/org/apache/metron/dataloads/extractor/TransformFilterExtractorDecorator.java
 
b/metron-platform/metron-data-management/src/main/java/org/apache/metron/dataloads/extractor/TransformFilterExtractorDecorator.java
index c47dfc6..b665a01 100644
--- 
a/metron-platform/metron-data-management/src/main/java/org/apache/metron/dataloads/extractor/TransformFilterExtractorDecorator.java
+++ 
b/metron-platform/metron-data-management/src/main/java/org/apache/metron/dataloads/extractor/TransformFilterExtractorDecorator.java
@@ -17,7 +17,6 @@
  */
 package org.apache.metron.dataloads.extractor;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
@@ -208,8 +207,7 @@ public class TransformFilterExtractorDecorator extends 
ExtractorDecorator implem
       try {
         return JSONUtils.INSTANCE.load(
                 new 
ByteArrayInputStream(ConfigurationsUtils.readGlobalConfigBytesFromZookeeper(zkClient.get())),
-                new TypeReference<Map<String, Object>>() {
-                });
+                JSONUtils.MAP_SUPPLIER);
       } catch (Exception e) {
         LOG.warn("Exception thrown while attempting to get global config from 
Zookeeper.", e);
       }

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-platform/metron-data-management/src/main/java/org/apache/metron/dataloads/nonbulk/geo/GeoEnrichmentLoader.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-data-management/src/main/java/org/apache/metron/dataloads/nonbulk/geo/GeoEnrichmentLoader.java
 
b/metron-platform/metron-data-management/src/main/java/org/apache/metron/dataloads/nonbulk/geo/GeoEnrichmentLoader.java
index 322edec..b366015 100644
--- 
a/metron-platform/metron-data-management/src/main/java/org/apache/metron/dataloads/nonbulk/geo/GeoEnrichmentLoader.java
+++ 
b/metron-platform/metron-data-management/src/main/java/org/apache/metron/dataloads/nonbulk/geo/GeoEnrichmentLoader.java
@@ -18,7 +18,6 @@
 package org.apache.metron.dataloads.nonbulk.geo;
 
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import com.google.common.base.Function;
 import com.google.common.base.Joiner;
 import org.apache.commons.cli.*;
@@ -200,8 +199,7 @@ public class GeoEnrichmentLoader {
       // Fetch the global configuration
       Map<String, Object> global = JSONUtils.INSTANCE.load(
               new 
ByteArrayInputStream(ConfigurationsUtils.readGlobalConfigBytesFromZookeeper(client)),
-              new TypeReference<Map<String, Object>>() {
-              });
+              JSONUtils.MAP_SUPPLIER);
 
       // Update the global config and push it back
       global.put(GeoLiteDatabase.GEO_HDFS_FILE, dstPath.toString() + "/" + 
srcPath.getName());

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-platform/metron-elasticsearch/src/main/java/org/apache/metron/elasticsearch/bulk/ElasticsearchImportExport.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-elasticsearch/src/main/java/org/apache/metron/elasticsearch/bulk/ElasticsearchImportExport.java
 
b/metron-platform/metron-elasticsearch/src/main/java/org/apache/metron/elasticsearch/bulk/ElasticsearchImportExport.java
index 0a04dfc..77e0d61 100644
--- 
a/metron-platform/metron-elasticsearch/src/main/java/org/apache/metron/elasticsearch/bulk/ElasticsearchImportExport.java
+++ 
b/metron-platform/metron-elasticsearch/src/main/java/org/apache/metron/elasticsearch/bulk/ElasticsearchImportExport.java
@@ -18,7 +18,6 @@
 
 package org.apache.metron.elasticsearch.bulk;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
 import java.io.FileReader;
@@ -71,8 +70,7 @@ public class ElasticsearchImportExport {
       String line;
       while ((line = br.readLine()) != null) {
         Map<String, Object> inDoc = JSONUtils.INSTANCE
-            .load(line, new TypeReference<Map<String, Object>>() {
-            });
+            .load(line, JSONUtils.MAP_SUPPLIER);
         Object id = inDoc.get("_id");
         Object type = inDoc.get("_type");
         String createRaw = String

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-platform/metron-elasticsearch/src/test/java/org/apache/metron/elasticsearch/integration/ElasticsearchSearchIntegrationTest.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-elasticsearch/src/test/java/org/apache/metron/elasticsearch/integration/ElasticsearchSearchIntegrationTest.java
 
b/metron-platform/metron-elasticsearch/src/test/java/org/apache/metron/elasticsearch/integration/ElasticsearchSearchIntegrationTest.java
index f86a04d..1bc5b6e 100644
--- 
a/metron-platform/metron-elasticsearch/src/test/java/org/apache/metron/elasticsearch/integration/ElasticsearchSearchIntegrationTest.java
+++ 
b/metron-platform/metron-elasticsearch/src/test/java/org/apache/metron/elasticsearch/integration/ElasticsearchSearchIntegrationTest.java
@@ -21,13 +21,16 @@ package org.apache.metron.elasticsearch.integration;
 import java.io.File;
 import java.io.IOException;
 import java.util.HashMap;
+import java.util.List;
 import java.util.concurrent.ExecutionException;
 import org.adrianwalker.multilinestring.Multiline;
+import org.apache.metron.common.utils.JSONUtils;
 import org.apache.metron.elasticsearch.dao.ElasticsearchDao;
 import 
org.apache.metron.elasticsearch.integration.components.ElasticSearchComponent;
 import org.apache.metron.indexing.dao.AccessConfig;
 import org.apache.metron.indexing.dao.IndexDao;
 import org.apache.metron.indexing.dao.SearchIntegrationTest;
+import org.apache.metron.indexing.dao.search.GetRequest;
 import org.apache.metron.integration.InMemoryComponent;
 import org.elasticsearch.action.bulk.BulkRequestBuilder;
 import org.elasticsearch.action.bulk.BulkResponse;
@@ -37,6 +40,7 @@ import org.json.simple.JSONArray;
 import org.json.simple.JSONObject;
 import org.json.simple.parser.JSONParser;
 import org.json.simple.parser.ParseException;
+import org.junit.Test;
 
 public class ElasticsearchSearchIntegrationTest extends SearchIntegrationTest {
 
@@ -233,4 +237,6 @@ public class ElasticsearchSearchIntegrationTest extends 
SearchIntegrationTest {
       throw new RuntimeException("Failed to index test data");
     }
   }
+
+
 }

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-platform/metron-elasticsearch/src/test/java/org/apache/metron/elasticsearch/integration/ElasticsearchUpdateIntegrationTest.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-elasticsearch/src/test/java/org/apache/metron/elasticsearch/integration/ElasticsearchUpdateIntegrationTest.java
 
b/metron-platform/metron-elasticsearch/src/test/java/org/apache/metron/elasticsearch/integration/ElasticsearchUpdateIntegrationTest.java
index 116ee4b..325d42e 100644
--- 
a/metron-platform/metron-elasticsearch/src/test/java/org/apache/metron/elasticsearch/integration/ElasticsearchUpdateIntegrationTest.java
+++ 
b/metron-platform/metron-elasticsearch/src/test/java/org/apache/metron/elasticsearch/integration/ElasticsearchUpdateIntegrationTest.java
@@ -18,7 +18,6 @@
 package org.apache.metron.elasticsearch.integration;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.core.type.TypeReference;
 import com.google.common.collect.Iterables;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.HBaseConfiguration;
@@ -158,7 +157,7 @@ public class ElasticsearchUpdateIntegrationTest {
         Assert.assertEquals(1, columns.size());
         Assert.assertEquals(message0
                 , JSONUtils.INSTANCE.load(new 
String(columns.lastEntry().getValue())
-                        , new TypeReference<Map<String, Object>>() {})
+                        , JSONUtils.MAP_SUPPLIER)
         );
       }
       {
@@ -195,10 +194,10 @@ public class ElasticsearchUpdateIntegrationTest {
         NavigableMap<byte[], byte[]> columns = r.getFamilyMap(CF.getBytes());
         Assert.assertEquals(2, columns.size());
         Assert.assertEquals(message0, JSONUtils.INSTANCE.load(new 
String(columns.lastEntry().getValue())
-                        , new TypeReference<Map<String, Object>>() {})
+                        , JSONUtils.MAP_SUPPLIER)
         );
         Assert.assertNotEquals(message0, JSONUtils.INSTANCE.load(new 
String(columns.firstEntry().getValue())
-                        , new TypeReference<Map<String, Object>>() {})
+                        , JSONUtils.MAP_SUPPLIER)
         );
       }
       {

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-platform/metron-elasticsearch/src/test/java/org/apache/metron/elasticsearch/integration/components/ElasticSearchComponent.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-elasticsearch/src/test/java/org/apache/metron/elasticsearch/integration/components/ElasticSearchComponent.java
 
b/metron-platform/metron-elasticsearch/src/test/java/org/apache/metron/elasticsearch/integration/components/ElasticSearchComponent.java
index f95ef21..e716ce1 100644
--- 
a/metron-platform/metron-elasticsearch/src/test/java/org/apache/metron/elasticsearch/integration/components/ElasticSearchComponent.java
+++ 
b/metron-platform/metron-elasticsearch/src/test/java/org/apache/metron/elasticsearch/integration/components/ElasticSearchComponent.java
@@ -19,7 +19,6 @@ package 
org.apache.metron.elasticsearch.integration.components;
 
 import static java.util.Arrays.asList;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
@@ -210,8 +209,7 @@ public class ElasticSearchComponent implements 
InMemoryComponent {
 
       indexRequestBuilder = indexRequestBuilder.setSource(doc);
       Map<String, Object> esDoc = JSONUtils.INSTANCE
-          .load(doc, new TypeReference<Map<String, Object>>() {
-          });
+          .load(doc, JSONUtils.MAP_SUPPLIER);
       indexRequestBuilder.setId((String) esDoc.get(Constants.GUID));
       Object ts = esDoc.get("timestamp");
       if (ts != null) {

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-platform/metron-enrichment/src/main/java/org/apache/metron/enrichment/cli/LatencySummarizer.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-enrichment/src/main/java/org/apache/metron/enrichment/cli/LatencySummarizer.java
 
b/metron-platform/metron-enrichment/src/main/java/org/apache/metron/enrichment/cli/LatencySummarizer.java
index b40f2ad..2e5e8bf 100644
--- 
a/metron-platform/metron-enrichment/src/main/java/org/apache/metron/enrichment/cli/LatencySummarizer.java
+++ 
b/metron-platform/metron-enrichment/src/main/java/org/apache/metron/enrichment/cli/LatencySummarizer.java
@@ -17,7 +17,6 @@
  */
 package org.apache.metron.enrichment.cli;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import com.google.common.base.Joiner;
 import com.google.common.base.Splitter;
 import com.google.common.collect.Iterables;
@@ -181,7 +180,7 @@ public class LatencySummarizer {
     LatencyStats statsMap = new LatencyStats();
     BufferedReader reader = new BufferedReader(new 
InputStreamReader(System.in));
     for(String line = null;(line = reader.readLine()) != null;) {
-      Map<String, Object> doc = JSONUtils.INSTANCE.load(line, new 
TypeReference<HashMap<String, Object>>() {});
+      Map<String, Object> doc = JSONUtils.INSTANCE.load(line, 
JSONUtils.MAP_SUPPLIER);
       updateStats(statsMap, doc);
     }
     statsMap.printSummary(cmd.hasOption('m'));

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-platform/metron-enrichment/src/test/java/org/apache/metron/enrichment/integration/EnrichmentIntegrationTest.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-enrichment/src/test/java/org/apache/metron/enrichment/integration/EnrichmentIntegrationTest.java
 
b/metron-platform/metron-enrichment/src/test/java/org/apache/metron/enrichment/integration/EnrichmentIntegrationTest.java
index c457e86..828f4e3 100644
--- 
a/metron-platform/metron-enrichment/src/test/java/org/apache/metron/enrichment/integration/EnrichmentIntegrationTest.java
+++ 
b/metron-platform/metron-enrichment/src/test/java/org/apache/metron/enrichment/integration/EnrichmentIntegrationTest.java
@@ -24,7 +24,6 @@ import static 
org.apache.metron.enrichment.bolt.ThreatIntelJoinBolt.THREAT_TRIAG
 import static 
org.apache.metron.enrichment.bolt.ThreatIntelJoinBolt.THREAT_TRIAGE_RULE_SCORE;
 import static 
org.apache.metron.enrichment.bolt.ThreatIntelJoinBolt.THREAT_TRIAGE_SCORE_KEY;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import com.google.common.base.Function;
 import com.google.common.base.Joiner;
 import com.google.common.base.Predicate;
@@ -163,8 +162,7 @@ public class EnrichmentIntegrationTest extends 
BaseIntegrationTest {
     String globalConfigStr = null;
     {
       File globalConfig = new File(new File(TestConstants.SAMPLE_CONFIG_PATH), 
"global.json");
-      Map<String, Object> config = JSONUtils.INSTANCE.load(globalConfig, new 
TypeReference<Map<String, Object>>() {
-      });
+      Map<String, Object> config = JSONUtils.INSTANCE.load(globalConfig, 
JSONUtils.MAP_SUPPLIER);
       config.put(SimpleHBaseEnrichmentFunctions.TABLE_PROVIDER_TYPE_CONF, 
MockHBaseTableProvider.class.getName());
       config.put(SimpleHBaseEnrichmentFunctions.ACCESS_TRACKER_TYPE_CONF, 
"PERSISTENT_BLOOM");
       config.put(PersistentBloomTrackerCreator.Config.PERSISTENT_BLOOM_TABLE, 
trackerHBaseTableName);
@@ -531,7 +529,7 @@ public class EnrichmentIntegrationTest extends 
BaseIntegrationTest {
                     , message -> {
                       try {
                         return new HashMap<>(JSONUtils.INSTANCE.load(new 
String(message)
-                                , new TypeReference<Map<String, Object>>() {}
+                                , JSONUtils.MAP_SUPPLIER 
                         )
                         );
                       } catch (Exception ex) {

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-platform/metron-indexing/src/main/java/org/apache/metron/indexing/dao/HBaseDao.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-indexing/src/main/java/org/apache/metron/indexing/dao/HBaseDao.java
 
b/metron-platform/metron-indexing/src/main/java/org/apache/metron/indexing/dao/HBaseDao.java
index 72f2980..ebb9907 100644
--- 
a/metron-platform/metron-indexing/src/main/java/org/apache/metron/indexing/dao/HBaseDao.java
+++ 
b/metron-platform/metron-indexing/src/main/java/org/apache/metron/indexing/dao/HBaseDao.java
@@ -18,7 +18,6 @@
 
 package org.apache.metron.indexing.dao;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.DataInputStream;
@@ -210,7 +209,7 @@ public class HBaseDao implements IndexDao {
     Long ts = Bytes.toLong(entry.getKey());
     if(entry.getValue()!= null) {
       Map<String, Object> json = JSONUtils.INSTANCE.load(new 
String(entry.getValue()),
-          new TypeReference<Map<String, Object>>() {});
+          JSONUtils.MAP_SUPPLIER);
       try {
         Key k = Key.fromBytes(result.getRow());
         return new Document(json, k.getGuid(), k.getSensorType(), ts);

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-platform/metron-indexing/src/main/java/org/apache/metron/indexing/dao/IndexDao.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-indexing/src/main/java/org/apache/metron/indexing/dao/IndexDao.java
 
b/metron-platform/metron-indexing/src/main/java/org/apache/metron/indexing/dao/IndexDao.java
index 03d348a..2c057d4 100644
--- 
a/metron-platform/metron-indexing/src/main/java/org/apache/metron/indexing/dao/IndexDao.java
+++ 
b/metron-platform/metron-indexing/src/main/java/org/apache/metron/indexing/dao/IndexDao.java
@@ -17,12 +17,16 @@
  */
 package org.apache.metron.indexing.dao;
 
+import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.JsonNode;
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.flipkart.zjsonpatch.JsonPatch;
 import org.apache.metron.common.utils.JSONUtils;
 import org.apache.metron.indexing.dao.search.FieldType;
 import org.apache.metron.indexing.dao.search.GetRequest;
@@ -42,6 +46,9 @@ import org.apache.metron.indexing.dao.update.ReplaceRequest;
  */
 public interface IndexDao {
 
+  public static ThreadLocal<ObjectMapper> _mapper = ThreadLocal.withInitial(() 
->
+      new 
ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL));
+
   /**
    * Return search response based on the search request
    *
@@ -140,9 +147,9 @@ public interface IndexDao {
         throw new OriginalNotFoundException("Unable to patch an document that 
doesn't exist and isn't specified.");
       }
     }
-    JsonNode originalNode = JSONUtils.INSTANCE.convert(latest, JsonNode.class);
-    JsonNode patched = JSONUtils.INSTANCE.applyPatch(request.getPatch(), 
originalNode);
-    Map<String, Object> updated = JSONUtils.INSTANCE.getMapper()
+    JsonNode originalNode = _mapper.get().convertValue(latest, JsonNode.class);
+    JsonNode patched = JsonPatch.apply(request.getPatch(), originalNode);
+    Map<String, Object> updated = _mapper.get()
         .convertValue(patched, new TypeReference<Map<String, Object>>() {});
     return new Document( updated
         , request.getGuid()

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-platform/metron-indexing/src/main/java/org/apache/metron/indexing/dao/update/Document.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-indexing/src/main/java/org/apache/metron/indexing/dao/update/Document.java
 
b/metron-platform/metron-indexing/src/main/java/org/apache/metron/indexing/dao/update/Document.java
index b5fcb02..6f2f779 100644
--- 
a/metron-platform/metron-indexing/src/main/java/org/apache/metron/indexing/dao/update/Document.java
+++ 
b/metron-platform/metron-indexing/src/main/java/org/apache/metron/indexing/dao/update/Document.java
@@ -18,7 +18,6 @@
 
 package org.apache.metron.indexing.dao.update;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import org.apache.metron.common.utils.JSONUtils;
 
 import java.io.IOException;
@@ -47,8 +46,7 @@ public class Document {
   }
 
   private static Map<String, Object> convertDoc(String document) throws 
IOException {
-      return JSONUtils.INSTANCE.load(document, new TypeReference<Map<String, 
Object>>() {
-      });
+      return JSONUtils.INSTANCE.load(document, JSONUtils.MAP_SUPPLIER);
   }
 
   public String getSensorType() {

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-platform/metron-indexing/src/test/java/org/apache/metron/indexing/dao/InMemoryDao.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-indexing/src/test/java/org/apache/metron/indexing/dao/InMemoryDao.java
 
b/metron-platform/metron-indexing/src/test/java/org/apache/metron/indexing/dao/InMemoryDao.java
index 002ec28..79c3bb3 100644
--- 
a/metron-platform/metron-indexing/src/test/java/org/apache/metron/indexing/dao/InMemoryDao.java
+++ 
b/metron-platform/metron-indexing/src/test/java/org/apache/metron/indexing/dao/InMemoryDao.java
@@ -17,7 +17,6 @@
  */
 package org.apache.metron.indexing.dao;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import com.google.common.base.Splitter;
 import com.google.common.collect.ComparisonChain;
 import com.google.common.collect.Iterables;
@@ -193,7 +192,7 @@ public class InMemoryDao implements IndexDao {
 
   public static Map<String, Object> parse(String doc) {
     try {
-      return JSONUtils.INSTANCE.load(doc, new TypeReference<Map<String, 
Object>>() {});
+      return JSONUtils.INSTANCE.load(doc, JSONUtils.MAP_SUPPLIER);
     } catch (IOException e) {
       throw new IllegalStateException(e.getMessage(), e);
     }

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-platform/metron-indexing/src/test/java/org/apache/metron/indexing/dao/SearchIntegrationTest.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-indexing/src/test/java/org/apache/metron/indexing/dao/SearchIntegrationTest.java
 
b/metron-platform/metron-indexing/src/test/java/org/apache/metron/indexing/dao/SearchIntegrationTest.java
index f381688..b40db46 100644
--- 
a/metron-platform/metron-indexing/src/test/java/org/apache/metron/indexing/dao/SearchIntegrationTest.java
+++ 
b/metron-platform/metron-indexing/src/test/java/org/apache/metron/indexing/dao/SearchIntegrationTest.java
@@ -18,7 +18,6 @@
  */
 package org.apache.metron.indexing.dao;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -464,8 +463,7 @@ public abstract class SearchIntegrationTest {
 
   @Test
   public void get_all_latest_guid() throws Exception {
-    List<GetRequest> request = JSONUtils.INSTANCE.load(getAllLatestQuery, new 
TypeReference<List<GetRequest>>() {
-    });
+    List<GetRequest> request = JSONUtils.INSTANCE.load(getAllLatestQuery, new 
JSONUtils.ReferenceSupplier<List<GetRequest>>(){});
     Map<String, Document> docs = new HashMap<>();
 
     for(Document doc : dao.getAllLatest(request)) {
@@ -945,4 +943,4 @@ public abstract class SearchIntegrationTest {
   protected abstract IndexDao createDao() throws Exception;
   protected abstract InMemoryComponent startIndex() throws Exception;
   protected abstract void loadTestData() throws Exception;
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-platform/metron-indexing/src/test/java/org/apache/metron/indexing/integration/HDFSIndexingIntegrationTest.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-indexing/src/test/java/org/apache/metron/indexing/integration/HDFSIndexingIntegrationTest.java
 
b/metron-platform/metron-indexing/src/test/java/org/apache/metron/indexing/integration/HDFSIndexingIntegrationTest.java
index ab5cc3f..b8af6a3 100644
--- 
a/metron-platform/metron-indexing/src/test/java/org/apache/metron/indexing/integration/HDFSIndexingIntegrationTest.java
+++ 
b/metron-platform/metron-indexing/src/test/java/org/apache/metron/indexing/integration/HDFSIndexingIntegrationTest.java
@@ -18,7 +18,6 @@
 
 package org.apache.metron.indexing.integration;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import com.google.common.base.Function;
 import com.google.common.collect.Iterables;
 import org.apache.metron.common.interfaces.FieldNameConverter;
@@ -75,8 +74,7 @@ public class HDFSIndexingIntegrationTest extends 
IndexingIntegrationTest {
             Iterables.addAll(ret, Iterables.transform(data, bytes -> {
                 String s = new String(bytes);
                 try {
-                  return JSONUtils.INSTANCE.load(s, new 
TypeReference<Map<String, Object>>() {
-                  });
+                  return JSONUtils.INSTANCE.load(s,JSONUtils.MAP_SUPPLIER);
                 } catch (IOException e) {
                   throw new RuntimeException(e);
                 }

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-platform/metron-indexing/src/test/java/org/apache/metron/indexing/integration/IndexingIntegrationTest.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-indexing/src/test/java/org/apache/metron/indexing/integration/IndexingIntegrationTest.java
 
b/metron-platform/metron-indexing/src/test/java/org/apache/metron/indexing/integration/IndexingIntegrationTest.java
index b0b6cc2..1671ab3 100644
--- 
a/metron-platform/metron-indexing/src/test/java/org/apache/metron/indexing/integration/IndexingIntegrationTest.java
+++ 
b/metron-platform/metron-indexing/src/test/java/org/apache/metron/indexing/integration/IndexingIntegrationTest.java
@@ -18,7 +18,6 @@
 
 package org.apache.metron.indexing.integration;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.metron.TestConstants;
 import org.apache.metron.common.Constants;
@@ -81,7 +80,7 @@ public abstract class IndexingIntegrationTest extends 
BaseIntegrationTest {
     }});
     List<Map<String, Object>> inputDocs = new ArrayList<>();
     for(byte[] b : inputMessages) {
-      Map<String, Object> m = JSONUtils.INSTANCE.load(new String(b), new 
TypeReference<Map<String, Object>>() {});
+      Map<String, Object> m = JSONUtils.INSTANCE.load(new String(b), 
JSONUtils.MAP_SUPPLIER);
       inputDocs.add(m);
 
     }

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-platform/metron-parsers/src/main/java/org/apache/metron/parsers/bolt/ParserBolt.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-parsers/src/main/java/org/apache/metron/parsers/bolt/ParserBolt.java
 
b/metron-platform/metron-parsers/src/main/java/org/apache/metron/parsers/bolt/ParserBolt.java
index 99785b2..6fc4ed7 100644
--- 
a/metron-platform/metron-parsers/src/main/java/org/apache/metron/parsers/bolt/ParserBolt.java
+++ 
b/metron-platform/metron-parsers/src/main/java/org/apache/metron/parsers/bolt/ParserBolt.java
@@ -19,7 +19,6 @@ package org.apache.metron.parsers.bolt;
 
 import static org.apache.metron.common.Constants.METADATA_PREFIX;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import java.io.IOException;
 import java.io.Serializable;
 import java.lang.invoke.MethodHandles;
@@ -146,8 +145,7 @@ public class ParserBolt extends ConfiguredParserBolt 
implements Serializable {
     try {
       keyStr = keyObj == null?null:new String(keyObj);
       if(!StringUtils.isEmpty(keyStr)) {
-        Map<String, Object> metadata = JSONUtils.INSTANCE.load(keyStr, new 
TypeReference<Map<String, Object>>() {
-        });
+        Map<String, Object> metadata = 
JSONUtils.INSTANCE.load(keyStr,JSONUtils.MAP_SUPPLIER);
         for(Map.Entry<String, Object> kv : metadata.entrySet()) {
           ret.put(METADATA_PREFIX + kv.getKey(), kv.getValue());
         }

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-platform/metron-parsers/src/main/java/org/apache/metron/parsers/json/JSONMapParser.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-parsers/src/main/java/org/apache/metron/parsers/json/JSONMapParser.java
 
b/metron-platform/metron-parsers/src/main/java/org/apache/metron/parsers/json/JSONMapParser.java
index 5d82456..7e5468f 100644
--- 
a/metron-platform/metron-parsers/src/main/java/org/apache/metron/parsers/json/JSONMapParser.java
+++ 
b/metron-platform/metron-parsers/src/main/java/org/apache/metron/parsers/json/JSONMapParser.java
@@ -17,7 +17,6 @@
  */
 package org.apache.metron.parsers.json;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableList;
 import org.apache.metron.common.utils.JSONUtils;
@@ -96,8 +95,7 @@ public class JSONMapParser extends BasicParser {
     try {
       String originalString = new String(rawMessage);
       //convert the JSON blob into a String -> Object map
-      Map<String, Object> rawMap = JSONUtils.INSTANCE.load(originalString, new 
TypeReference<Map<String, Object>>() {
-      });
+      Map<String, Object> rawMap = JSONUtils.INSTANCE.load(originalString, 
JSONUtils.MAP_SUPPLIER);
       JSONObject ret = normalizeJSON(rawMap);
       ret.put("original_string", originalString );
       if(!ret.containsKey("timestamp")) {

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-platform/metron-parsers/src/main/java/org/apache/metron/parsers/topology/ParserTopologyCLI.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-parsers/src/main/java/org/apache/metron/parsers/topology/ParserTopologyCLI.java
 
b/metron-platform/metron-parsers/src/main/java/org/apache/metron/parsers/topology/ParserTopologyCLI.java
index 4ce0508..3824212 100644
--- 
a/metron-platform/metron-parsers/src/main/java/org/apache/metron/parsers/topology/ParserTopologyCLI.java
+++ 
b/metron-platform/metron-parsers/src/main/java/org/apache/metron/parsers/topology/ParserTopologyCLI.java
@@ -24,7 +24,6 @@ import org.apache.storm.Config;
 import org.apache.storm.LocalCluster;
 import org.apache.storm.StormSubmitter;
 import org.apache.storm.utils.Utils;
-import com.fasterxml.jackson.core.type.TypeReference;
 import com.google.common.base.Joiner;
 import org.apache.commons.cli.*;
 import org.apache.commons.io.FileUtils;
@@ -492,8 +491,7 @@ public class ParserTopologyCLI {
       throw new IllegalArgumentException("Unable to load JSON file at " + 
inputFile.getAbsolutePath());
     }
     try {
-      return JSONUtils.INSTANCE.load(json, new TypeReference<Map<String, 
Object>>() {
-      });
+      return JSONUtils.INSTANCE.load(json, JSONUtils.MAP_SUPPLIER);
     } catch (IOException e) {
       throw new IllegalStateException("Unable to process JSON.", e);
     }

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-platform/metron-parsers/src/main/java/org/apache/metron/parsers/topology/config/ConfigHandlers.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-parsers/src/main/java/org/apache/metron/parsers/topology/config/ConfigHandlers.java
 
b/metron-platform/metron-parsers/src/main/java/org/apache/metron/parsers/topology/config/ConfigHandlers.java
index f6c04a6..8d98922 100644
--- 
a/metron-platform/metron-parsers/src/main/java/org/apache/metron/parsers/topology/config/ConfigHandlers.java
+++ 
b/metron-platform/metron-parsers/src/main/java/org/apache/metron/parsers/topology/config/ConfigHandlers.java
@@ -19,7 +19,6 @@
 package org.apache.metron.parsers.topology.config;
 
 import org.apache.storm.Config;
-import com.fasterxml.jackson.core.type.TypeReference;
 import org.apache.commons.io.FileUtils;
 import org.apache.metron.common.utils.JSONUtils;
 
@@ -81,8 +80,7 @@ public class ConfigHandlers {
           json = arg.getArg();
         }
         try {
-          arg.getConfig().putAll(JSONUtils.INSTANCE.load(json, new 
TypeReference<Map<String, Object>>() {
-          }));
+          arg.getConfig().putAll(JSONUtils.INSTANCE.load(json, 
JSONUtils.MAP_SUPPLIER));
         } catch (IOException e) {
           throw new IllegalStateException("Unable to process JSON snippet.", 
e);
         }

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-platform/metron-parsers/src/test/java/org/apache/metron/parsers/integration/ParserDriver.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-parsers/src/test/java/org/apache/metron/parsers/integration/ParserDriver.java
 
b/metron-platform/metron-parsers/src/test/java/org/apache/metron/parsers/integration/ParserDriver.java
index b844104..deb0217 100644
--- 
a/metron-platform/metron-parsers/src/test/java/org/apache/metron/parsers/integration/ParserDriver.java
+++ 
b/metron-platform/metron-parsers/src/test/java/org/apache/metron/parsers/integration/ParserDriver.java
@@ -17,7 +17,6 @@
  */
 package org.apache.metron.parsers.integration;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import com.google.common.collect.ImmutableList;
 import org.apache.metron.common.configuration.ConfigurationsUtils;
 import org.apache.metron.common.configuration.FieldValidator;
@@ -147,8 +146,7 @@ public class ParserDriver {
   public ParserDriver(String sensorType, String parserConfig, String 
globalConfig) throws IOException {
     config = SensorParserConfig.fromBytes(parserConfig.getBytes());
     this.sensorType = sensorType;
-    this.globalConfig = JSONUtils.INSTANCE.load(globalConfig, new 
TypeReference<Map<String, Object>>() {
-    });
+    this.globalConfig = JSONUtils.INSTANCE.load(globalConfig, 
JSONUtils.MAP_SUPPLIER);
   }
 
   public ProcessorResult<List<byte[]>> run(List<byte[]> in) {

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-platform/metron-parsers/src/test/java/org/apache/metron/writers/integration/WriterBoltIntegrationTest.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-parsers/src/test/java/org/apache/metron/writers/integration/WriterBoltIntegrationTest.java
 
b/metron-platform/metron-parsers/src/test/java/org/apache/metron/writers/integration/WriterBoltIntegrationTest.java
index d4d1c02..0cfaae3 100644
--- 
a/metron-platform/metron-parsers/src/test/java/org/apache/metron/writers/integration/WriterBoltIntegrationTest.java
+++ 
b/metron-platform/metron-parsers/src/test/java/org/apache/metron/writers/integration/WriterBoltIntegrationTest.java
@@ -17,7 +17,6 @@
  */
 package org.apache.metron.writers.integration;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import com.google.common.base.Function;
 import com.google.common.collect.Iterables;
 import org.adrianwalker.multilinestring.Multiline;
@@ -171,7 +170,7 @@ public class WriterBoltIntegrationTest extends 
BaseIntegrationTest {
                     , message -> {
                       try {
                         return new JSONObject(JSONUtils.INSTANCE.load(new 
String(message)
-                                             , new TypeReference<Map<String, 
Object>>() {}
+                                             ,JSONUtils.MAP_SUPPLIER 
                                              )
                         );
                       } catch (Exception ex) {

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/benchmark/StellarMicrobenchmark.java
----------------------------------------------------------------------
diff --git 
a/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/benchmark/StellarMicrobenchmark.java
 
b/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/benchmark/StellarMicrobenchmark.java
index 35fa673..914105e 100644
--- 
a/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/benchmark/StellarMicrobenchmark.java
+++ 
b/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/benchmark/StellarMicrobenchmark.java
@@ -17,7 +17,6 @@
  */
 package org.apache.metron.stellar.common.benchmark;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import com.google.common.base.Joiner;
 import com.google.common.base.Splitter;
 import com.google.common.io.Files;
@@ -231,8 +230,7 @@ public class StellarMicrobenchmark {
     List<String> lines = Files.readLines(expressionsFile, 
Charset.defaultCharset());
     Map<String, Object> variables = new HashMap<>();
     if(variablesFile.isPresent()) {
-      variables = JSONUtils.INSTANCE.load(new 
FileInputStream(variablesFile.get()), new TypeReference<Map<String, Object>>() {
-      });
+      variables = JSONUtils.INSTANCE.load(new 
FileInputStream(variablesFile.get()), JSONUtils.MAP_SUPPLIER);
     }
     int numTimes = DEFAULT_NUM_TIMES;
     if(BenchmarkOptions.NUM_TIMES.has(cli)) {

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/configuration/ConfigurationType.java
----------------------------------------------------------------------
diff --git 
a/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/configuration/ConfigurationType.java
 
b/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/configuration/ConfigurationType.java
index 16cde83..99859b2 100644
--- 
a/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/configuration/ConfigurationType.java
+++ 
b/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/configuration/ConfigurationType.java
@@ -18,7 +18,6 @@
 
 package org.apache.metron.stellar.common.configuration;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import com.google.common.base.Function;
 import org.apache.metron.stellar.common.Constants;
 import org.apache.metron.stellar.common.utils.JSONUtils;
@@ -30,8 +29,7 @@ public enum ConfigurationType implements Function<String, 
Object> {
 
   GLOBAL("global",".", s -> {
     try {
-      return JSONUtils.INSTANCE.load(s, new TypeReference<Map<String, 
Object>>() {
-      });
+      return JSONUtils.INSTANCE.load(s, JSONUtils.MAP_SUPPLIER);
     } catch (IOException e) {
       throw new RuntimeException("Unable to load " + s, e);
     }

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/shell/DefaultStellarShellExecutor.java
----------------------------------------------------------------------
diff --git 
a/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/shell/DefaultStellarShellExecutor.java
 
b/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/shell/DefaultStellarShellExecutor.java
index f83bb9e..3f2c495 100644
--- 
a/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/shell/DefaultStellarShellExecutor.java
+++ 
b/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/shell/DefaultStellarShellExecutor.java
@@ -19,7 +19,6 @@
  */
 package org.apache.metron.stellar.common.shell;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import com.google.common.collect.Maps;
 import org.apache.commons.collections.map.UnmodifiableMap;
 import org.apache.commons.lang3.StringUtils;
@@ -370,9 +369,7 @@ public class DefaultStellarShellExecutor implements 
StellarShellExecutor {
    */
   private Map<String, Object> fetchGlobalConfig(CuratorFramework zkClient) 
throws Exception {
     byte[] raw = readGlobalConfigBytesFromZookeeper(zkClient);
-    return JSONUtils.INSTANCE.load(
-            new ByteArrayInputStream(raw),
-            new TypeReference<Map<String, Object>>() {});
+    return JSONUtils.INSTANCE.load( new ByteArrayInputStream(raw), 
JSONUtils.MAP_SUPPLIER);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/shell/cli/StellarShell.java
----------------------------------------------------------------------
diff --git 
a/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/shell/cli/StellarShell.java
 
b/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/shell/cli/StellarShell.java
index 44ad28c..c81df61 100644
--- 
a/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/shell/cli/StellarShell.java
+++ 
b/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/shell/cli/StellarShell.java
@@ -20,7 +20,6 @@
 
 package org.apache.metron.stellar.common.shell.cli;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import com.google.common.base.Splitter;
 import com.google.common.collect.Iterables;
 import org.apache.commons.cli.CommandLine;
@@ -221,7 +220,7 @@ public class StellarShell extends AeshConsoleCallback 
implements Completion {
       String variablePath = commandLine.getOptionValue("v");
       Map<String, Object> variables = JSONUtils.INSTANCE.load(
               new File(variablePath),
-              new TypeReference<Map<String, Object>>() {});
+              JSONUtils.MAP_SUPPLIER);
 
       // for each variable...
       for(Map.Entry<String, Object> kv : variables.entrySet()) {

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/utils/JSONUtils.java
----------------------------------------------------------------------
diff --git 
a/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/utils/JSONUtils.java
 
b/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/utils/JSONUtils.java
index d7e90cf..9fb1c3f 100644
--- 
a/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/utils/JSONUtils.java
+++ 
b/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/utils/JSONUtils.java
@@ -27,6 +27,12 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Supplier;
+
 import org.json.simple.JSONObject;
 import org.json.simple.parser.JSONParser;
 import org.json.simple.parser.ParseException;
@@ -35,23 +41,48 @@ import org.json.simple.parser.ParseException;
 public enum JSONUtils {
   INSTANCE;
 
+  public static class ReferenceSupplier<T> implements 
Supplier<TypeReference<T>> {
+    Type type;
+    protected ReferenceSupplier() {
+      Type superClass = this.getClass().getGenericSuperclass();
+      if(superClass instanceof Class) {
+        throw new IllegalArgumentException("Internal error: ReferenceSupplier 
constructed without actual type information");
+      } else {
+        this.type = 
((ParameterizedType)superClass).getActualTypeArguments()[0];
+      }
+    }
+
+    @Override
+    public TypeReference<T> get() {
+      return new TypeReference<T>() {
+        @Override
+        public Type getType() {
+          return type;
+        }
+      };
+    }
+  }
+
+  public final static ReferenceSupplier<Map<String, Object>> MAP_SUPPLIER = 
new ReferenceSupplier<Map<String, Object>>(){};
+  public final static ReferenceSupplier<List<Object>> LIST_SUPPLIER = new 
ReferenceSupplier<List<Object>>(){};
+
   private static ThreadLocal<JSONParser> _parser = ThreadLocal.withInitial(() 
->
           new JSONParser());
 
   private static ThreadLocal<ObjectMapper> _mapper = 
ThreadLocal.withInitial(() ->
           new 
ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL));
 
-  public <T> T load(InputStream is, TypeReference<T> ref) throws IOException {
-    return _mapper.get().readValue(is, ref);
+  public <T> T load(InputStream is, ReferenceSupplier<T> ref) throws 
IOException {
+    return _mapper.get().readValue(is, (TypeReference<T>)ref.get());
   }
 
-  public <T> T load(String is, TypeReference<T> ref) throws IOException {
-    return _mapper.get().readValue(is, ref);
+  public <T> T load(String is, ReferenceSupplier<T> ref) throws IOException {
+    return _mapper.get().readValue(is, (TypeReference<T>)ref.get());
   }
 
-  public <T> T load(File f, TypeReference<T> ref) throws IOException {
+  public <T> T load(File f, ReferenceSupplier<T> ref) throws IOException {
     try (InputStream is = new BufferedInputStream(new FileInputStream(f))) {
-      return _mapper.get().readValue(is, ref);
+      return _mapper.get().readValue(is, (TypeReference<T>)ref.get());
     }
   }
 

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/dsl/functions/StringFunctions.java
----------------------------------------------------------------------
diff --git 
a/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/dsl/functions/StringFunctions.java
 
b/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/dsl/functions/StringFunctions.java
index 4dc4790..2865ea7 100644
--- 
a/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/dsl/functions/StringFunctions.java
+++ 
b/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/dsl/functions/StringFunctions.java
@@ -20,7 +20,6 @@ package org.apache.metron.stellar.dsl.functions;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.core.type.TypeReference;
 import com.google.common.base.Joiner;
 import com.google.common.base.Splitter;
 import com.google.common.collect.Iterables;
@@ -569,15 +568,18 @@ public class StringFunctions {
           throw new ParseException("Valid JSON string not supplied");
         }
         // Return parsed JSON Object as a HashMap
+        String in = (String)strings.get(0);
         try {
-          return JSONUtils.INSTANCE.load((String) strings.get(0), new 
TypeReference<Map<String, Object>>(){});
+          return (Map)JSONUtils.INSTANCE.load(in, JSONUtils.MAP_SUPPLIER);
         } catch (JsonProcessingException ex) {
-          throw new ParseException("Valid JSON string not supplied", ex);
-        } catch (IOException e) {
-          e.printStackTrace();
+          throw new ParseException(String.format("%s is not a valid JSON 
string", in), ex);
+        } catch (IOException ex) {
+          throw new ParseException(String.format("%s is not a valid JSON 
string", in), ex);
+        }
+        catch (ClassCastException ex) {
+          throw new ParseException(String.format("%s is not a valid JSON 
string, expected a map", in), ex);
         }
       }
-      return new ParseException("Unable to parse JSON string");
     }
   }
 
@@ -606,13 +608,16 @@ public class StringFunctions {
           throw new ParseException("Valid JSON string not supplied");
         }
         // Return parsed JSON Object as a List
+        String in = (String)strings.get(0);
         try {
-          return (List) JSONUtils.INSTANCE.load((String) strings.get(0), new 
TypeReference<List<Object>>(){});
+          return (List) JSONUtils.INSTANCE.load(in, JSONUtils.LIST_SUPPLIER);
         } catch (JsonProcessingException ex) {
-          throw new ParseException("Valid JSON string not supplied", ex);
-        } catch (IOException e) {
-          e.printStackTrace();
-          throw new ParseException("Valid JSON string not supplied", e);
+          throw new ParseException(String.format("%s is not a valid JSON 
string", in), ex);
+        } catch (IOException ex) {
+          throw new ParseException(String.format("%s is not a valid JSON 
string", in), ex);
+        }
+        catch (ClassCastException ex) {
+          throw new ParseException(String.format("%s is not a valid JSON 
string, expected a list", in), ex);
         }
       }
     }

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/common/utils/JSONUtilsTest.java
----------------------------------------------------------------------
diff --git 
a/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/common/utils/JSONUtilsTest.java
 
b/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/common/utils/JSONUtilsTest.java
index f4692e3..e28bfb7 100644
--- 
a/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/common/utils/JSONUtilsTest.java
+++ 
b/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/common/utils/JSONUtilsTest.java
@@ -17,7 +17,6 @@
  */
 package org.apache.metron.stellar.common.utils;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import org.adrianwalker.multilinestring.Multiline;
 import org.junit.Assert;
 import org.junit.BeforeClass;
@@ -54,8 +53,7 @@ public class JSONUtilsTest {
       put("a", "hello");
       put("b", "world");
     }};
-    Map<String, Object> actual = JSONUtils.INSTANCE.load(configFile, new 
TypeReference<Map<String, Object>>() {
-    });
+    Map<String, Object> actual = JSONUtils.INSTANCE.load(configFile, 
JSONUtils.MAP_SUPPLIER);
     Assert.assertThat("config not equal", actual, equalTo(expected));
   }
 

http://git-wip-us.apache.org/repos/asf/metron/blob/878003a3/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/StringFunctionsTest.java
----------------------------------------------------------------------
diff --git 
a/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/StringFunctionsTest.java
 
b/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/StringFunctionsTest.java
index 418bf2d..9f78fe1 100644
--- 
a/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/StringFunctionsTest.java
+++ 
b/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/StringFunctionsTest.java
@@ -617,7 +617,8 @@ public class StringFunctionsTest {
     //Simple Arrays
     boolean thrown = false;
     try {
-      run("TO_JSON_MAP(msg)", ImmutableMap.of("msg", string3));
+      Object o = run("TO_JSON_MAP(msg)", ImmutableMap.of("msg", string3));
+      System.out.println(string3 + " == " + o);
     } catch (ParseException pe) {
       thrown = true;
     }
@@ -656,7 +657,7 @@ public class StringFunctionsTest {
       run("TO_JSON_MAP('123, 456')", new HashedMap<>());
     } catch (ParseException pe) {
       thrown = true;
-      Assert.assertTrue(pe.getMessage().contains("Valid JSON string not 
supplied"));
+      Assert.assertTrue(pe.getMessage().contains("is not a valid JSON 
string"));
     }
     Assert.assertTrue(thrown);
     thrown = false;
@@ -666,7 +667,7 @@ public class StringFunctionsTest {
       run("TO_JSON_MAP('{\"foo\" : 2')", new HashedMap<>());
     } catch (ParseException pe) {
       thrown = true;
-      Assert.assertTrue(pe.getMessage().contains("Valid JSON string not 
supplied"));
+      Assert.assertTrue(pe.getMessage().contains("is not a valid JSON 
string"));
     }
     Assert.assertTrue(thrown);
     thrown = false;
@@ -730,7 +731,7 @@ public class StringFunctionsTest {
       run("TO_JSON_LIST('123, 456')", new HashedMap<>());
     } catch (ParseException pe) {
       thrown = true;
-      Assert.assertTrue(pe.getMessage().contains("Valid JSON string not 
supplied"));
+      Assert.assertTrue(pe.getMessage().contains("is not a valid JSON 
string"));
     }
     Assert.assertTrue(thrown);
 
@@ -740,7 +741,7 @@ public class StringFunctionsTest {
       run("TO_JSON_LIST('{\"foo\" : 2')", new HashedMap<>());
     } catch (ParseException pe) {
       thrown = true;
-      Assert.assertTrue(pe.getMessage().contains("Valid JSON string not 
supplied"));
+      Assert.assertTrue(pe.getMessage().contains("is not a valid JSON 
string"));
     }
     Assert.assertTrue(thrown);
   }

Reply via email to