diff --git metastore/pom.xml metastore/pom.xml index 35752ff..ef908ca 100644 --- metastore/pom.xml +++ metastore/pom.xml @@ -255,6 +255,12 @@ ${disruptor.version} test + + org.skyscreamer + jsonassert + 1.4.0 + test + diff --git metastore/src/java/org/apache/hadoop/hive/metastore/messaging/PartitionFiles.java metastore/src/java/org/apache/hadoop/hive/metastore/messaging/PartitionFiles.java index b10b8a8..4fd7f8c 100644 --- metastore/src/java/org/apache/hadoop/hive/metastore/messaging/PartitionFiles.java +++ metastore/src/java/org/apache/hadoop/hive/metastore/messaging/PartitionFiles.java @@ -22,10 +22,13 @@ import java.util.List; import com.google.common.collect.Lists; +import org.codehaus.jackson.annotate.JsonProperty; public class PartitionFiles { + @JsonProperty private String partitionName; + @JsonProperty private List files; public PartitionFiles(String partitionName, Iterator files) { diff --git metastore/src/java/org/apache/hadoop/hive/metastore/messaging/json/JSONMessageDeserializer.java metastore/src/java/org/apache/hadoop/hive/metastore/messaging/json/JSONMessageDeserializer.java index 41732c7..40ef5fb 100644 --- metastore/src/java/org/apache/hadoop/hive/metastore/messaging/json/JSONMessageDeserializer.java +++ metastore/src/java/org/apache/hadoop/hive/metastore/messaging/json/JSONMessageDeserializer.java @@ -36,6 +36,7 @@ import org.apache.hadoop.hive.metastore.messaging.MessageDeserializer; import org.codehaus.jackson.map.DeserializationConfig; import org.codehaus.jackson.map.ObjectMapper; +import org.codehaus.jackson.map.SerializationConfig; /** * MessageDeserializer implementation, for deserializing from JSON strings. @@ -46,6 +47,9 @@ static { mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); + mapper.configure(SerializationConfig.Feature.AUTO_DETECT_GETTERS, false); + mapper.configure(SerializationConfig.Feature.AUTO_DETECT_IS_GETTERS, false); + mapper.configure(SerializationConfig.Feature.AUTO_DETECT_FIELDS, false); } @Override diff --git metastore/src/test/org/apache/hadoop/hive/metastore/messaging/json/JSONMessageDeserializerTest.java metastore/src/test/org/apache/hadoop/hive/metastore/messaging/json/JSONMessageDeserializerTest.java new file mode 100644 index 0000000..b7c6304 --- /dev/null +++ metastore/src/test/org/apache/hadoop/hive/metastore/messaging/json/JSONMessageDeserializerTest.java @@ -0,0 +1,89 @@ +package org.apache.hadoop.hive.metastore.messaging.json; + +import org.codehaus.jackson.annotate.JsonProperty; +import org.json.JSONException; +import org.junit.Test; +import org.skyscreamer.jsonassert.JSONAssert; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import static org.junit.Assert.*; + +public class JSONMessageDeserializerTest { + + public static class MyClass { + @JsonProperty + private int a; + @JsonProperty + private Map map; + private long l; + private String shouldNotSerialize = "shouldNotSerialize"; + + //for jackson to instantiate + MyClass() { + } + + MyClass(int a, Map map, long l) { + this.a = a; + this.map = map; + this.l = l; + } + + @JsonProperty + long getL() { + return l; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + + MyClass myClass = (MyClass) o; + + if (a != myClass.a) + return false; + if (l != myClass.l) + return false; + if (!map.equals(myClass.map)) + return false; + return shouldNotSerialize.equals(myClass.shouldNotSerialize); + } + + @Override + public int hashCode() { + int result = a; + result = 31 * result + map.hashCode(); + result = 31 * result + (int) (l ^ (l >>> 32)); + result = 31 * result + shouldNotSerialize.hashCode(); + return result; + } + } + + @Test + public void shouldNotSerializePropertiesNotAnnotated() throws IOException, JSONException { + MyClass obj = new MyClass(Integer.MAX_VALUE, new HashMap() {{ + put("a", "a"); + put("b", "b"); + }}, Long.MAX_VALUE); + String json = JSONMessageDeserializer.mapper.writeValueAsString(obj); + JSONAssert.assertEquals( + "{\"a\":2147483647,\"map\":{\"b\":\"b\",\"a\":\"a\"},\"l\":9223372036854775807}", json, + false); + } + + @Test + public void shouldDeserializeJsonStringToObject() throws IOException { + String json = "{\"a\":47,\"map\":{\"a\":\"a\",\"b\":\"a value for b\"},\"l\":98}"; + MyClass actual = JSONMessageDeserializer.mapper.readValue(json, MyClass.class); + MyClass expected = new MyClass(47, new HashMap() {{ + put("a", "a"); + put("b", "a value for b"); + }}, 98L); + assertEquals(expected, actual); + } +} \ No newline at end of file