THRIFT-761. java: Include the symbolic name of a typedef field in the field metadata
This patch adds a new isTypedef() method to FieldValueMetaData and converts MetaDataTest to a testcase in TestStruct.
git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@936588 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/compiler/cpp/src/generate/t_java_generator.cc b/compiler/cpp/src/generate/t_java_generator.cc
index 8786d40..ab8af66 100644
--- a/compiler/cpp/src/generate/t_java_generator.cc
+++ b/compiler/cpp/src/generate/t_java_generator.cc
@@ -2097,6 +2097,9 @@
indent(out) << "new EnumMetaData(TType.ENUM, " << type_name(type) << ".class";
} else {
indent(out) << "new FieldValueMetaData(" << get_java_type_string(type);
+ if (type->is_typedef()) {
+ indent(out) << ", \"" << ((t_typedef*)type)->get_symbolic() << "\"";
+ }
}
out << ")";
indent_down();
diff --git a/lib/java/build.xml b/lib/java/build.xml
index 1afc3cb..57be5e3 100644
--- a/lib/java/build.xml
+++ b/lib/java/build.xml
@@ -205,8 +205,6 @@
classpathref="test.classpath" failonerror="true" />
<java classname="org.apache.thrift.test.ToStringTest"
classpathref="test.classpath" failonerror="true" />
- <java classname="org.apache.thrift.test.MetaDataTest"
- classpathref="test.classpath" failonerror="true" />
<java classname="org.apache.thrift.test.JavaBeansTest"
classpathref="test.classpath" failonerror="true" />
</target>
diff --git a/lib/java/src/org/apache/thrift/meta_data/FieldValueMetaData.java b/lib/java/src/org/apache/thrift/meta_data/FieldValueMetaData.java
index 076a768..2aad65d 100644
--- a/lib/java/src/org/apache/thrift/meta_data/FieldValueMetaData.java
+++ b/lib/java/src/org/apache/thrift/meta_data/FieldValueMetaData.java
@@ -28,8 +28,27 @@
public class FieldValueMetaData implements java.io.Serializable {
public final byte type;
- public FieldValueMetaData(byte type){
+ private final boolean isTypedefType;
+ private final String typedefName;
+
+ public FieldValueMetaData(byte type) {
this.type = type;
+ this.isTypedefType = false;
+ this.typedefName = null;
+ }
+
+ public FieldValueMetaData(byte type, String typedefName) {
+ this.type = type;
+ this.isTypedefType = true;
+ this.typedefName = typedefName;
+ }
+
+ public boolean isTypedef() {
+ return isTypedefType;
+ }
+
+ public String getTypedefName() {
+ return typedefName;
}
public boolean isStruct() {
diff --git a/lib/java/test/org/apache/thrift/TestStruct.java b/lib/java/test/org/apache/thrift/TestStruct.java
index 6ba48a4..4ab2a1e 100644
--- a/lib/java/test/org/apache/thrift/TestStruct.java
+++ b/lib/java/test/org/apache/thrift/TestStruct.java
@@ -5,17 +5,26 @@
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
+import java.util.Map;
import junit.framework.TestCase;
+import org.apache.thrift.meta_data.FieldMetaData;
+import org.apache.thrift.meta_data.ListMetaData;
+import org.apache.thrift.meta_data.MapMetaData;
+import org.apache.thrift.meta_data.SetMetaData;
+import org.apache.thrift.meta_data.StructMetaData;
import org.apache.thrift.protocol.TBinaryProtocol;
+import org.apache.thrift.protocol.TType;
import thrift.test.Bonk;
+import thrift.test.CrazyNesting;
import thrift.test.HolyMoley;
import thrift.test.Insanity;
import thrift.test.Nesting;
import thrift.test.Numberz;
import thrift.test.OneOfEach;
+import thrift.test.Xtruct;
public class TestStruct extends TestCase {
@@ -186,4 +195,52 @@
int compareTo = insanity1.compareTo(insanity2);
assertEquals(insanity1 + " should be equal to " + insanity2 + ", but is: " + compareTo, 0, compareTo);
}
+
+ public void testMetaData() throws Exception {
+ Map<CrazyNesting._Fields, FieldMetaData> mdMap = CrazyNesting.metaDataMap;
+
+ // Check for struct fields existence
+ assertEquals(3, mdMap.size());
+ assertTrue(mdMap.containsKey(CrazyNesting._Fields.SET_FIELD));
+ assertTrue(mdMap.containsKey(CrazyNesting._Fields.LIST_FIELD));
+ assertTrue(mdMap.containsKey(CrazyNesting._Fields.STRING_FIELD));
+
+ // Check for struct fields contents
+ assertEquals("string_field", mdMap.get(CrazyNesting._Fields.STRING_FIELD).fieldName);
+ assertEquals("list_field", mdMap.get(CrazyNesting._Fields.LIST_FIELD).fieldName);
+ assertEquals("set_field", mdMap.get(CrazyNesting._Fields.SET_FIELD).fieldName);
+
+ assertEquals(TFieldRequirementType.DEFAULT, mdMap.get(CrazyNesting._Fields.STRING_FIELD).requirementType);
+ assertEquals(TFieldRequirementType.REQUIRED, mdMap.get(CrazyNesting._Fields.LIST_FIELD).requirementType);
+ assertEquals(TFieldRequirementType.OPTIONAL, mdMap.get(CrazyNesting._Fields.SET_FIELD).requirementType);
+
+ assertEquals(TType.STRING, mdMap.get(CrazyNesting._Fields.STRING_FIELD).valueMetaData.type);
+ assertEquals(TType.LIST, mdMap.get(CrazyNesting._Fields.LIST_FIELD).valueMetaData.type);
+ assertEquals(TType.SET, mdMap.get(CrazyNesting._Fields.SET_FIELD).valueMetaData.type);
+
+ // Check nested structures
+ assertTrue(mdMap.get(CrazyNesting._Fields.LIST_FIELD).valueMetaData.isContainer());
+
+ assertFalse(mdMap.get(CrazyNesting._Fields.LIST_FIELD).valueMetaData.isStruct());
+
+ assertEquals(TType.STRUCT, ((MapMetaData)((ListMetaData)((SetMetaData)((MapMetaData)((MapMetaData)((ListMetaData)mdMap.get(CrazyNesting._Fields.LIST_FIELD).valueMetaData).elemMetaData).valueMetaData).valueMetaData).elemMetaData).elemMetaData).keyMetaData.type);
+
+ assertEquals(Insanity.class, ((StructMetaData)((MapMetaData)((ListMetaData)((SetMetaData)((MapMetaData)((MapMetaData)((ListMetaData)mdMap.get(CrazyNesting._Fields.LIST_FIELD).valueMetaData).elemMetaData).valueMetaData).valueMetaData).elemMetaData).elemMetaData).keyMetaData).structClass);
+
+ // Check that FieldMetaData contains a map with metadata for all generated struct classes
+ assertNotNull(FieldMetaData.getStructMetaDataMap(CrazyNesting.class));
+ assertNotNull(FieldMetaData.getStructMetaDataMap(Insanity.class));
+ assertNotNull(FieldMetaData.getStructMetaDataMap(Xtruct.class));
+
+ assertEquals(CrazyNesting.metaDataMap, FieldMetaData.getStructMetaDataMap(CrazyNesting.class));
+ assertEquals(Insanity.metaDataMap, FieldMetaData.getStructMetaDataMap(Insanity.class));
+
+ for (Map.Entry<? extends TFieldIdEnum, FieldMetaData> mdEntry : mdMap.entrySet()) {
+ assertEquals(mdEntry.getKey(), CrazyNesting._Fields.findByName(mdEntry.getValue().fieldName));
+ }
+
+ MapMetaData vmd = (MapMetaData)Insanity.metaDataMap.get(Insanity._Fields.USER_MAP).valueMetaData;
+ assertTrue(vmd.valueMetaData.isTypedef());
+ assertFalse(vmd.keyMetaData.isTypedef());
+ }
}
diff --git a/lib/java/test/org/apache/thrift/test/MetaDataTest.java b/lib/java/test/org/apache/thrift/test/MetaDataTest.java
deleted file mode 100644
index 8bb9f2c..0000000
--- a/lib/java/test/org/apache/thrift/test/MetaDataTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-
-package org.apache.thrift.test;
-
-import java.util.Map;
-import org.apache.thrift.TFieldRequirementType;
-import org.apache.thrift.meta_data.FieldMetaData;
-import org.apache.thrift.meta_data.ListMetaData;
-import org.apache.thrift.meta_data.MapMetaData;
-import org.apache.thrift.meta_data.SetMetaData;
-import org.apache.thrift.meta_data.StructMetaData;
-import org.apache.thrift.protocol.TType;
-import org.apache.thrift.TFieldIdEnum;
-import thrift.test.*;
-
-public class MetaDataTest {
- public static void main(String[] args) throws Exception {
- Map<CrazyNesting._Fields, FieldMetaData> mdMap = CrazyNesting.metaDataMap;
-
- // Check for struct fields existence
- if (mdMap.size() != 3)
- throw new RuntimeException("metadata map contains wrong number of entries!");
- if (!mdMap.containsKey(CrazyNesting._Fields.SET_FIELD) || !mdMap.containsKey(CrazyNesting._Fields.LIST_FIELD) || !mdMap.containsKey(CrazyNesting._Fields.STRING_FIELD))
- throw new RuntimeException("metadata map doesn't contain entry for a struct field!");
-
- // Check for struct fields contents
- if (!mdMap.get(CrazyNesting._Fields.STRING_FIELD).fieldName.equals("string_field") ||
- !mdMap.get(CrazyNesting._Fields.LIST_FIELD).fieldName.equals("list_field") ||
- !mdMap.get(CrazyNesting._Fields.SET_FIELD).fieldName.equals("set_field"))
- throw new RuntimeException("metadata map contains a wrong fieldname");
- if (mdMap.get(CrazyNesting._Fields.STRING_FIELD).requirementType != TFieldRequirementType.DEFAULT ||
- mdMap.get(CrazyNesting._Fields.LIST_FIELD).requirementType != TFieldRequirementType.REQUIRED ||
- mdMap.get(CrazyNesting._Fields.SET_FIELD).requirementType != TFieldRequirementType.OPTIONAL)
- throw new RuntimeException("metadata map contains the wrong requirement type for a field");
- if (mdMap.get(CrazyNesting._Fields.STRING_FIELD).valueMetaData.type != TType.STRING ||
- mdMap.get(CrazyNesting._Fields.LIST_FIELD).valueMetaData.type != TType.LIST ||
- mdMap.get(CrazyNesting._Fields.SET_FIELD).valueMetaData.type != TType.SET)
- throw new RuntimeException("metadata map contains the wrong requirement type for a field");
-
- // Check nested structures
- if (!mdMap.get(CrazyNesting._Fields.LIST_FIELD).valueMetaData.isContainer())
- throw new RuntimeException("value metadata for a list is stored as non-container!");
- if (mdMap.get(CrazyNesting._Fields.LIST_FIELD).valueMetaData.isStruct())
- throw new RuntimeException("value metadata for a list is stored as a struct!");
- if (((MapMetaData)((ListMetaData)((SetMetaData)((MapMetaData)((MapMetaData)((ListMetaData)mdMap.get(CrazyNesting._Fields.LIST_FIELD).valueMetaData).elemMetaData).valueMetaData).valueMetaData).elemMetaData).elemMetaData).keyMetaData.type != TType.STRUCT)
- throw new RuntimeException("metadata map contains wrong type for a value in a deeply nested structure");
- if (((StructMetaData)((MapMetaData)((ListMetaData)((SetMetaData)((MapMetaData)((MapMetaData)((ListMetaData)mdMap.get(CrazyNesting._Fields.LIST_FIELD).valueMetaData).elemMetaData).valueMetaData).valueMetaData).elemMetaData).elemMetaData).keyMetaData).structClass != Insanity.class)
- throw new RuntimeException("metadata map contains wrong class for a struct in a deeply nested structure");
-
- // Check that FieldMetaData contains a map with metadata for all generated struct classes
- if (FieldMetaData.getStructMetaDataMap(CrazyNesting.class) == null ||
- FieldMetaData.getStructMetaDataMap(Insanity.class) == null ||
- FieldMetaData.getStructMetaDataMap(Xtruct.class) == null)
- throw new RuntimeException("global metadata map doesn't contain an entry for a known struct");
- if (FieldMetaData.getStructMetaDataMap(CrazyNesting.class) != CrazyNesting.metaDataMap ||
- FieldMetaData.getStructMetaDataMap(Insanity.class) != Insanity.metaDataMap)
- throw new RuntimeException("global metadata map contains wrong entry for a loaded struct");
-
- for (Map.Entry<? extends TFieldIdEnum, FieldMetaData> mdEntry : mdMap.entrySet()) {
- if (!CrazyNesting._Fields.findByName(mdEntry.getValue().fieldName).equals(mdEntry.getKey())) {
- throw new RuntimeException("Field name map contained invalid Name <-> ID mapping");
- }
- }
- }
-}