From: Bryan Duxbury Date: Thu, 22 Apr 2010 01:05:02 +0000 (+0000) Subject: THRIFT-761. java: Include the symbolic name of a typedef field in the field metadata X-Git-Tag: 0.3.0~34 X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=15e2930ccf8fd4932bd700f7dd9ba433819368d5;p=common%2Fthrift.git 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 8786d401..ab8af669 100644 --- a/compiler/cpp/src/generate/t_java_generator.cc +++ b/compiler/cpp/src/generate/t_java_generator.cc @@ -2097,6 +2097,9 @@ void t_java_generator::generate_field_value_meta_data(std::ofstream& out, t_type 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 1afc3cb9..57be5e3b 100644 --- a/lib/java/build.xml +++ b/lib/java/build.xml @@ -205,8 +205,6 @@ classpathref="test.classpath" failonerror="true" /> - 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 076a768d..2aad65d5 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 @@ import org.apache.thrift.protocol.TType; 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 6ba48a47..4ab2a1e6 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.ByteArrayOutputStream; 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 @@ public class TestStruct extends TestCase { int compareTo = insanity1.compareTo(insanity2); assertEquals(insanity1 + " should be equal to " + insanity2 + ", but is: " + compareTo, 0, compareTo); } + + public void testMetaData() throws Exception { + Map 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 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 8bb9f2ca..00000000 --- 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 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 mdEntry : mdMap.entrySet()) { - if (!CrazyNesting._Fields.findByName(mdEntry.getValue().fieldName).equals(mdEntry.getKey())) { - throw new RuntimeException("Field name map contained invalid Name <-> ID mapping"); - } - } - } -}