You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metron.apache.org by ce...@apache.org on 2016/09/27 13:23:01 UTC

incubator-metron git commit: METRON-449 JSONMapParser should unfold maps to arbitrary depths closes apache/incubator-metron#271

Repository: incubator-metron
Updated Branches:
  refs/heads/master 3d5f279ca -> d0d6c2c35


METRON-449 JSONMapParser should unfold maps to arbitrary depths closes apache/incubator-metron#271


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

Branch: refs/heads/master
Commit: d0d6c2c359f5e4afaaeabbd9e32331c688405c2f
Parents: 3d5f279
Author: Otto Fowler <of...@industrialdefender.com>
Authored: Tue Sep 27 09:22:41 2016 -0400
Committer: cstella <ce...@gmail.com>
Committed: Tue Sep 27 09:22:41 2016 -0400

----------------------------------------------------------------------
 .../metron/parsers/json/JSONMapParser.java      | 21 ++++++++------
 .../metron/parsers/json/JSONMapParserTest.java  | 30 ++++++++++++++++++--
 2 files changed, 41 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/d0d6c2c3/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 0bcf0f5..5d82456 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
@@ -24,8 +24,6 @@ import org.apache.metron.common.utils.JSONUtils;
 import org.apache.metron.parsers.BasicParser;
 import org.json.simple.JSONObject;
 
-import java.io.IOException;
-import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -37,12 +35,7 @@ public class JSONMapParser extends BasicParser {
   public static enum MapStrategy implements Handler {
      DROP((key, value, obj) -> obj)
     ,UNFOLD( (key, value, obj) -> {
-      Set<Map.Entry<Object, Object>> entrySet = value.entrySet();
-      for(Map.Entry<Object, Object> kv : entrySet) {
-        String newKey = Joiner.on(".").join(key, kv.getKey().toString());
-        obj.put(newKey, kv.getValue());
-      }
-      return obj;
+      return recursiveUnfold(key,value,obj);
     })
     ,ALLOW((key, value, obj) -> {
       obj.put(key, value);
@@ -57,6 +50,18 @@ public class JSONMapParser extends BasicParser {
       this.handler = handler;
     }
 
+    private static JSONObject recursiveUnfold(String key, Map value, JSONObject obj){
+      Set<Map.Entry<Object, Object>> entrySet = value.entrySet();
+      for(Map.Entry<Object, Object> kv : entrySet) {
+        String newKey = Joiner.on(".").join(key, kv.getKey().toString());
+        if(kv.getValue() instanceof Map){
+          recursiveUnfold(newKey,(Map)kv.getValue(),obj);
+        }else {
+          obj.put(newKey, kv.getValue());
+        }
+      }
+      return obj;
+    }
     @Override
     public JSONObject handle(String key, Map value, JSONObject obj) {
       return handler.handle(key, value, obj);

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/d0d6c2c3/metron-platform/metron-parsers/src/test/java/org/apache/metron/parsers/json/JSONMapParserTest.java
----------------------------------------------------------------------
diff --git a/metron-platform/metron-parsers/src/test/java/org/apache/metron/parsers/json/JSONMapParserTest.java b/metron-platform/metron-parsers/src/test/java/org/apache/metron/parsers/json/JSONMapParserTest.java
index 1299d97..61748e7 100644
--- a/metron-platform/metron-parsers/src/test/java/org/apache/metron/parsers/json/JSONMapParserTest.java
+++ b/metron-platform/metron-parsers/src/test/java/org/apache/metron/parsers/json/JSONMapParserTest.java
@@ -56,12 +56,23 @@ public class JSONMapParserTest {
 
   /**
    {
-    "collection" : { "blah" : 7, "blah2" : "foo" }
+    "collection" : { "blah" : 7, "blah2" : "foo", "bigblah" : { "innerBlah" : "baz", "reallyInnerBlah" : { "color" : "grey" }}}
    }
    */
    @Multiline
    static String collectionHandlingJSON;
 
+  /**
+    {
+     "collection" : {
+        "key" : "value"
+      },
+     "key" : "value"
+    }
+   */
+  @Multiline
+  static String mixCollectionHandlingJSON;
+
   @Test
   public void testCollectionHandlingDrop() {
     JSONMapParser parser = new JSONMapParser();
@@ -102,11 +113,26 @@ public class JSONMapParserTest {
     List<JSONObject> output = parser.parse(collectionHandlingJSON.getBytes());
     Assert.assertEquals(output.size(), 1);
     //don't forget the timestamp field!
-    Assert.assertEquals(output.get(0).size(), 4);
+    Assert.assertEquals(output.get(0).size(), 6);
     JSONObject message = output.get(0);
     Assert.assertEquals(message.get("collection.blah"), 7);
     Assert.assertEquals(message.get("collection.blah2"), "foo");
+    Assert.assertEquals(message.get("collection.bigblah.innerBlah"),"baz");
+    Assert.assertEquals(message.get("collection.bigblah.reallyInnerBlah.color"),"grey");
     Assert.assertNotNull(message.get("timestamp"));
     Assert.assertTrue(message.get("timestamp") instanceof Number);
   }
+
+  @Test
+  public void testMixedCollectionHandlingUnfold() {
+    JSONMapParser parser = new JSONMapParser();
+    parser.configure(ImmutableMap.of(JSONMapParser.MAP_STRATEGY_CONFIG,JSONMapParser.MapStrategy.UNFOLD.name()));
+    List<JSONObject> output = parser.parse(mixCollectionHandlingJSON.getBytes());
+    Assert.assertEquals(output.get(0).size(), 4);
+    JSONObject message = output.get(0);
+    Assert.assertEquals(message.get("collection.key"), "value");
+    Assert.assertEquals(message.get("key"),"value");
+    Assert.assertNotNull(message.get("timestamp"));
+    Assert.assertTrue(message.get("timestamp") instanceof Number );
+  }
 }