From f5e1301fe0e7077aafe1132b829af83ef129dce5 Mon Sep 17 00:00:00 2001 From: Vikram Kadi Date: Mon, 11 Nov 2013 23:10:43 -0800 Subject: [PATCH 01/14] Initial commit for json serialization --- pom.xml | 9 +- src/main/java/org/lwes/ArrayEvent.java | 13 ++ src/main/java/org/lwes/Event.java | 2 + src/main/java/org/lwes/EventFactory.java | 18 ++ .../java/org/lwes/EventImplementation.java | 5 + src/main/java/org/lwes/MapEvent.java | 7 + src/main/java/org/lwes/TypeValue.java | 19 ++ .../org/lwes/serializer/JsonDeserializer.java | 167 ++++++++++++++++++ .../org/lwes/serializer/JsonSerializer.java | 64 +++++++ .../JsonSerializerDeSerializerTest.java | 76 ++++++++ 10 files changed, 379 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/lwes/EventImplementation.java create mode 100644 src/main/java/org/lwes/TypeValue.java create mode 100644 src/main/java/org/lwes/serializer/JsonDeserializer.java create mode 100644 src/main/java/org/lwes/serializer/JsonSerializer.java create mode 100644 src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java diff --git a/pom.xml b/pom.xml index abf34fd..c9ada0c 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ org.lwes lwes-java jar - 1.4.3-SNAPSHOT + 1.4.4-SNAPSHOT lwes-java Lightweight event system, java implementation http://lwes.org @@ -48,6 +48,13 @@ + + + com.google.code.gson + gson + 2.2.4 + + junit junit diff --git a/src/main/java/org/lwes/ArrayEvent.java b/src/main/java/org/lwes/ArrayEvent.java index 74d68f6..afffc93 100644 --- a/src/main/java/org/lwes/ArrayEvent.java +++ b/src/main/java/org/lwes/ArrayEvent.java @@ -18,14 +18,18 @@ import java.util.EnumMap; import java.util.Enumeration; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; import java.util.SortedSet; import java.util.TreeSet; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.mutable.MutableInt; import org.lwes.serializer.Deserializer; import org.lwes.serializer.DeserializerState; +import org.lwes.serializer.JsonDeserializer; +import org.lwes.serializer.JsonSerializer; import org.lwes.serializer.Serializer; import org.lwes.util.EncodedString; @@ -38,6 +42,7 @@ public final class ArrayEvent extends DefaultEvent { private short encoding = DEFAULT_ENCODING; private static Map STATS = new EnumMap(ArrayEventStats.class); + private Map attributes; static { byte[] temp = new byte[256]; @@ -51,6 +56,7 @@ public final class ArrayEvent extends DefaultEvent { // * UINT64|INT64|BOOLEAN|STRING) public ArrayEvent() { + attributes = new LinkedHashMap(); length = getValueListIndex(); setEncoding(DEFAULT_ENCODING); final MutableInt creations = STATS.get(ArrayEventStats.CREATIONS); @@ -168,6 +174,7 @@ public void set(String key, FieldType type, Object value) { if (oldType == type && type.isConstantSize()) { // Modify the value in place, requiring no shifts. Serializer.serializeValue(type, value, encoding, bytes, tokenIndex + 1); + attributes.put(key, new BaseType(type, value)); return; } clear(key); @@ -192,6 +199,7 @@ private void appendField(String key, FieldType type, Object value) { length += Serializer.serializeATTRIBUTEWORD(key, bytes, length); length += Serializer.serializeBYTE(type.token, bytes, length); length += Serializer.serializeValue(type, value, encoding, bytes, length); + attributes.put(key, new BaseType(type, value)); setNumEventAttributes(getNumEventAttributes() + 1); } catch (ArrayIndexOutOfBoundsException e) { @@ -679,4 +687,9 @@ public Object getValue() { return value; } } + + public String toJson() { + return JsonSerializer.getInstance().toJson(getEventName(), attributes); + } + } diff --git a/src/main/java/org/lwes/Event.java b/src/main/java/org/lwes/Event.java index 704b306..7fec063 100644 --- a/src/main/java/org/lwes/Event.java +++ b/src/main/java/org/lwes/Event.java @@ -226,6 +226,8 @@ public interface Event extends Iterable { void deserialize(DataInput stream, int length) throws IOException; int getBytesSize(); + + String toJson(); // MISCELLANEOUS diff --git a/src/main/java/org/lwes/EventFactory.java b/src/main/java/org/lwes/EventFactory.java index 3c0e711..4dee32b 100644 --- a/src/main/java/org/lwes/EventFactory.java +++ b/src/main/java/org/lwes/EventFactory.java @@ -13,6 +13,7 @@ package org.lwes; import org.lwes.db.EventTemplateDB; +import org.lwes.serializer.JsonDeserializer; import java.io.File; import java.io.InputStream; @@ -189,5 +190,22 @@ public Event createEvent(byte[] bytes, boolean validate) throws EventSystemExcep } return new MapEvent(bytes, validate, eventTemplateDB); } + + /** + * Create an event from its json representation + * @param json + * @param type + * @return + */ + public Event createEventFromJson(String json, EventImplementation type){ + JsonDeserializer deSerializer = JsonDeserializer.getInstance(); + switch (type) { + case MAP_EVENT: + return deSerializer.fromJson(json, new MapEvent()); + case ARRAY_EVENT: + return deSerializer.fromJson(json, new ArrayEvent()); + } + return null; + } } diff --git a/src/main/java/org/lwes/EventImplementation.java b/src/main/java/org/lwes/EventImplementation.java new file mode 100644 index 0000000..07b12e4 --- /dev/null +++ b/src/main/java/org/lwes/EventImplementation.java @@ -0,0 +1,5 @@ +package org.lwes; + +public enum EventImplementation { + MAP_EVENT, ARRAY_EVENT; +} diff --git a/src/main/java/org/lwes/MapEvent.java b/src/main/java/org/lwes/MapEvent.java index 0db5336..2eed6b9 100644 --- a/src/main/java/org/lwes/MapEvent.java +++ b/src/main/java/org/lwes/MapEvent.java @@ -23,6 +23,8 @@ import org.lwes.db.EventTemplateDB; import org.lwes.serializer.Deserializer; import org.lwes.serializer.DeserializerState; +import org.lwes.serializer.JsonDeserializer; +import org.lwes.serializer.JsonSerializer; import org.lwes.serializer.Serializer; public class MapEvent extends DefaultEvent { @@ -606,4 +608,9 @@ public FieldType getType(String field) { public int getBytesSize() { return bytesStoreSize; } + + public String toJson() { + return JsonSerializer.getInstance().toJson(name, attributes); + } + } diff --git a/src/main/java/org/lwes/TypeValue.java b/src/main/java/org/lwes/TypeValue.java new file mode 100644 index 0000000..e5f6129 --- /dev/null +++ b/src/main/java/org/lwes/TypeValue.java @@ -0,0 +1,19 @@ +package org.lwes; + +public class TypeValue { + + private String type; + private String value; + public String getType() { + return type; + } + public String getValue() { + return value; + } + public TypeValue(String type, String value) { + super(); + this.type = type; + this.value = value; + } + +} diff --git a/src/main/java/org/lwes/serializer/JsonDeserializer.java b/src/main/java/org/lwes/serializer/JsonDeserializer.java new file mode 100644 index 0000000..78894f5 --- /dev/null +++ b/src/main/java/org/lwes/serializer/JsonDeserializer.java @@ -0,0 +1,167 @@ +package org.lwes.serializer; + +import java.math.BigInteger; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.apache.commons.lang3.StringUtils; +import org.lwes.Event; +import org.lwes.FieldType; +import org.lwes.MapEvent; +import org.lwes.TypeValue; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + +public class JsonDeserializer { + +private static JsonDeserializer instance; + + private Gson gson; + private JsonParser parser; + + public static JsonDeserializer getInstance(){ + if(instance == null){ + synchronized (JsonSerializer.class) { + //Double-checked locking + if(instance == null) + instance = new JsonDeserializer(); + } + } + return instance; + } + + private JsonDeserializer(){ + parser = new JsonParser(); + GsonBuilder bldr = new GsonBuilder(); + gson = bldr.create(); + } + + public Event fromJson(String json, Event e){ + try{ + JsonObject root = parser.parse(json).getAsJsonObject(); + String name = root.getAsJsonPrimitive("name").getAsString(); + if(StringUtils.isEmpty(name)) + return null; + JsonObject typedContainer = root.getAsJsonObject("typed"); + if(typedContainer == null) + return null; + Map typedElems = parseTyped(typedContainer); + + e.setEventName(name); + for(Entry element : typedElems.entrySet()){ + FieldType ft = FieldType.byName(element.getValue().getType()); + e.set(element.getKey(), + FieldType.byName(element.getValue().getType()), + getObjectForType(ft, element.getValue().getValue())); + } + + }catch(Exception ex){ + ex.printStackTrace(); + return null; + } + return e; + } + + Map parseTyped(JsonObject typedContainer){ + Set> types = typedContainer.entrySet(); + Map typedElements = new HashMap(); + for(Entry type : types){ + TypeValue tv = getTypeValue(type.getValue().getAsJsonObject()); + if(tv != null) + typedElements.put(type.getKey(), tv); + } + return typedElements; + } + + TypeValue getTypeValue(JsonObject typedElement){ + String type = typedElement.getAsJsonPrimitive("type").getAsString(); + String value = typedElement.getAsJsonPrimitive("value").getAsString(); + FieldType fType = FieldType.byName(type); + if(fType == null) + return null; + return new TypeValue(fType.name, value); + } + + Object getObjectForType(FieldType ft, String str){ + switch (ft) { + case BOOLEAN: + return gson.fromJson(str, Boolean.class); + case BYTE: + return gson.fromJson(str, Byte.class); + case DOUBLE: + return gson.fromJson(str, Double.class); + case FLOAT: + return gson.fromJson(str, Float.class); + case INT16: + return gson.fromJson(str, Short.class); + case INT32: + return gson.fromJson(str, Integer.class); + case INT64: + return gson.fromJson(str, Long.class); + case IPADDR: + return gson.fromJson(str, String.class); + case STRING: + return gson.fromJson(str, String.class); + case UINT16: + return gson.fromJson(str, Integer.class); + case UINT32: + return gson.fromJson(str, Long.class); + case UINT64: + return gson.fromJson(str, BigInteger.class); + case BOOLEAN_ARRAY: + return gson.fromJson(str, boolean[].class); + case BYTE_ARRAY: + return gson.fromJson(str, byte[].class); + case DOUBLE_ARRAY: + return gson.fromJson(str, double[].class); + case FLOAT_ARRAY: + return gson.fromJson(str, float[].class); + case INT16_ARRAY: + return gson.fromJson(str, short[].class); + case INT32_ARRAY: + return gson.fromJson(str, int[].class); + case INT64_ARRAY: + return gson.fromJson(str, long[].class); + case IP_ADDR_ARRAY: + return gson.fromJson(str, String[].class); + case STRING_ARRAY: + return gson.fromJson(str, String[].class); + case UINT16_ARRAY: + return gson.fromJson(str, int[].class); + case UINT32_ARRAY: + return gson.fromJson(str, long[].class); + case UINT64_ARRAY: + return gson.fromJson(str, BigInteger[].class); + case NBOOLEAN_ARRAY: + return gson.fromJson(str, Boolean[].class); + case NBYTE_ARRAY: + return gson.fromJson(str, Byte[].class); + case NDOUBLE_ARRAY: + return gson.fromJson(str, Double[].class); + case NFLOAT_ARRAY: + return gson.fromJson(str, Float[].class); + case NINT16_ARRAY: + return gson.fromJson(str, Short[].class); + case NINT32_ARRAY: + return gson.fromJson(str, Integer[].class); + case NINT64_ARRAY: + return gson.fromJson(str, Long[].class); + case NSTRING_ARRAY: + return gson.fromJson(str, String[].class); + case NUINT16_ARRAY: + return gson.fromJson(str, Integer[].class); + case NUINT32_ARRAY: + return gson.fromJson(str, Long[].class); + case NUINT64_ARRAY: + return gson.fromJson(str, BigInteger[].class); + default: + return str; + } + } +} diff --git a/src/main/java/org/lwes/serializer/JsonSerializer.java b/src/main/java/org/lwes/serializer/JsonSerializer.java new file mode 100644 index 0000000..908f2b5 --- /dev/null +++ b/src/main/java/org/lwes/serializer/JsonSerializer.java @@ -0,0 +1,64 @@ +package org.lwes.serializer; + +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import org.lwes.BaseType; +import org.lwes.TypeValue; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +public class JsonSerializer { + + private static JsonSerializer instance; + + private Gson gson; + + public static JsonSerializer getInstance(){ + if(instance == null){ + synchronized (JsonSerializer.class) { + //Double-checked locking + if(instance == null) + instance = new JsonSerializer(); + } + } + return instance; + } + + private JsonSerializer(){ + GsonBuilder bldr = new GsonBuilder(); + gson = bldr.create(); + } + + public String toJson(String eventName, Map attrs){ + Map jsonContainer = jsonRepresentation(eventName, attrs); + return gson.toJson(jsonContainer); + } + + public Map jsonRepresentation(String name, Map attrs){ + Map container = new HashMap(); + container.put("name", name); + container.put("attributes", getAttributes(name, attrs)); + container.put("typed", getTypedAttributes(attrs)); + return container; + } + + private Object getTypedAttributes(Map attrs) { + Map typedAttrs = new HashMap(); + for(Entry attr : attrs.entrySet()){ + typedAttrs.put(attr.getKey(), new TypeValue(attr.getValue().getType().name, gson.toJson(attr.getValue().getTypeObject()))); + } + return typedAttrs; + } + + private Object getAttributes(String name, Map attrs) { + Map attributes = new HashMap(); + attributes.put("EventName", name); + for(Entry attr : attrs.entrySet()){ + attributes.put(attr.getKey(),attr.getValue().getTypeObject()); + } + return attributes; + } +} diff --git a/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java b/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java new file mode 100644 index 0000000..37788e9 --- /dev/null +++ b/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java @@ -0,0 +1,76 @@ +package org.lwes.serializer; + +import java.math.BigInteger; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.lwes.ArrayEvent; +import org.lwes.Event; +import org.lwes.EventFactory; +import org.lwes.EventImplementation; +import org.lwes.FieldType; +import org.lwes.MapEvent; + +public class JsonSerializerDeSerializerTest { + + JsonDeserializer jDeserializer; + EventFactory factory; + + @Before + public void setup(){ + factory = new EventFactory(); + jDeserializer = JsonDeserializer.getInstance(); + } + + @Test + public void testSimpleSerializeDeserializeMapEvent(){ + Event evt = new MapEvent("json-event"); + setEventProperties(evt); + Event rebornEvt = factory.createEventFromJson(evt.toJson(), EventImplementation.MAP_EVENT); + Assert.assertEquals(evt, rebornEvt); + } + + @Test + public void testSimpleSerializeDeserializeArrayEvent(){ + Event evt = new ArrayEvent("json-event"); + setEventProperties(evt); + Event rebornEvt = factory.createEventFromJson(evt.toJson(), EventImplementation.ARRAY_EVENT); + Assert.assertEquals(evt, rebornEvt); + } + + public void setEventProperties(Event evt){ + + evt.set("key", FieldType.STRING, "value"); + evt.set("boolean", FieldType.BOOLEAN, true); + evt.set("byte", FieldType.BYTE, Byte.parseByte("32")); + evt.set("double", FieldType.DOUBLE, 5.0); + evt.set("float", FieldType.FLOAT, 1.2f); + evt.set("int16", FieldType.INT16, (short) 10); + evt.set("uint16", FieldType.UINT16, 10); + evt.set("int32", FieldType.INT32, 10); + evt.set("uint32", FieldType.UINT32, 10l); + evt.set("int64", FieldType.INT64, 10l); + evt.set("uint64", FieldType.UINT64, new BigInteger("10000000000000")); + + evt.set("int16[]", FieldType.INT16_ARRAY, new short[] {(short) 10}); + evt.set("uint16[]", FieldType.UINT16_ARRAY, new int[] {10}); + evt.set("int32[]", FieldType.INT32_ARRAY, new int[] {10}); + evt.set("uint32[]", FieldType.UINT32_ARRAY, new long[] {10l}); + evt.set("int64[]", FieldType.INT64_ARRAY, new long[] {10l}); + evt.set("uint64[]", FieldType.UINT64_ARRAY, new BigInteger[] {new BigInteger("10000000000000")}); + evt.set("boolean[]", FieldType.BOOLEAN_ARRAY, new boolean[] {true}); + evt.set("byte[]", FieldType.BYTE_ARRAY, new byte[] {Byte.parseByte("32")}); + evt.set("double[]", FieldType.DOUBLE_ARRAY, new double[] {5.0}); + evt.set("float[]", FieldType.FLOAT_ARRAY, new float[] {1.2f}); + evt.set("string[]", FieldType.STRING_ARRAY, new String[] {"value"}); + + evt.set("long[]", FieldType.NINT64_ARRAY, new Long[] { 5000000000l, null, 8675309l }); + evt.set("short[]", FieldType.NUINT16_ARRAY, new Integer[] { 5, null, 10 }); + evt.set("double[]", FieldType.NDOUBLE_ARRAY, new Double[] { 1.23, null, 1.26 }); + evt.set("float[]", FieldType.NFLOAT_ARRAY, new Float[] { 1.11f, 1.12f, null }); + + } + + +} From eb8073088fdfb6fa234ab511f133c61265c01ebb Mon Sep 17 00:00:00 2001 From: Vikram Kadi Date: Tue, 12 Nov 2013 00:04:00 -0800 Subject: [PATCH 02/14] organize imports --- src/main/java/org/lwes/ArrayEvent.java | 2 -- src/main/java/org/lwes/MapEvent.java | 1 - src/main/java/org/lwes/serializer/JsonDeserializer.java | 1 - 3 files changed, 4 deletions(-) diff --git a/src/main/java/org/lwes/ArrayEvent.java b/src/main/java/org/lwes/ArrayEvent.java index afffc93..66ae7e0 100644 --- a/src/main/java/org/lwes/ArrayEvent.java +++ b/src/main/java/org/lwes/ArrayEvent.java @@ -24,11 +24,9 @@ import java.util.SortedSet; import java.util.TreeSet; -import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.mutable.MutableInt; import org.lwes.serializer.Deserializer; import org.lwes.serializer.DeserializerState; -import org.lwes.serializer.JsonDeserializer; import org.lwes.serializer.JsonSerializer; import org.lwes.serializer.Serializer; import org.lwes.util.EncodedString; diff --git a/src/main/java/org/lwes/MapEvent.java b/src/main/java/org/lwes/MapEvent.java index 2eed6b9..cc4ea01 100644 --- a/src/main/java/org/lwes/MapEvent.java +++ b/src/main/java/org/lwes/MapEvent.java @@ -23,7 +23,6 @@ import org.lwes.db.EventTemplateDB; import org.lwes.serializer.Deserializer; import org.lwes.serializer.DeserializerState; -import org.lwes.serializer.JsonDeserializer; import org.lwes.serializer.JsonSerializer; import org.lwes.serializer.Serializer; diff --git a/src/main/java/org/lwes/serializer/JsonDeserializer.java b/src/main/java/org/lwes/serializer/JsonDeserializer.java index 78894f5..9851c6f 100644 --- a/src/main/java/org/lwes/serializer/JsonDeserializer.java +++ b/src/main/java/org/lwes/serializer/JsonDeserializer.java @@ -9,7 +9,6 @@ import org.apache.commons.lang3.StringUtils; import org.lwes.Event; import org.lwes.FieldType; -import org.lwes.MapEvent; import org.lwes.TypeValue; import com.google.gson.Gson; From 26bc1868fe504855ea5fc214437685a498799550 Mon Sep 17 00:00:00 2001 From: Vikram Kadi Date: Tue, 12 Nov 2013 08:32:54 -0800 Subject: [PATCH 03/14] Refine tests --- .../org/lwes/serializer/JsonDeserializer.java | 153 +++++++++--------- .../JsonSerializerDeSerializerTest.java | 4 + 2 files changed, 84 insertions(+), 73 deletions(-) diff --git a/src/main/java/org/lwes/serializer/JsonDeserializer.java b/src/main/java/org/lwes/serializer/JsonDeserializer.java index 9851c6f..d486252 100644 --- a/src/main/java/org/lwes/serializer/JsonDeserializer.java +++ b/src/main/java/org/lwes/serializer/JsonDeserializer.java @@ -10,6 +10,7 @@ import org.lwes.Event; import org.lwes.FieldType; import org.lwes.TypeValue; +import org.lwes.util.IPAddress; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -87,80 +88,86 @@ TypeValue getTypeValue(JsonObject typedElement){ return new TypeValue(fType.name, value); } - Object getObjectForType(FieldType ft, String str){ + Object getObjectForType(FieldType ft, String str) { + //Giant switch statement dervied from Serializer.serializeValue's + //type system definition switch (ft) { - case BOOLEAN: - return gson.fromJson(str, Boolean.class); - case BYTE: - return gson.fromJson(str, Byte.class); - case DOUBLE: - return gson.fromJson(str, Double.class); - case FLOAT: - return gson.fromJson(str, Float.class); - case INT16: - return gson.fromJson(str, Short.class); - case INT32: - return gson.fromJson(str, Integer.class); - case INT64: - return gson.fromJson(str, Long.class); - case IPADDR: - return gson.fromJson(str, String.class); - case STRING: - return gson.fromJson(str, String.class); - case UINT16: - return gson.fromJson(str, Integer.class); - case UINT32: - return gson.fromJson(str, Long.class); - case UINT64: - return gson.fromJson(str, BigInteger.class); - case BOOLEAN_ARRAY: - return gson.fromJson(str, boolean[].class); - case BYTE_ARRAY: - return gson.fromJson(str, byte[].class); - case DOUBLE_ARRAY: - return gson.fromJson(str, double[].class); - case FLOAT_ARRAY: - return gson.fromJson(str, float[].class); - case INT16_ARRAY: - return gson.fromJson(str, short[].class); - case INT32_ARRAY: - return gson.fromJson(str, int[].class); - case INT64_ARRAY: - return gson.fromJson(str, long[].class); - case IP_ADDR_ARRAY: - return gson.fromJson(str, String[].class); - case STRING_ARRAY: - return gson.fromJson(str, String[].class); - case UINT16_ARRAY: - return gson.fromJson(str, int[].class); - case UINT32_ARRAY: - return gson.fromJson(str, long[].class); - case UINT64_ARRAY: - return gson.fromJson(str, BigInteger[].class); - case NBOOLEAN_ARRAY: - return gson.fromJson(str, Boolean[].class); - case NBYTE_ARRAY: - return gson.fromJson(str, Byte[].class); - case NDOUBLE_ARRAY: - return gson.fromJson(str, Double[].class); - case NFLOAT_ARRAY: - return gson.fromJson(str, Float[].class); - case NINT16_ARRAY: - return gson.fromJson(str, Short[].class); - case NINT32_ARRAY: - return gson.fromJson(str, Integer[].class); - case NINT64_ARRAY: - return gson.fromJson(str, Long[].class); - case NSTRING_ARRAY: - return gson.fromJson(str, String[].class); - case NUINT16_ARRAY: - return gson.fromJson(str, Integer[].class); - case NUINT32_ARRAY: - return gson.fromJson(str, Long[].class); - case NUINT64_ARRAY: - return gson.fromJson(str, BigInteger[].class); - default: - return str; + case BOOLEAN: + return getObjectForType(str, Boolean.class); + case BYTE: + return getObjectForType(str, Byte.class); + case DOUBLE: + return getObjectForType(str, Double.class); + case FLOAT: + return getObjectForType(str, Float.class); + case INT16: + return getObjectForType(str, Short.class); + case INT32: + return getObjectForType(str, Integer.class); + case INT64: + return getObjectForType(str, Long.class); + case IPADDR: + return getObjectForType(str, IPAddress.class); + case STRING: + return getObjectForType(str, String.class); + case UINT16: + return getObjectForType(str, Integer.class); + case UINT32: + return getObjectForType(str, Long.class); + case UINT64: + return getObjectForType(str, BigInteger.class); + case BOOLEAN_ARRAY: + return getObjectForType(str, boolean[].class); + case BYTE_ARRAY: + return getObjectForType(str, byte[].class); + case DOUBLE_ARRAY: + return getObjectForType(str, double[].class); + case FLOAT_ARRAY: + return getObjectForType(str, float[].class); + case INT16_ARRAY: + return getObjectForType(str, short[].class); + case INT32_ARRAY: + return getObjectForType(str, int[].class); + case INT64_ARRAY: + return getObjectForType(str, long[].class); + case IP_ADDR_ARRAY: + return getObjectForType(str, IPAddress[].class); + case STRING_ARRAY: + return getObjectForType(str, String[].class); + case UINT16_ARRAY: + return getObjectForType(str, int[].class); + case UINT32_ARRAY: + return getObjectForType(str, long[].class); + case UINT64_ARRAY: + return getObjectForType(str, BigInteger[].class); + case NBOOLEAN_ARRAY: + return getObjectForType(str, Boolean[].class); + case NBYTE_ARRAY: + return getObjectForType(str, Byte[].class); + case NDOUBLE_ARRAY: + return getObjectForType(str, Double[].class); + case NFLOAT_ARRAY: + return getObjectForType(str, Float[].class); + case NINT16_ARRAY: + return getObjectForType(str, Short[].class); + case NINT32_ARRAY: + return getObjectForType(str, Integer[].class); + case NINT64_ARRAY: + return getObjectForType(str, Long[].class); + case NSTRING_ARRAY: + return getObjectForType(str, String[].class); + case NUINT16_ARRAY: + return getObjectForType(str, Integer[].class); + case NUINT32_ARRAY: + return getObjectForType(str, Long[].class); + case NUINT64_ARRAY: + return getObjectForType(str, BigInteger[].class); + default: + return str; } } + + Object getObjectForType(String str, Class clz){ + return gson.fromJson(str, clz); + } } diff --git a/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java b/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java index 37788e9..05bcef4 100644 --- a/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java +++ b/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java @@ -11,6 +11,7 @@ import org.lwes.EventImplementation; import org.lwes.FieldType; import org.lwes.MapEvent; +import org.lwes.util.IPAddress; public class JsonSerializerDeSerializerTest { @@ -52,6 +53,7 @@ public void setEventProperties(Event evt){ evt.set("uint32", FieldType.UINT32, 10l); evt.set("int64", FieldType.INT64, 10l); evt.set("uint64", FieldType.UINT64, new BigInteger("10000000000000")); + evt.set("ipaddr", FieldType.IPADDR, new IPAddress("127.0.0.1")); evt.set("int16[]", FieldType.INT16_ARRAY, new short[] {(short) 10}); evt.set("uint16[]", FieldType.UINT16_ARRAY, new int[] {10}); @@ -64,6 +66,8 @@ public void setEventProperties(Event evt){ evt.set("double[]", FieldType.DOUBLE_ARRAY, new double[] {5.0}); evt.set("float[]", FieldType.FLOAT_ARRAY, new float[] {1.2f}); evt.set("string[]", FieldType.STRING_ARRAY, new String[] {"value"}); + evt.set("ipaddr[]", FieldType.IP_ADDR_ARRAY, new IPAddress[]{new IPAddress("10.0.13.217")}); + evt.set("long[]", FieldType.NINT64_ARRAY, new Long[] { 5000000000l, null, 8675309l }); evt.set("short[]", FieldType.NUINT16_ARRAY, new Integer[] { 5, null, 10 }); From 95d58ba39f8721e9d91e18ea3c914bd9caf5b195 Mon Sep 17 00:00:00 2001 From: Vikram Kadi Date: Tue, 12 Nov 2013 23:32:01 -0800 Subject: [PATCH 04/14] refactoring --- src/main/java/org/lwes/ArrayEvent.java | 11 ++++++----- src/main/java/org/lwes/Event.java | 2 ++ src/main/java/org/lwes/MapEvent.java | 4 ++++ .../java/org/lwes/serializer/JsonSerializer.java | 13 ++++++++++++- src/main/java/org/lwes/util/EventTranslator.java | 15 +++++++++++++++ .../JsonSerializerDeSerializerTest.java | 4 ++-- 6 files changed, 41 insertions(+), 8 deletions(-) create mode 100644 src/main/java/org/lwes/util/EventTranslator.java diff --git a/src/main/java/org/lwes/ArrayEvent.java b/src/main/java/org/lwes/ArrayEvent.java index 66ae7e0..92fff66 100644 --- a/src/main/java/org/lwes/ArrayEvent.java +++ b/src/main/java/org/lwes/ArrayEvent.java @@ -30,6 +30,7 @@ import org.lwes.serializer.JsonSerializer; import org.lwes.serializer.Serializer; import org.lwes.util.EncodedString; +import org.lwes.util.EventTranslator; public final class ArrayEvent extends DefaultEvent { @@ -40,7 +41,6 @@ public final class ArrayEvent extends DefaultEvent { private short encoding = DEFAULT_ENCODING; private static Map STATS = new EnumMap(ArrayEventStats.class); - private Map attributes; static { byte[] temp = new byte[256]; @@ -54,7 +54,6 @@ public final class ArrayEvent extends DefaultEvent { // * UINT64|INT64|BOOLEAN|STRING) public ArrayEvent() { - attributes = new LinkedHashMap(); length = getValueListIndex(); setEncoding(DEFAULT_ENCODING); final MutableInt creations = STATS.get(ArrayEventStats.CREATIONS); @@ -172,7 +171,6 @@ public void set(String key, FieldType type, Object value) { if (oldType == type && type.isConstantSize()) { // Modify the value in place, requiring no shifts. Serializer.serializeValue(type, value, encoding, bytes, tokenIndex + 1); - attributes.put(key, new BaseType(type, value)); return; } clear(key); @@ -197,7 +195,6 @@ private void appendField(String key, FieldType type, Object value) { length += Serializer.serializeATTRIBUTEWORD(key, bytes, length); length += Serializer.serializeBYTE(type.token, bytes, length); length += Serializer.serializeValue(type, value, encoding, bytes, length); - attributes.put(key, new BaseType(type, value)); setNumEventAttributes(getNumEventAttributes() + 1); } catch (ArrayIndexOutOfBoundsException e) { @@ -687,7 +684,11 @@ public Object getValue() { } public String toJson() { - return JsonSerializer.getInstance().toJson(getEventName(), attributes); + return EventTranslator.arrayToMapEvent(this).toJson(); + } + + public String toTypedJson() { + return EventTranslator.arrayToMapEvent(this).toTypedJson(); } } diff --git a/src/main/java/org/lwes/Event.java b/src/main/java/org/lwes/Event.java index 7fec063..7ff7e3f 100644 --- a/src/main/java/org/lwes/Event.java +++ b/src/main/java/org/lwes/Event.java @@ -229,6 +229,8 @@ public interface Event extends Iterable { String toJson(); + String toTypedJson(); + // MISCELLANEOUS Event copy(); diff --git a/src/main/java/org/lwes/MapEvent.java b/src/main/java/org/lwes/MapEvent.java index cc4ea01..909343f 100644 --- a/src/main/java/org/lwes/MapEvent.java +++ b/src/main/java/org/lwes/MapEvent.java @@ -612,4 +612,8 @@ public String toJson() { return JsonSerializer.getInstance().toJson(name, attributes); } + public String toTypedJson() { + return JsonSerializer.getInstance().toTypedJson(name, attributes); + } + } diff --git a/src/main/java/org/lwes/serializer/JsonSerializer.java b/src/main/java/org/lwes/serializer/JsonSerializer.java index 908f2b5..716b12b 100644 --- a/src/main/java/org/lwes/serializer/JsonSerializer.java +++ b/src/main/java/org/lwes/serializer/JsonSerializer.java @@ -33,7 +33,12 @@ private JsonSerializer(){ } public String toJson(String eventName, Map attrs){ - Map jsonContainer = jsonRepresentation(eventName, attrs); + Map jsonContainer = typedJsonRepresentation(eventName, attrs); + return gson.toJson(jsonContainer); + } + + public String toTypedJson(String eventName, Map attrs){ + Map jsonContainer = typedJsonRepresentation(eventName, attrs); return gson.toJson(jsonContainer); } @@ -41,6 +46,12 @@ public Map jsonRepresentation(String name, Map Map container = new HashMap(); container.put("name", name); container.put("attributes", getAttributes(name, attrs)); + return container; + } + + public Map typedJsonRepresentation(String name, Map attrs){ + Map container = new HashMap(); + container.put("name", name); container.put("typed", getTypedAttributes(attrs)); return container; } diff --git a/src/main/java/org/lwes/util/EventTranslator.java b/src/main/java/org/lwes/util/EventTranslator.java new file mode 100644 index 0000000..46f2a79 --- /dev/null +++ b/src/main/java/org/lwes/util/EventTranslator.java @@ -0,0 +1,15 @@ +package org.lwes.util; + +import org.lwes.ArrayEvent; +import org.lwes.MapEvent; + +public class EventTranslator { + + public static MapEvent arrayToMapEvent(ArrayEvent ae){ + MapEvent me = new MapEvent(); + byte[] serialized = ae.serialize(); + me.deserialize(serialized); + return me; + } + +} diff --git a/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java b/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java index 05bcef4..3d76230 100644 --- a/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java +++ b/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java @@ -28,7 +28,7 @@ public void setup(){ public void testSimpleSerializeDeserializeMapEvent(){ Event evt = new MapEvent("json-event"); setEventProperties(evt); - Event rebornEvt = factory.createEventFromJson(evt.toJson(), EventImplementation.MAP_EVENT); + Event rebornEvt = factory.createEventFromJson(evt.toTypedJson(), EventImplementation.MAP_EVENT); Assert.assertEquals(evt, rebornEvt); } @@ -36,7 +36,7 @@ public void testSimpleSerializeDeserializeMapEvent(){ public void testSimpleSerializeDeserializeArrayEvent(){ Event evt = new ArrayEvent("json-event"); setEventProperties(evt); - Event rebornEvt = factory.createEventFromJson(evt.toJson(), EventImplementation.ARRAY_EVENT); + Event rebornEvt = factory.createEventFromJson(evt.toTypedJson(), EventImplementation.ARRAY_EVENT); Assert.assertEquals(evt, rebornEvt); } From 3e0494b31133ed2562946961103fa8e59981c6a5 Mon Sep 17 00:00:00 2001 From: Vikram Kadi Date: Wed, 13 Nov 2013 09:17:23 -0800 Subject: [PATCH 05/14] Test for max integer --- src/main/java/org/lwes/serializer/JsonSerializer.java | 3 ++- .../org/lwes/serializer/JsonSerializerDeSerializerTest.java | 5 ++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/lwes/serializer/JsonSerializer.java b/src/main/java/org/lwes/serializer/JsonSerializer.java index 716b12b..a060eec 100644 --- a/src/main/java/org/lwes/serializer/JsonSerializer.java +++ b/src/main/java/org/lwes/serializer/JsonSerializer.java @@ -33,7 +33,7 @@ private JsonSerializer(){ } public String toJson(String eventName, Map attrs){ - Map jsonContainer = typedJsonRepresentation(eventName, attrs); + Map jsonContainer = jsonRepresentation(eventName, attrs); return gson.toJson(jsonContainer); } @@ -72,4 +72,5 @@ private Object getAttributes(String name, Map attrs) { } return attributes; } + } diff --git a/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java b/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java index 3d76230..274d0ac 100644 --- a/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java +++ b/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java @@ -52,7 +52,7 @@ public void setEventProperties(Event evt){ evt.set("int32", FieldType.INT32, 10); evt.set("uint32", FieldType.UINT32, 10l); evt.set("int64", FieldType.INT64, 10l); - evt.set("uint64", FieldType.UINT64, new BigInteger("10000000000000")); + evt.set("uint64", FieldType.UINT64, new BigInteger("184467440737095516145")); evt.set("ipaddr", FieldType.IPADDR, new IPAddress("127.0.0.1")); evt.set("int16[]", FieldType.INT16_ARRAY, new short[] {(short) 10}); @@ -60,7 +60,7 @@ public void setEventProperties(Event evt){ evt.set("int32[]", FieldType.INT32_ARRAY, new int[] {10}); evt.set("uint32[]", FieldType.UINT32_ARRAY, new long[] {10l}); evt.set("int64[]", FieldType.INT64_ARRAY, new long[] {10l}); - evt.set("uint64[]", FieldType.UINT64_ARRAY, new BigInteger[] {new BigInteger("10000000000000")}); + evt.set("uint64[]", FieldType.UINT64_ARRAY, new BigInteger[] {new BigInteger("184467440737095516145")}); evt.set("boolean[]", FieldType.BOOLEAN_ARRAY, new boolean[] {true}); evt.set("byte[]", FieldType.BYTE_ARRAY, new byte[] {Byte.parseByte("32")}); evt.set("double[]", FieldType.DOUBLE_ARRAY, new double[] {5.0}); @@ -76,5 +76,4 @@ public void setEventProperties(Event evt){ } - } From 423872b5e050843d1bab04b9170a7918f245b30f Mon Sep 17 00:00:00 2001 From: Vikram Kadi Date: Wed, 13 Nov 2013 13:55:27 -0800 Subject: [PATCH 06/14] refactoring --- src/main/java/org/lwes/ArrayEvent.java | 11 +++--- src/main/java/org/lwes/Event.java | 6 ++-- src/main/java/org/lwes/MapEvent.java | 12 ++++--- .../org/lwes/serializer/JsonDeserializer.java | 33 +++++++++++------- .../org/lwes/serializer/JsonSerializer.java | 34 ++++++++++++------- .../JsonSerializerDeSerializerTest.java | 11 ++++-- 6 files changed, 69 insertions(+), 38 deletions(-) diff --git a/src/main/java/org/lwes/ArrayEvent.java b/src/main/java/org/lwes/ArrayEvent.java index 92fff66..b241c40 100644 --- a/src/main/java/org/lwes/ArrayEvent.java +++ b/src/main/java/org/lwes/ArrayEvent.java @@ -683,12 +683,15 @@ public Object getValue() { } } - public String toJson() { - return EventTranslator.arrayToMapEvent(this).toJson(); + public String json() { + return EventTranslator.arrayToMapEvent(this).json(); } - public String toTypedJson() { - return EventTranslator.arrayToMapEvent(this).toTypedJson(); + public String typedJson() { + return EventTranslator.arrayToMapEvent(this).typedJson(); } + public String unTypedJson() { + return EventTranslator.arrayToMapEvent(this).unTypedJson(); + } } diff --git a/src/main/java/org/lwes/Event.java b/src/main/java/org/lwes/Event.java index 7ff7e3f..dd4a345 100644 --- a/src/main/java/org/lwes/Event.java +++ b/src/main/java/org/lwes/Event.java @@ -227,9 +227,11 @@ public interface Event extends Iterable { int getBytesSize(); - String toJson(); + String json(); - String toTypedJson(); + String typedJson(); + + String unTypedJson(); // MISCELLANEOUS diff --git a/src/main/java/org/lwes/MapEvent.java b/src/main/java/org/lwes/MapEvent.java index 909343f..a26aaad 100644 --- a/src/main/java/org/lwes/MapEvent.java +++ b/src/main/java/org/lwes/MapEvent.java @@ -608,12 +608,16 @@ public int getBytesSize() { return bytesStoreSize; } - public String toJson() { - return JsonSerializer.getInstance().toJson(name, attributes); + public String json() { + return JsonSerializer.getInstance().json(name, attributes); } - public String toTypedJson() { - return JsonSerializer.getInstance().toTypedJson(name, attributes); + public String typedJson() { + return JsonSerializer.getInstance().typedJson(name, attributes); + } + + public String unTypedJson() { + return JsonSerializer.getInstance().unTypedJson(name, attributes); } } diff --git a/src/main/java/org/lwes/serializer/JsonDeserializer.java b/src/main/java/org/lwes/serializer/JsonDeserializer.java index d486252..3e08e7a 100644 --- a/src/main/java/org/lwes/serializer/JsonDeserializer.java +++ b/src/main/java/org/lwes/serializer/JsonDeserializer.java @@ -42,28 +42,34 @@ private JsonDeserializer(){ gson = bldr.create(); } - public Event fromJson(String json, Event e){ + public Event fromJson(String json, Event e) throws UnsupportedOperationException{ try{ + Map typedElems; JsonObject root = parser.parse(json).getAsJsonObject(); String name = root.getAsJsonPrimitive("name").getAsString(); + e.setEventName(name); if(StringUtils.isEmpty(name)) return null; JsonObject typedContainer = root.getAsJsonObject("typed"); - if(typedContainer == null) + JsonObject attributeContainer = root.getAsJsonObject("attributes"); + if(attributeContainer == null && typedContainer == null) return null; - Map typedElems = parseTyped(typedContainer); - - e.setEventName(name); - for(Entry element : typedElems.entrySet()){ - FieldType ft = FieldType.byName(element.getValue().getType()); - e.set(element.getKey(), + else if(typedContainer != null){ + typedElems = parseTyped(typedContainer); + for(Entry element : typedElems.entrySet()){ + FieldType ft = FieldType.byName(element.getValue().getType()); + e.set(element.getKey(), FieldType.byName(element.getValue().getType()), getObjectForType(ft, element.getValue().getValue())); - } + } + }else + throw new UnsupportedOperationException("Cannot construct the event without the type information for attributes."); }catch(Exception ex){ - ex.printStackTrace(); - return null; + if (ex instanceof UnsupportedOperationException) + throw (UnsupportedOperationException)ex; + else + return null; } return e; } @@ -72,14 +78,15 @@ Map parseTyped(JsonObject typedContainer){ Set> types = typedContainer.entrySet(); Map typedElements = new HashMap(); for(Entry type : types){ - TypeValue tv = getTypeValue(type.getValue().getAsJsonObject()); + TypeValue tv = getTypedValue(type.getValue().getAsJsonObject()); if(tv != null) typedElements.put(type.getKey(), tv); } return typedElements; } - TypeValue getTypeValue(JsonObject typedElement){ + + TypeValue getTypedValue(JsonObject typedElement){ String type = typedElement.getAsJsonPrimitive("type").getAsString(); String value = typedElement.getAsJsonPrimitive("value").getAsString(); FieldType fType = FieldType.byName(type); diff --git a/src/main/java/org/lwes/serializer/JsonSerializer.java b/src/main/java/org/lwes/serializer/JsonSerializer.java index a060eec..897d526 100644 --- a/src/main/java/org/lwes/serializer/JsonSerializer.java +++ b/src/main/java/org/lwes/serializer/JsonSerializer.java @@ -32,44 +32,52 @@ private JsonSerializer(){ gson = bldr.create(); } - public String toJson(String eventName, Map attrs){ - Map jsonContainer = jsonRepresentation(eventName, attrs); + public String json(String name, Map attrs){ + Map jsonContainer = untypedContainer(name, attrs); + jsonContainer.put("typed", getTypedAttributes(attrs)); return gson.toJson(jsonContainer); } - public String toTypedJson(String eventName, Map attrs){ - Map jsonContainer = typedJsonRepresentation(eventName, attrs); - return gson.toJson(jsonContainer); + public String unTypedJson(String eventName, Map attrs){ + return gson.toJson(untypedContainer(eventName, attrs)); + } + + public String typedJson(String eventName, Map attrs){ + return gson.toJson(typedContainer(eventName, attrs)); } - public Map jsonRepresentation(String name, Map attrs){ + private Map basicContainer(String name){ Map container = new HashMap(); container.put("name", name); + return container; + } + + private Map untypedContainer(String name, Map attrs){ + Map container = basicContainer(name); container.put("attributes", getAttributes(name, attrs)); return container; } - public Map typedJsonRepresentation(String name, Map attrs){ - Map container = new HashMap(); - container.put("name", name); + private Map typedContainer(String name, Map attrs){ + Map container = basicContainer(name); container.put("typed", getTypedAttributes(attrs)); return container; } private Object getTypedAttributes(Map attrs) { Map typedAttrs = new HashMap(); - for(Entry attr : attrs.entrySet()){ + for(Entry attr : attrs.entrySet()) typedAttrs.put(attr.getKey(), new TypeValue(attr.getValue().getType().name, gson.toJson(attr.getValue().getTypeObject()))); - } + return typedAttrs; } private Object getAttributes(String name, Map attrs) { Map attributes = new HashMap(); attributes.put("EventName", name); - for(Entry attr : attrs.entrySet()){ + for(Entry attr : attrs.entrySet()) attributes.put(attr.getKey(),attr.getValue().getTypeObject()); - } + return attributes; } diff --git a/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java b/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java index 274d0ac..3881ec5 100644 --- a/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java +++ b/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java @@ -28,7 +28,7 @@ public void setup(){ public void testSimpleSerializeDeserializeMapEvent(){ Event evt = new MapEvent("json-event"); setEventProperties(evt); - Event rebornEvt = factory.createEventFromJson(evt.toTypedJson(), EventImplementation.MAP_EVENT); + Event rebornEvt = factory.createEventFromJson(evt.json(), EventImplementation.MAP_EVENT); Assert.assertEquals(evt, rebornEvt); } @@ -36,10 +36,17 @@ public void testSimpleSerializeDeserializeMapEvent(){ public void testSimpleSerializeDeserializeArrayEvent(){ Event evt = new ArrayEvent("json-event"); setEventProperties(evt); - Event rebornEvt = factory.createEventFromJson(evt.toTypedJson(), EventImplementation.ARRAY_EVENT); + Event rebornEvt = factory.createEventFromJson(evt.typedJson(), EventImplementation.ARRAY_EVENT); Assert.assertEquals(evt, rebornEvt); } + @Test(expected=UnsupportedOperationException.class) + public void testDeserializeFromUntypedJson(){ + Event evt = new ArrayEvent("json-event"); + setEventProperties(evt); + factory.createEventFromJson(evt.unTypedJson(), EventImplementation.ARRAY_EVENT); + } + public void setEventProperties(Event evt){ evt.set("key", FieldType.STRING, "value"); From f2aba30b3fd64a8c11317fe09421c29039d75bc9 Mon Sep 17 00:00:00 2001 From: Vikram Kadi Date: Mon, 18 Nov 2013 00:06:05 -0800 Subject: [PATCH 07/14] Refactoring --- src/main/java/org/lwes/ArrayEvent.java | 8 +--- src/main/java/org/lwes/Event.java | 7 ++- src/main/java/org/lwes/MapEvent.java | 18 ++++++-- .../org/lwes/serializer/JsonSerializer.java | 43 +++---------------- .../JsonSerializerDeSerializerTest.java | 8 ++-- 5 files changed, 30 insertions(+), 54 deletions(-) diff --git a/src/main/java/org/lwes/ArrayEvent.java b/src/main/java/org/lwes/ArrayEvent.java index b241c40..f16bc87 100644 --- a/src/main/java/org/lwes/ArrayEvent.java +++ b/src/main/java/org/lwes/ArrayEvent.java @@ -687,11 +687,7 @@ public String json() { return EventTranslator.arrayToMapEvent(this).json(); } - public String typedJson() { - return EventTranslator.arrayToMapEvent(this).typedJson(); - } - - public String unTypedJson() { - return EventTranslator.arrayToMapEvent(this).unTypedJson(); + public Map exportEventAttributes(){ + return EventTranslator.arrayToMapEvent(this).exportEventAttributes(); } } diff --git a/src/main/java/org/lwes/Event.java b/src/main/java/org/lwes/Event.java index dd4a345..8adc173 100644 --- a/src/main/java/org/lwes/Event.java +++ b/src/main/java/org/lwes/Event.java @@ -19,6 +19,7 @@ import java.net.InetAddress; import java.util.Enumeration; import java.util.Iterator; +import java.util.Map; import java.util.Set; import org.lwes.util.CharacterEncoding; @@ -228,11 +229,9 @@ public interface Event extends Iterable { int getBytesSize(); String json(); - - String typedJson(); - - String unTypedJson(); + Map exportEventAttributes(); + // MISCELLANEOUS Event copy(); diff --git a/src/main/java/org/lwes/MapEvent.java b/src/main/java/org/lwes/MapEvent.java index a26aaad..7d5a29a 100644 --- a/src/main/java/org/lwes/MapEvent.java +++ b/src/main/java/org/lwes/MapEvent.java @@ -14,6 +14,8 @@ import java.io.IOException; import java.util.Enumeration; import java.util.Map.Entry; +import java.util.HashMap; +import java.util.Map; import java.util.SortedSet; import java.util.TreeSet; import java.util.concurrent.ConcurrentHashMap; @@ -612,12 +614,20 @@ public String json() { return JsonSerializer.getInstance().json(name, attributes); } - public String typedJson() { - return JsonSerializer.getInstance().typedJson(name, attributes); + public Map exportEventAttributes(){ + Map container = new HashMap(); + container.put("name", name); + container.put("typed", JsonSerializer.getInstance().getTypedAttributes(attributes)); + container.put("attributes", getUnTypedAttributes()); + return container; } - public String unTypedJson() { - return JsonSerializer.getInstance().unTypedJson(name, attributes); + private Object getUnTypedAttributes() { + Map unTypedAttributes = new HashMap(); + for(Entry attr : attributes.entrySet()) + unTypedAttributes.put(attr.getKey(),attr.getValue().getTypeObject()); + + return unTypedAttributes; } } diff --git a/src/main/java/org/lwes/serializer/JsonSerializer.java b/src/main/java/org/lwes/serializer/JsonSerializer.java index 897d526..e04e262 100644 --- a/src/main/java/org/lwes/serializer/JsonSerializer.java +++ b/src/main/java/org/lwes/serializer/JsonSerializer.java @@ -12,6 +12,8 @@ public class JsonSerializer { + private static final int JSON_SERIALIZER_VERSION = 1; + private static JsonSerializer instance; private Gson gson; @@ -28,57 +30,26 @@ public static JsonSerializer getInstance(){ } private JsonSerializer(){ - GsonBuilder bldr = new GsonBuilder(); - gson = bldr.create(); - } - - public String json(String name, Map attrs){ - Map jsonContainer = untypedContainer(name, attrs); - jsonContainer.put("typed", getTypedAttributes(attrs)); - return gson.toJson(jsonContainer); - } - - public String unTypedJson(String eventName, Map attrs){ - return gson.toJson(untypedContainer(eventName, attrs)); + gson = new GsonBuilder().create(); } - public String typedJson(String eventName, Map attrs){ + public String json(String eventName, Map attrs){ return gson.toJson(typedContainer(eventName, attrs)); } - private Map basicContainer(String name){ + private Map typedContainer(String name, Map attrs){ Map container = new HashMap(); container.put("name", name); - return container; - } - - private Map untypedContainer(String name, Map attrs){ - Map container = basicContainer(name); - container.put("attributes", getAttributes(name, attrs)); - return container; - } - - private Map typedContainer(String name, Map attrs){ - Map container = basicContainer(name); + container.put("version", JSON_SERIALIZER_VERSION); container.put("typed", getTypedAttributes(attrs)); return container; } - private Object getTypedAttributes(Map attrs) { + public Object getTypedAttributes(Map attrs) { Map typedAttrs = new HashMap(); for(Entry attr : attrs.entrySet()) typedAttrs.put(attr.getKey(), new TypeValue(attr.getValue().getType().name, gson.toJson(attr.getValue().getTypeObject()))); return typedAttrs; } - - private Object getAttributes(String name, Map attrs) { - Map attributes = new HashMap(); - attributes.put("EventName", name); - for(Entry attr : attrs.entrySet()) - attributes.put(attr.getKey(),attr.getValue().getTypeObject()); - - return attributes; - } - } diff --git a/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java b/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java index 3881ec5..7248910 100644 --- a/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java +++ b/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java @@ -36,15 +36,15 @@ public void testSimpleSerializeDeserializeMapEvent(){ public void testSimpleSerializeDeserializeArrayEvent(){ Event evt = new ArrayEvent("json-event"); setEventProperties(evt); - Event rebornEvt = factory.createEventFromJson(evt.typedJson(), EventImplementation.ARRAY_EVENT); + Event rebornEvt = factory.createEventFromJson(evt.json(), EventImplementation.ARRAY_EVENT); Assert.assertEquals(evt, rebornEvt); } - @Test(expected=UnsupportedOperationException.class) - public void testDeserializeFromUntypedJson(){ + @Test + public void testExportEventAttributes(){ Event evt = new ArrayEvent("json-event"); setEventProperties(evt); - factory.createEventFromJson(evt.unTypedJson(), EventImplementation.ARRAY_EVENT); + System.out.println(evt.exportEventAttributes()); } public void setEventProperties(Event evt){ From c362a49e30e03e88fb934fb95e819b17d499ca89 Mon Sep 17 00:00:00 2001 From: Vikram Kadi Date: Mon, 18 Nov 2013 16:15:03 -0800 Subject: [PATCH 08/14] Using our own string converter for serialize/deserialize instead of gson --- src/main/java/org/lwes/BaseType.java | 73 +++++++ src/main/java/org/lwes/TypeValue.java | 6 +- .../org/lwes/serializer/JsonDeserializer.java | 135 +++++++------ .../org/lwes/serializer/JsonSerializer.java | 4 +- .../org/lwes/serializer/StringConverter.java | 69 +++++++ .../org/lwes/serializer/StringParser.java | 190 +++++++++++++++++- src/test/java/org/lwes/BaseTypeTest.java | 4 +- .../JsonSerializerDeSerializerTest.java | 9 +- .../org/lwes/serializer/StringParserTest.java | 8 +- 9 files changed, 423 insertions(+), 75 deletions(-) create mode 100644 src/main/java/org/lwes/serializer/StringConverter.java diff --git a/src/main/java/org/lwes/BaseType.java b/src/main/java/org/lwes/BaseType.java index db1fd71..3cfc880 100644 --- a/src/main/java/org/lwes/BaseType.java +++ b/src/main/java/org/lwes/BaseType.java @@ -13,9 +13,12 @@ package org.lwes; import java.lang.reflect.Array; +import java.math.BigInteger; +import org.lwes.serializer.StringConverter; import org.lwes.serializer.StringParser; import org.lwes.util.EncodedString; +import org.lwes.util.IPAddress; /** * This class provides a base type for the base types in the event system. acts @@ -366,6 +369,76 @@ public BaseType cloneBaseType() { public String toString() { return typeObject.toString(); } + + public Object stringyfy(){ + + if(typeObject == null) + return null; + + switch (type) { + case BOOLEAN: + case BYTE: + case DOUBLE: + case FLOAT: + case INT16: + case INT32: + case INT64: + case UINT16: + case UINT32: + case UINT64: + case STRING: + return typeObject.toString(); + case IPADDR: + return typeObject.toString(); + case BOOLEAN_ARRAY: + return StringConverter.strArray((boolean[]) typeObject); + case BYTE_ARRAY: + return StringConverter.strArray((byte[]) typeObject); + case DOUBLE_ARRAY: + return StringConverter.strArray((double[]) typeObject); + case FLOAT_ARRAY: + return StringConverter.strArray((float[]) typeObject); + case INT16_ARRAY: + return StringConverter.strArray((short[]) typeObject); + case INT32_ARRAY: + return StringConverter.strArray((int[]) typeObject); + case INT64_ARRAY: + return StringConverter.strArray((long[]) typeObject); + case IP_ADDR_ARRAY: + return StringConverter.strArray((IPAddress[]) typeObject); + case STRING_ARRAY: + return StringConverter.strArray((String[]) typeObject); + case UINT16_ARRAY: + return StringConverter.strArray((int[]) typeObject); + case UINT32_ARRAY: + return StringConverter.strArray((long[]) typeObject); + case UINT64_ARRAY: + return StringConverter.strArray((BigInteger[]) typeObject); + case NBOOLEAN_ARRAY: + return StringConverter.strArray((Boolean[]) typeObject); + case NBYTE_ARRAY: + return StringConverter.strArray((Byte[]) typeObject); + case NDOUBLE_ARRAY: + return StringConverter.strArray((Double[]) typeObject); + case NFLOAT_ARRAY: + return StringConverter.strArray((Float[]) typeObject); + case NINT16_ARRAY: + return StringConverter.strArray((Short[]) typeObject); + case NINT32_ARRAY: + return StringConverter.strArray((Integer[]) typeObject); + case NINT64_ARRAY: + return StringConverter.strArray((Long[]) typeObject); + case NSTRING_ARRAY: + return StringConverter.strArray((String[]) typeObject); + case NUINT16_ARRAY: + return StringConverter.strArray((Integer[]) typeObject); + case NUINT32_ARRAY: + return StringConverter.strArray((Long[]) typeObject); + case NUINT64_ARRAY: + return StringConverter.strArray((BigInteger[]) typeObject); + } + return null; + } public String getComment() { return comment; diff --git a/src/main/java/org/lwes/TypeValue.java b/src/main/java/org/lwes/TypeValue.java index e5f6129..5fc0ac8 100644 --- a/src/main/java/org/lwes/TypeValue.java +++ b/src/main/java/org/lwes/TypeValue.java @@ -3,14 +3,14 @@ public class TypeValue { private String type; - private String value; + private Object value; public String getType() { return type; } - public String getValue() { + public Object getValue() { return value; } - public TypeValue(String type, String value) { + public TypeValue(String type, Object value) { super(); this.type = type; this.value = value; diff --git a/src/main/java/org/lwes/serializer/JsonDeserializer.java b/src/main/java/org/lwes/serializer/JsonDeserializer.java index 3e08e7a..48194b3 100644 --- a/src/main/java/org/lwes/serializer/JsonDeserializer.java +++ b/src/main/java/org/lwes/serializer/JsonDeserializer.java @@ -1,6 +1,5 @@ package org.lwes.serializer; -import java.math.BigInteger; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; @@ -10,11 +9,12 @@ import org.lwes.Event; import org.lwes.FieldType; import org.lwes.TypeValue; -import org.lwes.util.IPAddress; import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; import com.google.gson.JsonElement; +import com.google.gson.JsonNull; import com.google.gson.JsonObject; import com.google.gson.JsonParser; @@ -57,10 +57,16 @@ public Event fromJson(String json, Event e) throws UnsupportedOperationException else if(typedContainer != null){ typedElems = parseTyped(typedContainer); for(Entry element : typedElems.entrySet()){ - FieldType ft = FieldType.byName(element.getValue().getType()); - e.set(element.getKey(), - FieldType.byName(element.getValue().getType()), - getObjectForType(ft, element.getValue().getValue())); + TypeValue tv = element.getValue(); + FieldType ft = FieldType.byName(tv.getType()); + if (ft==null) + continue; + + if(tv.getValue() instanceof String) + e.set(element.getKey(), + ft,getObjectForType(ft, (String)tv.getValue(), null)); + else if (tv.getValue() instanceof String[]) + e.set(element.getKey(), ft, getObjectForType(ft, null, (String[])tv.getValue())); } }else throw new UnsupportedOperationException("Cannot construct the event without the type information for attributes."); @@ -75,106 +81,111 @@ else if(typedContainer != null){ } Map parseTyped(JsonObject typedContainer){ - Set> types = typedContainer.entrySet(); - Map typedElements = new HashMap(); - for(Entry type : types){ - TypeValue tv = getTypedValue(type.getValue().getAsJsonObject()); - if(tv != null) - typedElements.put(type.getKey(), tv); + Set> typedElements = typedContainer.entrySet(); + Map typedValues = new HashMap(); + for(Entry element : typedElements){ + String key = element.getKey(); + JsonObject tv = (JsonObject)element.getValue(); + String type = tv.get("type").getAsString(); + JsonElement jsonValue = tv.get("value"); + if(key==null || element.getValue()==null) + continue; + if(jsonValue instanceof JsonArray){ + typedValues.put(element.getKey(), new TypeValue(type, parseJSONArray((JsonArray)jsonValue))); + }else{ + typedValues.put(element.getKey(), new TypeValue(type, jsonValue.getAsString())); + } } - return typedElements; + return typedValues; } - - TypeValue getTypedValue(JsonObject typedElement){ - String type = typedElement.getAsJsonPrimitive("type").getAsString(); - String value = typedElement.getAsJsonPrimitive("value").getAsString(); - FieldType fType = FieldType.byName(type); - if(fType == null) - return null; - return new TypeValue(fType.name, value); + String[] parseJSONArray(JsonArray json){ + String[] strArr = new String[json.size()]; + for(int i=0;i attrs){ @@ -48,7 +48,7 @@ private Map typedContainer(String name, Map at public Object getTypedAttributes(Map attrs) { Map typedAttrs = new HashMap(); for(Entry attr : attrs.entrySet()) - typedAttrs.put(attr.getKey(), new TypeValue(attr.getValue().getType().name, gson.toJson(attr.getValue().getTypeObject()))); + typedAttrs.put(attr.getKey(), new TypeValue(attr.getValue().getType().name, attr.getValue().stringyfy())); return typedAttrs; } diff --git a/src/main/java/org/lwes/serializer/StringConverter.java b/src/main/java/org/lwes/serializer/StringConverter.java new file mode 100644 index 0000000..baa7520 --- /dev/null +++ b/src/main/java/org/lwes/serializer/StringConverter.java @@ -0,0 +1,69 @@ +package org.lwes.serializer; + +public class StringConverter { + + public static String[] strArray(T[] arr){ + String[] sArr = new String[arr.length]; + for(int i=0; i Date: Mon, 18 Nov 2013 16:55:45 -0800 Subject: [PATCH 09/14] Adding event name to attributes --- src/main/java/org/lwes/MapEvent.java | 1 + .../java/org/lwes/serializer/JsonDeserializer.java | 14 +++++--------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/lwes/MapEvent.java b/src/main/java/org/lwes/MapEvent.java index 7d5a29a..db16c18 100644 --- a/src/main/java/org/lwes/MapEvent.java +++ b/src/main/java/org/lwes/MapEvent.java @@ -624,6 +624,7 @@ public Map exportEventAttributes(){ private Object getUnTypedAttributes() { Map unTypedAttributes = new HashMap(); + unTypedAttributes.put("EventName", name); for(Entry attr : attributes.entrySet()) unTypedAttributes.put(attr.getKey(),attr.getValue().getTypeObject()); diff --git a/src/main/java/org/lwes/serializer/JsonDeserializer.java b/src/main/java/org/lwes/serializer/JsonDeserializer.java index 48194b3..8534fcf 100644 --- a/src/main/java/org/lwes/serializer/JsonDeserializer.java +++ b/src/main/java/org/lwes/serializer/JsonDeserializer.java @@ -10,8 +10,6 @@ import org.lwes.FieldType; import org.lwes.TypeValue; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonNull; @@ -22,7 +20,6 @@ public class JsonDeserializer { private static JsonDeserializer instance; - private Gson gson; private JsonParser parser; public static JsonDeserializer getInstance(){ @@ -38,8 +35,6 @@ public static JsonDeserializer getInstance(){ private JsonDeserializer(){ parser = new JsonParser(); - GsonBuilder bldr = new GsonBuilder(); - gson = bldr.create(); } public Event fromJson(String json, Event e) throws UnsupportedOperationException{ @@ -85,11 +80,12 @@ Map parseTyped(JsonObject typedContainer){ Map typedValues = new HashMap(); for(Entry element : typedElements){ String key = element.getKey(); + if(key==null || element.getValue()==null) + continue; JsonObject tv = (JsonObject)element.getValue(); String type = tv.get("type").getAsString(); JsonElement jsonValue = tv.get("value"); - if(key==null || element.getValue()==null) - continue; + if(jsonValue instanceof JsonArray){ typedValues.put(element.getKey(), new TypeValue(type, parseJSONArray((JsonArray)jsonValue))); }else{ @@ -99,7 +95,7 @@ Map parseTyped(JsonObject typedContainer){ return typedValues; } - String[] parseJSONArray(JsonArray json){ + private String[] parseJSONArray(JsonArray json){ String[] strArr = new String[json.size()]; for(int i=0;i Date: Mon, 18 Nov 2013 17:57:10 -0800 Subject: [PATCH 10/14] Having both typed and untyped --- src/main/java/org/lwes/ArrayEvent.java | 8 ++++-- src/main/java/org/lwes/Event.java | 4 ++- src/main/java/org/lwes/MapEvent.java | 23 ++++++--------- .../org/lwes/serializer/JsonSerializer.java | 28 +++++++++++++++++-- .../JsonSerializerDeSerializerTest.java | 11 ++++++-- 5 files changed, 53 insertions(+), 21 deletions(-) diff --git a/src/main/java/org/lwes/ArrayEvent.java b/src/main/java/org/lwes/ArrayEvent.java index f16bc87..93bef30 100644 --- a/src/main/java/org/lwes/ArrayEvent.java +++ b/src/main/java/org/lwes/ArrayEvent.java @@ -687,7 +687,11 @@ public String json() { return EventTranslator.arrayToMapEvent(this).json(); } - public Map exportEventAttributes(){ - return EventTranslator.arrayToMapEvent(this).exportEventAttributes(); + public String unTypedJson() { + return EventTranslator.arrayToMapEvent(this).unTypedJson(); + } + + public Map exportTypedAndUnTypedAttributes(){ + return EventTranslator.arrayToMapEvent(this).exportTypedAndUnTypedAttributes(); } } diff --git a/src/main/java/org/lwes/Event.java b/src/main/java/org/lwes/Event.java index 8adc173..9c552eb 100644 --- a/src/main/java/org/lwes/Event.java +++ b/src/main/java/org/lwes/Event.java @@ -230,7 +230,9 @@ public interface Event extends Iterable { String json(); - Map exportEventAttributes(); + String unTypedJson(); + + Map exportTypedAndUnTypedAttributes(); // MISCELLANEOUS diff --git a/src/main/java/org/lwes/MapEvent.java b/src/main/java/org/lwes/MapEvent.java index db16c18..d301a85 100644 --- a/src/main/java/org/lwes/MapEvent.java +++ b/src/main/java/org/lwes/MapEvent.java @@ -13,9 +13,9 @@ import java.io.DataOutput; import java.io.IOException; import java.util.Enumeration; -import java.util.Map.Entry; import java.util.HashMap; import java.util.Map; +import java.util.Map.Entry; import java.util.SortedSet; import java.util.TreeSet; import java.util.concurrent.ConcurrentHashMap; @@ -614,21 +614,16 @@ public String json() { return JsonSerializer.getInstance().json(name, attributes); } - public Map exportEventAttributes(){ - Map container = new HashMap(); - container.put("name", name); - container.put("typed", JsonSerializer.getInstance().getTypedAttributes(attributes)); - container.put("attributes", getUnTypedAttributes()); - return container; + public String unTypedJson() { + return JsonSerializer.getInstance().unTypedJson(name, attributes); } - private Object getUnTypedAttributes() { - Map unTypedAttributes = new HashMap(); - unTypedAttributes.put("EventName", name); - for(Entry attr : attributes.entrySet()) - unTypedAttributes.put(attr.getKey(),attr.getValue().getTypeObject()); - - return unTypedAttributes; + public Map exportTypedAndUnTypedAttributes(){ + JsonSerializer helper = JsonSerializer.getInstance(); + Map container = new HashMap(); + container.put("typed", helper.getTypedAttributes(attributes)); + container.put("attributes", helper.getUnTypedAttributes(name, attributes)); + return container; } } diff --git a/src/main/java/org/lwes/serializer/JsonSerializer.java b/src/main/java/org/lwes/serializer/JsonSerializer.java index 6889010..c212b4f 100644 --- a/src/main/java/org/lwes/serializer/JsonSerializer.java +++ b/src/main/java/org/lwes/serializer/JsonSerializer.java @@ -37,10 +37,25 @@ public String json(String eventName, Map attrs){ return gson.toJson(typedContainer(eventName, attrs)); } - private Map typedContainer(String name, Map attrs){ + public String unTypedJson(String eventName, Map attrs){ + return gson.toJson(unTypedContainer(eventName, attrs)); + } + + private Map basicContainer(String eventName){ Map container = new HashMap(); - container.put("name", name); + container.put("name", eventName); container.put("version", JSON_SERIALIZER_VERSION); + return container; + } + + private Map unTypedContainer(String eventName, Map attrs){ + Map container = basicContainer(eventName); + container.put("attributes", getUnTypedAttributes(eventName, attrs)); + return container; + } + + private Map typedContainer(String eventName, Map attrs){ + Map container = basicContainer(eventName); container.put("typed", getTypedAttributes(attrs)); return container; } @@ -52,4 +67,13 @@ public Object getTypedAttributes(Map attrs) { return typedAttrs; } + + public Object getUnTypedAttributes(String eventName, Map attributes) { + Map unTypedAttributes = new HashMap(); + unTypedAttributes.put("EventName", eventName); + for(Entry attr : attributes.entrySet()) + unTypedAttributes.put(attr.getKey(),attr.getValue().getTypeObject()); + + return unTypedAttributes; + } } diff --git a/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java b/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java index b0c7643..d6a1d1a 100644 --- a/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java +++ b/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java @@ -41,17 +41,24 @@ public void testSimpleSerializeDeserializeArrayEvent(){ } @Test - public void testSimpleSerialize(){ + public void testTypedSerialize(){ Event evt = new ArrayEvent("json-event"); setEventProperties(evt); System.out.println(evt.json()); } + @Test + public void testUntypedSerialize(){ + Event evt = new MapEvent("json-event"); + setEventProperties(evt); + System.out.println(evt.unTypedJson()); + } + @Test public void testExportEventAttributes(){ Event evt = new ArrayEvent("json-event"); setEventProperties(evt); - System.out.println(evt.exportEventAttributes()); + System.out.println(evt.exportTypedAndUnTypedAttributes()); } public void setEventProperties(Event evt){ From 368fcad7571b5308819a5662033e350f75c85f2f Mon Sep 17 00:00:00 2001 From: Vikram Kadi Date: Mon, 2 Dec 2013 18:14:29 -0800 Subject: [PATCH 11/14] More descriptive json type names --- src/main/java/org/lwes/FieldType.java | 87 +++++++++++-------- .../org/lwes/serializer/JsonDeserializer.java | 2 +- .../org/lwes/serializer/JsonSerializer.java | 2 +- .../JsonSerializerDeSerializerTest.java | 17 ++-- 4 files changed, 64 insertions(+), 44 deletions(-) diff --git a/src/main/java/org/lwes/FieldType.java b/src/main/java/org/lwes/FieldType.java index d8d6a29..2ba0a1d 100644 --- a/src/main/java/org/lwes/FieldType.java +++ b/src/main/java/org/lwes/FieldType.java @@ -16,73 +16,78 @@ import org.lwes.util.IPAddress; public enum FieldType { - UINT16(0x01, "uint16", 0), - INT16(0x02, "int16", (short) 0), - UINT32(0x03, "uint32", 0L), - INT32(0x04, "int32", 0), - STRING(0x05, "string", ""), - IPADDR(0x06, "ip_addr", new IPAddress()), - INT64(0x07, "int64", 0L), - UINT64(0x08, "uint64", BigInteger.ZERO), - BOOLEAN(0x09, "boolean", true), - BYTE(0x0A, "byte", (byte) 0), - FLOAT(0x0B, "float", (float) 0.0), - DOUBLE(0x0C, "double", 0.0), + UINT16(0x01, "uint16", 0, "uint16"), + INT16(0x02, "int16", (short) 0, "int16"), + UINT32(0x03, "uint32", 0L, "uint32"), + INT32(0x04, "int32", 0, "int32"), + STRING(0x05, "string", "", "string"), + IPADDR(0x06, "ip_addr", new IPAddress(), "ip_addr"), + INT64(0x07, "int64", 0L, "int64"), + UINT64(0x08, "uint64", BigInteger.ZERO, "uint64"), + BOOLEAN(0x09, "boolean", true, "boolean"), + BYTE(0x0A, "byte", (byte) 0, "byte"), + FLOAT(0x0B, "float", (float) 0.0, "float"), + DOUBLE(0x0C, "double", 0.0, "double"), // Primitive Arrays - UINT16_ARRAY(0x81, "[Luint16", new short[0]), - INT16_ARRAY(0x82, "[Lint16", new int[0]), - UINT32_ARRAY(0x83, "[Luint32", new int[0]), - INT32_ARRAY(0x84, "[Lint32", new long[0]), - STRING_ARRAY(0x85, "[Lstring", new String[0]), - IP_ADDR_ARRAY(0x86, "[Lip_addr", new IPAddress[0]), - INT64_ARRAY(0x87, "[Lint64", new long[0]), - UINT64_ARRAY(0x88, "[Luint64", new BigInteger[0]), - BOOLEAN_ARRAY(0x89, "[Lboolean", new boolean[0]), - BYTE_ARRAY(0x8A, "[Lbyte", new byte[0]), - FLOAT_ARRAY(0x8B, "[Lfloat", new float[0]), - DOUBLE_ARRAY(0x8C, "[Ldouble", new double[0]), + UINT16_ARRAY(0x81, "[Luint16", new short[0], "uint16_array"), + INT16_ARRAY(0x82, "[Lint16", new int[0], "int16_array"), + UINT32_ARRAY(0x83, "[Luint32", new int[0], "uint32_array"), + INT32_ARRAY(0x84, "[Lint32", new long[0], "int32_array"), + STRING_ARRAY(0x85, "[Lstring", new String[0], "string_array"), + IP_ADDR_ARRAY(0x86, "[Lip_addr", new IPAddress[0], "ip_addr_array"), + INT64_ARRAY(0x87, "[Lint64", new long[0], "int64_array"), + UINT64_ARRAY(0x88, "[Luint64", new BigInteger[0], "uint64_array"), + BOOLEAN_ARRAY(0x89, "[Lboolean", new boolean[0], "boolean_array"), + BYTE_ARRAY(0x8A, "[Lbyte", new byte[0], "byte_array"), + FLOAT_ARRAY(0x8B, "[Lfloat", new float[0], "float_array"), + DOUBLE_ARRAY(0x8C, "[Ldouble", new double[0], "double_array"), // Nullable, object backed arrays - NUINT16_ARRAY(0x8D, "[LNuint16", new Short[0]), - NINT16_ARRAY(0x8E, "[LNint16", new Integer[0]), - NUINT32_ARRAY(0x8F, "[LNuint32", new Integer[0]), - NINT32_ARRAY(0x90, "[LNint32", new Long[0]), - NSTRING_ARRAY(0x91, "[LString", new String[0]), + NUINT16_ARRAY(0x8D, "[LNuint16", new Short[0], "nullable_uint16_array"), + NINT16_ARRAY(0x8E, "[LNint16", new Integer[0], "nullable_int16_array"), + NUINT32_ARRAY(0x8F, "[LNuint32", new Integer[0], "nullable_uint32_array"), + NINT32_ARRAY(0x90, "[LNint32", new Long[0], "nullable_int32_array"), + NSTRING_ARRAY(0x91, "[LString", new String[0], "nullable_string_array"), // N_IP_ADDR_ARRAY not implemented... 0x92 - NINT64_ARRAY(0x93, "[LNint64", new Long[0]), - NUINT64_ARRAY(0x94, "[LNuint64", new BigInteger[0]), - NBOOLEAN_ARRAY(0x95, "[LBoolean", new Boolean[0]), - NBYTE_ARRAY(0x96, "[LByte", new Byte[0]), - NFLOAT_ARRAY(0x97, "[LFloat", new Float[0]), - NDOUBLE_ARRAY(0x98, "[LDouble", new Double[0]); + NINT64_ARRAY(0x93, "[LNint64", new Long[0], "nullable_int64_array"), + NUINT64_ARRAY(0x94, "[LNuint64", new BigInteger[0], "nullable_uint64_array"), + NBOOLEAN_ARRAY(0x95, "[LBoolean", new Boolean[0], "nullable_boolean_array"), + NBYTE_ARRAY(0x96, "[LByte", new Byte[0], "nullable_byte_array"), + NFLOAT_ARRAY(0x97, "[LFloat", new Float[0], "nullable_float_array"), + NDOUBLE_ARRAY(0x98, "[LDouble", new Double[0], "nullable_double_array"); public final byte token; public final String name; + public final String typeDesc; private Integer constantSize; private final boolean array, nullableArray; private FieldType componentType, arrayType, nullableArrayType; private final Object defaultValue; private static final FieldType[] TYPES_BY_TOKEN = new FieldType[256]; private static final Map TYPES_BY_NAME; + private static final Map TYPES_BY_DESC; private FieldType(int token, String name) { - this(token, name, null); + this(token, name, null, null); } - private FieldType(int token, String name, Object defaultValue) { + private FieldType(int token, String name, Object defaultValue, String typeDesc) { this.token = (byte) token; this.name = name; this.array = name.startsWith("[L"); this.nullableArray = this.array && name().startsWith("N"); this.defaultValue = defaultValue; + this.typeDesc = typeDesc; } static { TYPES_BY_NAME = new HashMap(); + TYPES_BY_DESC = new HashMap(); for (FieldType type : values()) { TYPES_BY_TOKEN[type.token & 0xff] = type; TYPES_BY_NAME.put(type.name, type); + TYPES_BY_DESC.put(type.typeDesc, type); if (type.isArray()) { // This will fail if our naming becomes inconsistent or a type starts with N. @@ -128,6 +133,14 @@ public static FieldType byName(String name) { return type; } + public static FieldType byTypeDesc(String typeDesc) { + final FieldType type = TYPES_BY_DESC.get(typeDesc); + if (type == null) { + throw new IllegalArgumentException("Bad type description: " + typeDesc); + } + return type; + } + @Override public String toString() { return name; diff --git a/src/main/java/org/lwes/serializer/JsonDeserializer.java b/src/main/java/org/lwes/serializer/JsonDeserializer.java index 8534fcf..283dc20 100644 --- a/src/main/java/org/lwes/serializer/JsonDeserializer.java +++ b/src/main/java/org/lwes/serializer/JsonDeserializer.java @@ -53,7 +53,7 @@ else if(typedContainer != null){ typedElems = parseTyped(typedContainer); for(Entry element : typedElems.entrySet()){ TypeValue tv = element.getValue(); - FieldType ft = FieldType.byName(tv.getType()); + FieldType ft = FieldType.byTypeDesc(tv.getType()); if (ft==null) continue; diff --git a/src/main/java/org/lwes/serializer/JsonSerializer.java b/src/main/java/org/lwes/serializer/JsonSerializer.java index c212b4f..7460407 100644 --- a/src/main/java/org/lwes/serializer/JsonSerializer.java +++ b/src/main/java/org/lwes/serializer/JsonSerializer.java @@ -63,7 +63,7 @@ private Map typedContainer(String eventName, Map attrs) { Map typedAttrs = new HashMap(); for(Entry attr : attrs.entrySet()) - typedAttrs.put(attr.getKey(), new TypeValue(attr.getValue().getType().name, attr.getValue().stringyfy())); + typedAttrs.put(attr.getKey(), new TypeValue(attr.getValue().getType().typeDesc, attr.getValue().stringyfy())); return typedAttrs; } diff --git a/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java b/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java index d6a1d1a..0165537 100644 --- a/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java +++ b/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java @@ -89,11 +89,18 @@ public void setEventProperties(Event evt){ evt.set("string[]", FieldType.STRING_ARRAY, new String[] {"value with \" '"}); evt.set("ipaddr[]", FieldType.IP_ADDR_ARRAY, new IPAddress[]{new IPAddress("10.0.13.217")}); - - evt.set("long[]", FieldType.NINT64_ARRAY, new Long[] { 5000000000l, null, 8675309l }); - evt.set("short[]", FieldType.NUINT16_ARRAY, new Integer[] { 5, null, 10 }); - evt.set("double[]", FieldType.NDOUBLE_ARRAY, new Double[] { 1.23, null, 1.26 }); - evt.set("float[]", FieldType.NFLOAT_ARRAY, new Float[] { 1.11f, 1.12f, null }); + evt.set("nint16[]", FieldType.NINT16_ARRAY, new Short[] {null, null, (short) 10}); + evt.set("nuint16[]", FieldType.NUINT16_ARRAY, new Integer[] {null, 10}); + evt.set("nint32[]", FieldType.NINT32_ARRAY, new Integer[] {10, null, 20}); + evt.set("nuint32[]", FieldType.NUINT32_ARRAY, new Long[] {10l, 502l, null}); + evt.set("nint64[]", FieldType.NINT64_ARRAY, new Long[] {null, 10l,null}); + evt.set("nuint64[]", FieldType.NUINT64_ARRAY, new BigInteger[] {null,new BigInteger("2342322"), new BigInteger("184467440737095516145")}); + evt.set("nboolean[]", FieldType.NBOOLEAN_ARRAY, new Boolean[] {true,null,false,true}); + evt.set("nbyte[]", FieldType.NBYTE_ARRAY, new Byte[] {null, Byte.parseByte("32")}); + evt.set("nlong[]", FieldType.NINT64_ARRAY, new Long[] { 5000000000l, null, 8675309l }); + evt.set("nshort[]", FieldType.NUINT16_ARRAY, new Integer[] { 5, null, 10 }); + evt.set("ndouble[]", FieldType.NDOUBLE_ARRAY, new Double[] { 1.23, null, 1.26 }); + evt.set("nfloat[]", FieldType.NFLOAT_ARRAY, new Float[] { 1.11f, 1.12f, null }); } From 56f57be8a28a3098ee5f8f3db59f668f06aeef05 Mon Sep 17 00:00:00 2001 From: Vikram Kadi Date: Fri, 7 Mar 2014 17:04:49 -0800 Subject: [PATCH 12/14] Code review comments --- src/main/java/org/lwes/ArrayEvent.java | 4 ++-- src/main/java/org/lwes/BaseType.java | 10 +++++++++- src/main/java/org/lwes/Event.java | 4 ++-- src/main/java/org/lwes/MapEvent.java | 9 ++------- .../serializer/JsonSerializerDeSerializerTest.java | 7 ------- 5 files changed, 15 insertions(+), 19 deletions(-) diff --git a/src/main/java/org/lwes/ArrayEvent.java b/src/main/java/org/lwes/ArrayEvent.java index 93bef30..76ee39b 100644 --- a/src/main/java/org/lwes/ArrayEvent.java +++ b/src/main/java/org/lwes/ArrayEvent.java @@ -691,7 +691,7 @@ public String unTypedJson() { return EventTranslator.arrayToMapEvent(this).unTypedJson(); } - public Map exportTypedAndUnTypedAttributes(){ - return EventTranslator.arrayToMapEvent(this).exportTypedAndUnTypedAttributes(); + public Map getAttributeNameTypeValues(){ + return EventTranslator.arrayToMapEvent(this).getAttributeNameTypeValues(); } } diff --git a/src/main/java/org/lwes/BaseType.java b/src/main/java/org/lwes/BaseType.java index 3cfc880..88d0c4f 100644 --- a/src/main/java/org/lwes/BaseType.java +++ b/src/main/java/org/lwes/BaseType.java @@ -370,6 +370,15 @@ public String toString() { return typeObject.toString(); } + /** + * This method returns the correct string representation of the underlying data, + * + * e.g. for cases where the data is an array of integers, the default toString will just print out + * the internal java representation of array class type, but this method would convert the + * individual elements into strings and return a string array + * @return + */ + public Object stringyfy(){ if(typeObject == null) @@ -387,7 +396,6 @@ public Object stringyfy(){ case UINT32: case UINT64: case STRING: - return typeObject.toString(); case IPADDR: return typeObject.toString(); case BOOLEAN_ARRAY: diff --git a/src/main/java/org/lwes/Event.java b/src/main/java/org/lwes/Event.java index 9c552eb..abf18d2 100644 --- a/src/main/java/org/lwes/Event.java +++ b/src/main/java/org/lwes/Event.java @@ -232,8 +232,8 @@ public interface Event extends Iterable { String unTypedJson(); - Map exportTypedAndUnTypedAttributes(); - + Map getAttributeNameTypeValues(); + // MISCELLANEOUS Event copy(); diff --git a/src/main/java/org/lwes/MapEvent.java b/src/main/java/org/lwes/MapEvent.java index d301a85..4500d04 100644 --- a/src/main/java/org/lwes/MapEvent.java +++ b/src/main/java/org/lwes/MapEvent.java @@ -618,12 +618,7 @@ public String unTypedJson() { return JsonSerializer.getInstance().unTypedJson(name, attributes); } - public Map exportTypedAndUnTypedAttributes(){ - JsonSerializer helper = JsonSerializer.getInstance(); - Map container = new HashMap(); - container.put("typed", helper.getTypedAttributes(attributes)); - container.put("attributes", helper.getUnTypedAttributes(name, attributes)); - return container; + public Map getAttributeNameTypeValues(){ + return attributes; } - } diff --git a/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java b/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java index 0165537..f0ef711 100644 --- a/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java +++ b/src/test/java/org/lwes/serializer/JsonSerializerDeSerializerTest.java @@ -54,13 +54,6 @@ public void testUntypedSerialize(){ System.out.println(evt.unTypedJson()); } - @Test - public void testExportEventAttributes(){ - Event evt = new ArrayEvent("json-event"); - setEventProperties(evt); - System.out.println(evt.exportTypedAndUnTypedAttributes()); - } - public void setEventProperties(Event evt){ evt.set("key", FieldType.STRING, "value"); From 8d35a4a2fb9285a0c9722c5cba0b8521d3b27921 Mon Sep 17 00:00:00 2001 From: Vikram Kadi Date: Fri, 7 Mar 2014 17:11:02 -0800 Subject: [PATCH 13/14] Version to 1.5.0-SNAPSHOT --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c9ada0c..6d88bf3 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ org.lwes lwes-java jar - 1.4.4-SNAPSHOT + 1.5.0-SNAPSHOT lwes-java Lightweight event system, java implementation http://lwes.org From a74a54316a04198779ef6210ccef1f46d38196ea Mon Sep 17 00:00:00 2001 From: Vikram Kadi Date: Fri, 7 Mar 2014 17:21:56 -0800 Subject: [PATCH 14/14] Change log --- ChangeLog | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ChangeLog b/ChangeLog index 4aa3c15..834f813 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,5 @@ +* Fri Mar 07 17:00:00 PDT 2014 Vikram Kadi 1.5.0 +Changes to emit a json form of the lwes event. * Tue Aug 07 08:00:00 PDT 2013 Robert Wong 1.4.1 Fix bug where sampleRate was not correctly set. * Tue Jul 30 08:00:00 PDT 2013 Robert Wong 1.4.0