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");
-      }
-    }
-  }
-}