You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@reef.apache.org by we...@apache.org on 2015/04/24 19:38:24 UTC

incubator-reef git commit: [REEF-278] Support ProtocolBuffer ClassHierarchy merge in Java Tang

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 <jw...@yahoo.com>
Authored: Wed Apr 22 19:57:12 2015 -0700
Committer: Markus Weimer <we...@apache.org>
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