Repository: incubator-reef Updated Branches: refs/heads/master 0b464ec0f -> c1ac79639
[REEF-278] Support ProtocolBuffer ClassHierarchy merge in Java Tang This change adds support to merge ProtocolBuffer ClassHierarchy with other ClassHierachy instances in Tang/Java. It also contains a minor fix for a dropped test config file. JIRA: [REEF-278](https://issues.apache.org/jira/browse/REEF-278) Pull Request: This closes #159 Project: http://git-wip-us.apache.org/repos/asf/incubator-reef/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-reef/commit/c1ac7963 Tree: http://git-wip-us.apache.org/repos/asf/incubator-reef/tree/c1ac7963 Diff: http://git-wip-us.apache.org/repos/asf/incubator-reef/diff/c1ac7963 Branch: refs/heads/master Commit: c1ac79639b7c4a72c2ebe74f6dc9db87480405d7 Parents: 0b464ec Author: Julia Wang <[email protected]> Authored: Wed Apr 22 19:57:12 2015 -0700 Committer: Markus Weimer <[email protected]> Committed: Fri Apr 24 10:30:26 2015 -0700 ---------------------------------------------------------------------- .../ConfigFiles/evaluator.conf | Bin 0 -> 2837 bytes .../Org.Apache.REEF.Tests.csproj | 3 ++ .../protobuf/ProtocolBufferClassHierarchy.java | 34 +++++++++++++++++-- .../tang/ClassHierarchyDeserializationTest.java | 34 ++++++++++++++++++- 4 files changed, 67 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1ac7963/lang/cs/Org.Apache.REEF.Tests/ConfigFiles/evaluator.conf ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Tests/ConfigFiles/evaluator.conf b/lang/cs/Org.Apache.REEF.Tests/ConfigFiles/evaluator.conf new file mode 100644 index 0000000..67256f5 Binary files /dev/null and b/lang/cs/Org.Apache.REEF.Tests/ConfigFiles/evaluator.conf differ http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1ac7963/lang/cs/Org.Apache.REEF.Tests/Org.Apache.REEF.Tests.csproj ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Tests/Org.Apache.REEF.Tests.csproj b/lang/cs/Org.Apache.REEF.Tests/Org.Apache.REEF.Tests.csproj index 44fdfe3..a256a34 100644 --- a/lang/cs/Org.Apache.REEF.Tests/Org.Apache.REEF.Tests.csproj +++ b/lang/cs/Org.Apache.REEF.Tests/Org.Apache.REEF.Tests.csproj @@ -67,6 +67,9 @@ under the License. <Compile Include="Utility\TestExceptions.cs" /> </ItemGroup> <ItemGroup> + <None Include="ConfigFiles\evaluator.conf"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> <None Include="run.cmd"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </None> http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1ac7963/lang/java/reef-tang/tang/src/main/java/org/apache/reef/tang/implementation/protobuf/ProtocolBufferClassHierarchy.java ---------------------------------------------------------------------- diff --git a/lang/java/reef-tang/tang/src/main/java/org/apache/reef/tang/implementation/protobuf/ProtocolBufferClassHierarchy.java b/lang/java/reef-tang/tang/src/main/java/org/apache/reef/tang/implementation/protobuf/ProtocolBufferClassHierarchy.java index 8053078..0e0a0c6 100644 --- a/lang/java/reef-tang/tang/src/main/java/org/apache/reef/tang/implementation/protobuf/ProtocolBufferClassHierarchy.java +++ b/lang/java/reef-tang/tang/src/main/java/org/apache/reef/tang/implementation/protobuf/ProtocolBufferClassHierarchy.java @@ -19,6 +19,7 @@ package org.apache.reef.tang.implementation.protobuf; import org.apache.reef.tang.ClassHierarchy; +import org.apache.reef.tang.annotations.NamedParameter; import org.apache.reef.tang.exceptions.NameResolutionException; import org.apache.reef.tang.implementation.types.*; import org.apache.reef.tang.proto.ClassHierarchyProto; @@ -384,13 +385,40 @@ public class ProtocolBufferClassHierarchy implements ClassHierarchy { if (this == ch) { return this; } - throw new UnsupportedOperationException( - "Cannot merge ExternalClassHierarchies yet!"); + if (!(ch instanceof ProtocolBufferClassHierarchy)) { + throw new UnsupportedOperationException( + "Cannot merge with class hierarchies of type: " + ch.getClass().getName()); + } + + final ProtocolBufferClassHierarchy pch = (ProtocolBufferClassHierarchy) ch; + for (final String key : pch.lookupTable.keySet()) { + if (!this.lookupTable.containsKey(key)) { + this.lookupTable.put(key, pch.lookupTable.get(key)); + } + + for (final Node n : ch.getNamespace().getChildren()) { + if (!this.namespace.contains(n.getFullName())) { + if (n instanceof NamedParameter) { + final NamedParameterNode np = (NamedParameterNode) n; + new NamedParameterNodeImpl<>(this.namespace, np.getName(), + np.getFullName(), np.getFullArgName(), np.getSimpleArgName(), + np.isSet(), np.isList(), np.getDocumentation(), np.getShortName(), + np.getDefaultInstanceAsStrings()); + } else if (n instanceof ClassNode) { + final ClassNode cn = (ClassNode) n; + new ClassNodeImpl(namespace, cn.getName(), cn.getFullName(), + cn.isUnit(), cn.isInjectionCandidate(), + cn.isExternalConstructor(), cn.getInjectableConstructors(), + cn.getAllConstructors(), cn.getDefaultImplementation()); + } + } + } + } + return this; } @Override public Node getNamespace() { return namespace; } - } http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1ac7963/lang/java/reef-tang/tang/src/test/java/org/apache/reef/tang/ClassHierarchyDeserializationTest.java ---------------------------------------------------------------------- diff --git a/lang/java/reef-tang/tang/src/test/java/org/apache/reef/tang/ClassHierarchyDeserializationTest.java b/lang/java/reef-tang/tang/src/test/java/org/apache/reef/tang/ClassHierarchyDeserializationTest.java index 7679410..dbdc5a8 100644 --- a/lang/java/reef-tang/tang/src/test/java/org/apache/reef/tang/ClassHierarchyDeserializationTest.java +++ b/lang/java/reef-tang/tang/src/test/java/org/apache/reef/tang/ClassHierarchyDeserializationTest.java @@ -18,6 +18,7 @@ */ package org.apache.reef.tang; +import org.apache.reef.tang.exceptions.BindException; import org.apache.reef.tang.exceptions.NameResolutionException; import org.apache.reef.tang.formats.AvroConfigurationSerializer; import org.apache.reef.tang.formats.ConfigurationSerializer; @@ -44,7 +45,7 @@ public class ClassHierarchyDeserializationTest { public void testDeserializationForTasks() { try (final InputStream chin = Thread.currentThread().getContextClassLoader() .getResourceAsStream("Task.bin")) { - final ClassHierarchyProto.Node root = ClassHierarchyProto.Node.parseFrom(chin); // A + final ClassHierarchyProto.Node root = ClassHierarchyProto.Node.parseFrom(chin); final ClassHierarchy ch = new ProtocolBufferClassHierarchy(root); Node n1 = ch.getNode("Org.Apache.REEF.Examples.Tasks.StreamingTasks.StreamTask1, Org.Apache.REEF.Examples.Tasks, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"); Assert.assertTrue(n1.getFullName().equals("Org.Apache.REEF.Examples.Tasks.StreamingTasks.StreamTask1, Org.Apache.REEF.Examples.Tasks, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")); @@ -67,6 +68,37 @@ public class ClassHierarchyDeserializationTest { } /** + * This is to test CLR protocol Buffer class hierarchy merge + */ + @Test + public void testProtocolClassHierarchyMerge() { + final ConfigurationBuilder taskConfigurationBuilder; + final ConfigurationBuilder eventConfigurationBuilder; + + try (final InputStream chin = Thread.currentThread().getContextClassLoader() + .getResourceAsStream("Task.bin")) { + final ClassHierarchyProto.Node root = ClassHierarchyProto.Node.parseFrom(chin); + final ClassHierarchy ch = new ProtocolBufferClassHierarchy(root); + taskConfigurationBuilder = Tang.Factory.getTang().newConfigurationBuilder(ch); + } catch (final IOException e) { + final String message = "Unable to load class hierarchy from task.bin."; + throw new RuntimeException(message, e); + } + + try (final InputStream chin = Thread.currentThread().getContextClassLoader() + .getResourceAsStream("Event.bin")) { + final ClassHierarchyProto.Node root = ClassHierarchyProto.Node.parseFrom(chin); + final ClassHierarchy ch = new ProtocolBufferClassHierarchy(root); + eventConfigurationBuilder = Tang.Factory.getTang().newConfigurationBuilder(ch); + } catch (final Exception e) { + final String message = "Unable to load class hierarchy from event.bin."; + throw new RuntimeException(message, e); + } + + taskConfigurationBuilder.addConfiguration(eventConfigurationBuilder.build()); + } + + /** * generate event.bin from .Net Tang test case TestSerilization.TestGenericClass */ @Test
