Repository: incubator-beam Updated Branches: refs/heads/master e8695a1b6 -> b1f36df2d
[BEAM-328] uses SerializableCoder for `T extends Serializable` Project: http://git-wip-us.apache.org/repos/asf/incubator-beam/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-beam/commit/7bbac011 Tree: http://git-wip-us.apache.org/repos/asf/incubator-beam/tree/7bbac011 Diff: http://git-wip-us.apache.org/repos/asf/incubator-beam/diff/7bbac011 Branch: refs/heads/master Commit: 7bbac011afd61dc535de298675ef42cb9a3abb56 Parents: 68850b4 Author: manuzhang <owenzhang1...@gmail.com> Authored: Thu Jun 16 12:09:22 2016 +0800 Committer: manuzhang <owenzhang1...@gmail.com> Committed: Wed Jul 27 06:14:32 2016 +0800 ---------------------------------------------------------------------- .../org/apache/beam/sdk/coders/CoderRegistry.java | 10 ++++++---- .../apache/beam/sdk/coders/CoderRegistryTest.java | 18 +++++++++++++++--- .../apache/beam/sdk/values/TypedPValueTest.java | 16 ++++++++++++---- .../sdk/transforms/RemoveDuplicatesJava8Test.java | 10 ++++++++-- .../beam/sdk/transforms/WithKeysJava8Test.java | 11 +++++++++-- 5 files changed, 50 insertions(+), 15 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-beam/blob/7bbac011/sdks/java/core/src/main/java/org/apache/beam/sdk/coders/CoderRegistry.java ---------------------------------------------------------------------- diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/coders/CoderRegistry.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/coders/CoderRegistry.java index 9c3fabe..50e4422 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/coders/CoderRegistry.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/coders/CoderRegistry.java @@ -163,9 +163,9 @@ public class CoderRegistry implements CoderProvider { */ public <T> void registerCoder(Class<T> rawClazz, Coder<T> coder) { checkArgument( - rawClazz.getTypeParameters().length == 0, - "CoderRegistry.registerCoder(Class<T>, Coder<T>) may not be used " - + "with unspecialized generic classes"); + rawClazz.getTypeParameters().length == 0, + "CoderRegistry.registerCoder(Class<T>, Coder<T>) may not be used " + + "with unspecialized generic classes"); CoderFactory factory = CoderFactories.forCoder(coder); registerCoder(rawClazz, factory); @@ -720,7 +720,9 @@ public class CoderRegistry implements CoderProvider { return getDefaultCoder(clazz); } else if (type instanceof ParameterizedType) { return getDefaultCoder((ParameterizedType) type, typeCoderBindings); - } else if (type instanceof TypeVariable || type instanceof WildcardType) { + } else if (type instanceof TypeVariable) { + return getDefaultCoder(TypeDescriptor.of(type).getRawType()); + } else if (type instanceof WildcardType) { // No default coder for an unknown generic type. throw new CannotProvideCoderException( String.format("Cannot provide a coder for type variable %s" http://git-wip-us.apache.org/repos/asf/incubator-beam/blob/7bbac011/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/CoderRegistryTest.java ---------------------------------------------------------------------- diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/CoderRegistryTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/CoderRegistryTest.java index 37f0e10..817ea20 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/CoderRegistryTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/CoderRegistryTest.java @@ -388,15 +388,27 @@ public class CoderRegistryTest { thrown.expect(CannotProvideCoderException.class); thrown.expectMessage(allOf( - containsString("TestGenericT"), - containsString("erasure"), - containsString("org.apache.beam.sdk.coders.CoderRegistryTest$TestGenericClass"))); + containsString("No CoderFactory has been registered"), + containsString("does not have a @DefaultCoder annotation"), + containsString("does not implement Serializable"))); registry.getDefaultCoder(TypeDescriptor.of( TestGenericClass.class.getTypeParameters()[0])); } private static class TestGenericClass<TestGenericT> { } + @Test + public void testSerializableTypeVariableDefaultCoder() throws Exception { + CoderRegistry registry = new CoderRegistry(); + + TypeDescriptor type = TypeDescriptor.of( + TestSerializableGenericClass.class.getTypeParameters()[0]); + assertEquals(registry.getDefaultCoder(type), + SerializableCoder.of(type)); + } + + private static class TestSerializableGenericClass<TestGenericT extends Serializable> {} + /** * In-context test that assures the functionality tested in * {@link #testDefaultCoderAnnotationGeneric} is invoked in the right ways. http://git-wip-us.apache.org/repos/asf/incubator-beam/blob/7bbac011/sdks/java/core/src/test/java/org/apache/beam/sdk/values/TypedPValueTest.java ---------------------------------------------------------------------- diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/values/TypedPValueTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/values/TypedPValueTest.java index 0b7018a..ba5dffb 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/values/TypedPValueTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/values/TypedPValueTest.java @@ -76,8 +76,12 @@ public class TypedPValueTest { thrown.expect(IllegalStateException.class); thrown.expectMessage("No Coder has been manually specified"); - thrown.expectMessage("erasure"); - thrown.expectMessage("see TupleTag Javadoc"); + thrown.expectMessage( + containsString("Building a Coder using a registered CoderFactory failed")); + thrown.expectMessage( + containsString("Building a Coder from the @DefaultCoder annotation failed")); + thrown.expectMessage( + containsString("Building a Coder from the fallback CoderProvider failed")); tuple.get(untypedSideOutputTag).getCoder(); } @@ -91,8 +95,12 @@ public class TypedPValueTest { thrown.expect(IllegalStateException.class); thrown.expectMessage("No Coder has been manually specified"); - thrown.expectMessage("erasure"); - thrown.expectMessage("see TupleTag Javadoc"); + thrown.expectMessage( + containsString("Building a Coder using a registered CoderFactory failed")); + thrown.expectMessage( + containsString("Building a Coder from the @DefaultCoder annotation failed")); + thrown.expectMessage( + containsString("Building a Coder from the fallback CoderProvider failed")); tuple.get(untypedSideOutputTag).getCoder(); } http://git-wip-us.apache.org/repos/asf/incubator-beam/blob/7bbac011/sdks/java/java8tests/src/test/java/org/apache/beam/sdk/transforms/RemoveDuplicatesJava8Test.java ---------------------------------------------------------------------- diff --git a/sdks/java/java8tests/src/test/java/org/apache/beam/sdk/transforms/RemoveDuplicatesJava8Test.java b/sdks/java/java8tests/src/test/java/org/apache/beam/sdk/transforms/RemoveDuplicatesJava8Test.java index 9318229..aa4c015 100644 --- a/sdks/java/java8tests/src/test/java/org/apache/beam/sdk/transforms/RemoveDuplicatesJava8Test.java +++ b/sdks/java/java8tests/src/test/java/org/apache/beam/sdk/transforms/RemoveDuplicatesJava8Test.java @@ -18,6 +18,7 @@ package org.apache.beam.sdk.transforms; import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertThat; @@ -90,8 +91,13 @@ public class RemoveDuplicatesJava8Test { thrown.expect(IllegalStateException.class); thrown.expectMessage("Unable to return a default Coder for RemoveRepresentativeDupes"); - thrown.expectMessage("Cannot provide a coder for type variable K"); - thrown.expectMessage("the actual type is unknown due to erasure."); + thrown.expectMessage("No Coder has been manually specified"); + thrown.expectMessage( + containsString("Building a Coder using a registered CoderFactory failed")); + thrown.expectMessage( + containsString("Building a Coder from the @DefaultCoder annotation failed")); + thrown.expectMessage( + containsString("Building a Coder from the fallback CoderProvider failed")); // Thrown when applying a transform to the internal WithKeys that withRepresentativeValueFn is // implemented with http://git-wip-us.apache.org/repos/asf/incubator-beam/blob/7bbac011/sdks/java/java8tests/src/test/java/org/apache/beam/sdk/transforms/WithKeysJava8Test.java ---------------------------------------------------------------------- diff --git a/sdks/java/java8tests/src/test/java/org/apache/beam/sdk/transforms/WithKeysJava8Test.java b/sdks/java/java8tests/src/test/java/org/apache/beam/sdk/transforms/WithKeysJava8Test.java index 1ffb147..a89e281 100644 --- a/sdks/java/java8tests/src/test/java/org/apache/beam/sdk/transforms/WithKeysJava8Test.java +++ b/sdks/java/java8tests/src/test/java/org/apache/beam/sdk/transforms/WithKeysJava8Test.java @@ -17,6 +17,8 @@ */ package org.apache.beam.sdk.transforms; +import static org.hamcrest.Matchers.containsString; + import org.apache.beam.sdk.testing.PAssert; import org.apache.beam.sdk.testing.RunnableOnService; import org.apache.beam.sdk.testing.TestPipeline; @@ -66,8 +68,13 @@ public class WithKeysJava8Test { thrown.expect(IllegalStateException.class); thrown.expectMessage("Unable to return a default Coder for ApplyKeysWithWithKeys"); - thrown.expectMessage("Cannot provide a coder for type variable K"); - thrown.expectMessage("the actual type is unknown due to erasure."); + thrown.expectMessage("No Coder has been manually specified"); + thrown.expectMessage( + containsString("Building a Coder using a registered CoderFactory failed")); + thrown.expectMessage( + containsString("Building a Coder from the @DefaultCoder annotation failed")); + thrown.expectMessage( + containsString("Building a Coder from the fallback CoderProvider failed")); p.run(); }