Repository: flink Updated Branches: refs/heads/release-1.2 d4313731c -> 0a24611a8
[FLINK-5549] [core] TypeExtractor fails with RuntimeException, but should use GenericTypeInfo This closes #3154. Project: http://git-wip-us.apache.org/repos/asf/flink/repo Commit: http://git-wip-us.apache.org/repos/asf/flink/commit/0a24611a Tree: http://git-wip-us.apache.org/repos/asf/flink/tree/0a24611a Diff: http://git-wip-us.apache.org/repos/asf/flink/diff/0a24611a Branch: refs/heads/release-1.2 Commit: 0a24611a865ae6e321016672c951a8a632363bd4 Parents: d431373 Author: twalthr <twal...@apache.org> Authored: Wed Jan 18 14:43:32 2017 +0100 Committer: twalthr <twal...@apache.org> Committed: Fri Jan 20 16:11:19 2017 +0100 ---------------------------------------------------------------------- .../flink/api/java/typeutils/TypeExtractor.java | 21 ++++++++++++++------ .../java/typeutils/PojoTypeExtractionTest.java | 5 +++-- 2 files changed, 18 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flink/blob/0a24611a/flink-core/src/main/java/org/apache/flink/api/java/typeutils/TypeExtractor.java ---------------------------------------------------------------------- diff --git a/flink-core/src/main/java/org/apache/flink/api/java/typeutils/TypeExtractor.java b/flink-core/src/main/java/org/apache/flink/api/java/typeutils/TypeExtractor.java index 08f8c53..9b59a78 100644 --- a/flink-core/src/main/java/org/apache/flink/api/java/typeutils/TypeExtractor.java +++ b/flink-core/src/main/java/org/apache/flink/api/java/typeutils/TypeExtractor.java @@ -926,7 +926,7 @@ public class TypeExtractor { // build the entire type hierarchy for the pojo getTypeHierarchy(inputTypeHierarchy, inType, Object.class); // determine a field containing the type variable - List<Field> fields = getAllDeclaredFields(typeToClass(inType)); + List<Field> fields = getAllDeclaredFields(typeToClass(inType), false); for (Field field : fields) { Type fieldType = field.getGenericType(); if (fieldType instanceof TypeVariable && sameTypeVars(returnTypeVar, materializeTypeVariable(inputTypeHierarchy, (TypeVariable<?>) fieldType))) { @@ -1799,7 +1799,7 @@ public class TypeExtractor { getTypeHierarchy(typeHierarchy, clazz, Object.class); } - List<Field> fields = getAllDeclaredFields(clazz); + List<Field> fields = getAllDeclaredFields(clazz, false); if (fields.size() == 0) { LOG.info("No fields detected for " + clazz + ". Cannot be used as a PojoType. Will be handled as GenericType"); return new GenericTypeInfo<OUT>(clazz); @@ -1864,12 +1864,17 @@ public class TypeExtractor { } /** - * recursively determine all declared fields + * Recursively determine all declared fields * This is required because class.getFields() is not returning fields defined * in parent classes. + * + * @param clazz class to be analyzed + * @param ignoreDuplicates if true, in case of duplicate field names only the lowest one + * in a hierarchy will be returned; throws an exception otherwise + * @return list of fields */ @PublicEvolving - public static List<Field> getAllDeclaredFields(Class<?> clazz) { + public static List<Field> getAllDeclaredFields(Class<?> clazz, boolean ignoreDuplicates) { List<Field> result = new ArrayList<Field>(); while (clazz != null) { Field[] fields = clazz.getDeclaredFields(); @@ -1878,8 +1883,12 @@ public class TypeExtractor { continue; // we have no use for transient or static fields } if(hasFieldWithSameName(field.getName(), result)) { - throw new RuntimeException("The field "+field+" is already contained in the hierarchy of the "+clazz+"." + if (ignoreDuplicates) { + continue; + } else { + throw new InvalidTypesException("The field "+field+" is already contained in the hierarchy of the "+clazz+"." + "Please use unique field names through your classes hierarchy"); + } } result.add(field); } @@ -1890,7 +1899,7 @@ public class TypeExtractor { @PublicEvolving public static Field getDeclaredField(Class<?> clazz, String name) { - for (Field field : getAllDeclaredFields(clazz)) { + for (Field field : getAllDeclaredFields(clazz, true)) { if (field.getName().equals(name)) { return field; } http://git-wip-us.apache.org/repos/asf/flink/blob/0a24611a/flink-core/src/test/java/org/apache/flink/api/java/typeutils/PojoTypeExtractionTest.java ---------------------------------------------------------------------- diff --git a/flink-core/src/test/java/org/apache/flink/api/java/typeutils/PojoTypeExtractionTest.java b/flink-core/src/test/java/org/apache/flink/api/java/typeutils/PojoTypeExtractionTest.java index 2ca5081..ba09786 100644 --- a/flink-core/src/test/java/org/apache/flink/api/java/typeutils/PojoTypeExtractionTest.java +++ b/flink-core/src/test/java/org/apache/flink/api/java/typeutils/PojoTypeExtractionTest.java @@ -52,9 +52,10 @@ public class PojoTypeExtractionTest { private int count; // duplicate } - @Test(expected=RuntimeException.class) + @Test public void testDuplicateFieldException() { - TypeExtractor.createTypeInfo(HasDuplicateField.class); + TypeInformation<?> ti = TypeExtractor.createTypeInfo(HasDuplicateField.class); + Assert.assertTrue(ti instanceof GenericTypeInfo<?>); } // test with correct pojo types