Repository: incubator-reef
Updated Branches:
  refs/heads/master 1f1c7383c -> d23f26594


[REEF-754] Eliminate deserialization of context and service configuration 
submitted from .Net to Java

 - Use original serialized configuration strings when creating
   Evaluator configuration when calling from bridge
 - Remove class hierarchy from ActiveContextBridgeBridge and
   AllocatedEvaluatorBridge and corresponding Factories as it is not
   needed in those cases.
 - remove AvroConfigurationSerializer from those classes
 - refactor and clean up previouse added task configuration string
   methods

JIRA:
  [REEF-754](https://issues.apache.org/jira/browse/REEF-754)

Pull Request:
  This closes #497


Project: http://git-wip-us.apache.org/repos/asf/incubator-reef/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-reef/commit/d23f2659
Tree: http://git-wip-us.apache.org/repos/asf/incubator-reef/tree/d23f2659
Diff: http://git-wip-us.apache.org/repos/asf/incubator-reef/diff/d23f2659

Branch: refs/heads/master
Commit: d23f2659426974e520a7c791301cce159c48c994
Parents: 1f1c738
Author: Julia Wang <[email protected]>
Authored: Wed Sep 16 15:59:08 2015 -0700
Committer: Markus Weimer <[email protected]>
Committed: Wed Sep 16 18:13:36 2015 -0700

----------------------------------------------------------------------
 .../reef/javabridge/ActiveContextBridge.java    |  10 +-
 .../javabridge/ActiveContextBridgeFactory.java  |  28 +---
 .../javabridge/AllocatedEvaluatorBridge.java    |  74 +++-------
 .../AllocatedEvaluatorBridgeFactory.java        |  27 +---
 .../evaluator/AllocatedEvaluatorImpl.java       | 137 +++++++++++++++----
 5 files changed, 137 insertions(+), 139 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/d23f2659/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/ActiveContextBridge.java
----------------------------------------------------------------------
diff --git 
a/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/ActiveContextBridge.java
 
b/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/ActiveContextBridge.java
index 46f44fd..48b7a0d 100644
--- 
a/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/ActiveContextBridge.java
+++ 
b/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/ActiveContextBridge.java
@@ -21,8 +21,6 @@ package org.apache.reef.javabridge;
 import org.apache.reef.driver.context.ActiveContext;
 import org.apache.reef.io.naming.Identifiable;
 import org.apache.reef.runtime.common.driver.context.EvaluatorContext;
-import org.apache.reef.tang.ClassHierarchy;
-import org.apache.reef.tang.formats.AvroConfigurationSerializer;
 
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -31,17 +29,11 @@ public final class ActiveContextBridge extends NativeBridge 
implements Identifia
   private static final Logger LOG = 
Logger.getLogger(ActiveContextBridge.class.getName());
 
   private final ActiveContext jactiveContext;
-  private final AvroConfigurationSerializer serializer;
   private final String contextId;
   private final String evaluatorId;
-  private final ClassHierarchy clrClassHierarchy;
 
-  ActiveContextBridge(final ActiveContext activeContext,
-                      final ClassHierarchy clrClassHierarchy,
-                      final AvroConfigurationSerializer serializer) {
+  ActiveContextBridge(final ActiveContext activeContext) {
     this.jactiveContext = activeContext;
-    this.clrClassHierarchy = clrClassHierarchy;
-    this.serializer = serializer;
     this.contextId = activeContext.getId();
     this.evaluatorId = activeContext.getEvaluatorId();
   }

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/d23f2659/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/ActiveContextBridgeFactory.java
----------------------------------------------------------------------
diff --git 
a/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/ActiveContextBridgeFactory.java
 
b/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/ActiveContextBridgeFactory.java
index 77a06d7..46d6f26 100644
--- 
a/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/ActiveContextBridgeFactory.java
+++ 
b/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/ActiveContextBridgeFactory.java
@@ -18,13 +18,10 @@
  */
 package org.apache.reef.javabridge;
 
-import net.jcip.annotations.GuardedBy;
 import net.jcip.annotations.ThreadSafe;
 import org.apache.reef.annotations.audience.DriverSide;
 import org.apache.reef.annotations.audience.Private;
 import org.apache.reef.driver.context.ActiveContext;
-import org.apache.reef.tang.ClassHierarchy;
-import org.apache.reef.tang.formats.AvroConfigurationSerializer;
 
 import javax.inject.Inject;
 
@@ -35,18 +32,11 @@ import javax.inject.Inject;
 @ThreadSafe
 @Private
 public final class ActiveContextBridgeFactory {
-  @GuardedBy("this")
-  private ClassHierarchy clrClassHierarchy;
-  private final AvroConfigurationSerializer configurationSerializer;
-
   /**
    * This is always instantiated via Tang.
-   *
-   * @param configurationSerializer passed to the ActiveContextBridge 
instances for configuration serialization.
    */
   @Inject
-  private ActiveContextBridgeFactory(final AvroConfigurationSerializer 
configurationSerializer) {
-    this.configurationSerializer = configurationSerializer;
+  private ActiveContextBridgeFactory() {
   }
 
   /**
@@ -56,18 +46,6 @@ public final class ActiveContextBridgeFactory {
    * @return a new ActiveContextBridge.
    */
   public ActiveContextBridge getActiveContextBridge(final ActiveContext 
context) {
-    return new ActiveContextBridge(context, this.getClrClassHierarchy(), 
this.configurationSerializer);
-  }
-
-  /**
-   * Returns the clr ClassHierarchy. Loads it if needed.
-   *
-   * @return the clr ClassHierarchy.
-   */
-  private synchronized ClassHierarchy getClrClassHierarchy() {
-    if (null == this.clrClassHierarchy) {
-      this.clrClassHierarchy = 
Utilities.loadClassHierarchy(NativeInterop.CLASS_HIERARCHY_FILENAME);
-    }
-    return this.clrClassHierarchy;
+    return new ActiveContextBridge(context);
   }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/d23f2659/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/AllocatedEvaluatorBridge.java
----------------------------------------------------------------------
diff --git 
a/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/AllocatedEvaluatorBridge.java
 
b/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/AllocatedEvaluatorBridge.java
index d390515..f393666 100644
--- 
a/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/AllocatedEvaluatorBridge.java
+++ 
b/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/AllocatedEvaluatorBridge.java
@@ -21,9 +21,6 @@ package org.apache.reef.javabridge;
 import org.apache.reef.io.naming.Identifiable;
 import org.apache.reef.runtime.common.driver.evaluator.AllocatedEvaluatorImpl;
 import org.apache.reef.driver.evaluator.AllocatedEvaluator;
-import org.apache.reef.tang.ClassHierarchy;
-import org.apache.reef.tang.Configuration;
-import org.apache.reef.tang.formats.AvroConfigurationSerializer;
 
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -36,8 +33,6 @@ public final class AllocatedEvaluatorBridge extends 
NativeBridge implements Iden
   private static final Logger LOG = 
Logger.getLogger(AllocatedEvaluatorBridge.class.getName());
 
   private final AllocatedEvaluator jallocatedEvaluator;
-  private final AvroConfigurationSerializer serializer;
-  private final ClassHierarchy clrClassHierarchy;
   private final String evaluatorId;
   private final String nameServerInfo;
 
@@ -45,12 +40,8 @@ public final class AllocatedEvaluatorBridge extends 
NativeBridge implements Iden
    * This constructor should only be called by the 
AllocatedEvaluatorBridgeFactory.
    */
   AllocatedEvaluatorBridge(final AllocatedEvaluator allocatedEvaluator,
-                           final ClassHierarchy clrClassHierarchy,
-                           final String serverInfo,
-                           final AvroConfigurationSerializer serializer) {
+                           final String serverInfo) {
     this.jallocatedEvaluator = allocatedEvaluator;
-    this.serializer = serializer;
-    this.clrClassHierarchy = clrClassHierarchy;
     this.evaluatorId = allocatedEvaluator.getId();
     this.nameServerInfo = serverInfo;
   }
@@ -68,20 +59,11 @@ public final class AllocatedEvaluatorBridge extends 
NativeBridge implements Iden
     if (taskConfigurationString.isEmpty()) {
       throw new RuntimeException("empty taskConfigurationString provided.");
     }
-    final Configuration contextConfiguration;
-    final Configuration taskConfiguration;
-    try {
-      contextConfiguration = serializer.fromString(contextConfigurationString, 
clrClassHierarchy);
-    } catch (final Exception e) {
-      final String message = "Unable to de-serialize CLR context or task 
configurations using class hierarchy.";
-      LOG.log(Level.SEVERE, message, e);
-      throw new RuntimeException(message, e);
-    }
-
-    //When submit over the bridge, we would keep the task configuration as a 
serialized string.
-    //submitContextAndTask(final Configuration contextConfiguration,
+    //When submit over the bridge, we would keep the task configurations as a 
serialized strings.
+    //submitContextAndTask(final String contextConfiguration,
     //final String taskConfiguration) is not exposed in the interface. 
Therefore cast is necessary.
-    
((AllocatedEvaluatorImpl)jallocatedEvaluator).submitContextAndTask(contextConfiguration,
 taskConfigurationString);
+    ((AllocatedEvaluatorImpl)jallocatedEvaluator)
+        .submitContextAndTask(contextConfigurationString, 
taskConfigurationString);
   }
 
   /**
@@ -92,15 +74,11 @@ public final class AllocatedEvaluatorBridge extends 
NativeBridge implements Iden
     if (contextConfigurationString.isEmpty()) {
       throw new RuntimeException("empty contextConfigurationString provided.");
     }
-    final Configuration contextConfiguration;
-    try {
-      contextConfiguration = serializer.fromString(contextConfigurationString, 
clrClassHierarchy);
-    } catch (final Exception e) {
-      final String message = "Unable to de-serialize CLR context 
configurations using class hierarchy.";
-      LOG.log(Level.SEVERE, message, e);
-      throw new RuntimeException(message, e);
-    }
-    jallocatedEvaluator.submitContext(contextConfiguration);
+
+    //When submit over the bridge, we would keep the 
contextConfigurationString as serialized strings.
+    //public void submitContext(final String contextConfiguration)
+    // is not exposed in the interface. Therefore cast is necessary.
+    
((AllocatedEvaluatorImpl)jallocatedEvaluator).submitContext(contextConfigurationString);
   }
 
   /**
@@ -117,17 +95,11 @@ public final class AllocatedEvaluatorBridge extends 
NativeBridge implements Iden
       throw new RuntimeException("empty serviceConfigurationString provided.");
     }
 
-    final Configuration contextConfiguration;
-    final Configuration servicetConfiguration;
-    try {
-      contextConfiguration = serializer.fromString(contextConfigurationString, 
clrClassHierarchy);
-      servicetConfiguration = 
serializer.fromString(serviceConfigurationString, clrClassHierarchy);
-    } catch (final Exception e) {
-      final String message = "Unable to de-serialize CLR context or service  
configurations using class hierarchy.";
-      LOG.log(Level.SEVERE, message, e);
-      throw new RuntimeException(message, e);
-    }
-    jallocatedEvaluator.submitContextAndService(contextConfiguration, 
servicetConfiguration);
+    //When submit over the bridge, we would keep the configurations as 
serialized strings.
+    //public void submitContextAndService(final String contextConfiguration,
+    //final String serviceConfiguration) is not exposed in the interface. 
Therefore cast is necessary.
+    ((AllocatedEvaluatorImpl)jallocatedEvaluator)
+        .submitContextAndService(contextConfigurationString, 
serviceConfigurationString);
   }
 
   /**
@@ -149,24 +121,12 @@ public final class AllocatedEvaluatorBridge extends 
NativeBridge implements Iden
     if (taskConfigurationString.isEmpty()) {
       throw new RuntimeException("empty taskConfigurationString provided.");
     }
-    final Configuration contextConfiguration;
-    final Configuration servicetConfiguration;
-    final Configuration taskConfiguration;
-    try {
-      contextConfiguration = serializer.fromString(contextConfigurationString, 
clrClassHierarchy);
-      servicetConfiguration = 
serializer.fromString(serviceConfigurationString, clrClassHierarchy);
-    } catch (final Exception e) {
-      final String message =
-          "Unable to de-serialize CLR context or service or task 
configurations using class hierarchy.";
-      LOG.log(Level.SEVERE, message, e);
-      throw new RuntimeException(message, e);
-    }
 
     //When submit over the bridge, we would keep the task configuration as a 
serialized string.
     //submitContextAndServiceAndTask(final Configuration contextConfiguration, 
final Configuration serviceConfiguration,
     //final String taskConfiguration) is not exposed in the interface. 
Therefore cast is necessary.
-    ((AllocatedEvaluatorImpl)jallocatedEvaluator)
-        .submitContextAndServiceAndTask(contextConfiguration, 
servicetConfiguration, taskConfigurationString);
+    
((AllocatedEvaluatorImpl)jallocatedEvaluator).submitContextAndServiceAndTask(
+        contextConfigurationString, serviceConfigurationString, 
taskConfigurationString);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/d23f2659/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/AllocatedEvaluatorBridgeFactory.java
----------------------------------------------------------------------
diff --git 
a/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/AllocatedEvaluatorBridgeFactory.java
 
b/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/AllocatedEvaluatorBridgeFactory.java
index cd8b2bd..a90537e 100644
--- 
a/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/AllocatedEvaluatorBridgeFactory.java
+++ 
b/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/AllocatedEvaluatorBridgeFactory.java
@@ -18,12 +18,9 @@
  */
 package org.apache.reef.javabridge;
 
-import net.jcip.annotations.GuardedBy;
 import org.apache.reef.annotations.audience.DriverSide;
 import org.apache.reef.annotations.audience.Private;
 import org.apache.reef.driver.evaluator.AllocatedEvaluator;
-import org.apache.reef.tang.ClassHierarchy;
-import org.apache.reef.tang.formats.AvroConfigurationSerializer;
 
 import javax.inject.Inject;
 
@@ -34,19 +31,13 @@ import javax.inject.Inject;
 @DriverSide
 @Private
 public final class AllocatedEvaluatorBridgeFactory {
-  @GuardedBy("this")
-  private ClassHierarchy clrClassHierarchy;
-  private AvroConfigurationSerializer serializer;
-
   /**
    * This is always instantiated via Tang.
    */
   @Inject
-  private AllocatedEvaluatorBridgeFactory(final AvroConfigurationSerializer 
serializer) {
-    this.serializer = serializer;
+  private AllocatedEvaluatorBridgeFactory() {
   }
 
-
   /**
    * Instantiates a new AllocatedEvaluatorBridge.
    * @param allocatedEvaluator the AllocatedEvaluator object.
@@ -55,18 +46,6 @@ public final class AllocatedEvaluatorBridgeFactory {
    */
   public AllocatedEvaluatorBridge getAllocatedEvaluatorBridge(final 
AllocatedEvaluator allocatedEvaluator,
                                                               final String 
serverInfo) {
-    return new AllocatedEvaluatorBridge(allocatedEvaluator, 
getClrClassHierarchy(), serverInfo, serializer);
-  }
-
-  /**
-   * Returns the clr ClassHierarchy. Loads it if needed.
-   *
-   * @return the clr ClassHierarchy.
-   */
-  private synchronized ClassHierarchy getClrClassHierarchy() {
-    if (null == this.clrClassHierarchy) {
-      this.clrClassHierarchy = 
Utilities.loadClassHierarchy(NativeInterop.CLASS_HIERARCHY_FILENAME);
-    }
-    return this.clrClassHierarchy;
+    return new AllocatedEvaluatorBridge(allocatedEvaluator, serverInfo);
   }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/d23f2659/lang/java/reef-common/src/main/java/org/apache/reef/runtime/common/driver/evaluator/AllocatedEvaluatorImpl.java
----------------------------------------------------------------------
diff --git 
a/lang/java/reef-common/src/main/java/org/apache/reef/runtime/common/driver/evaluator/AllocatedEvaluatorImpl.java
 
b/lang/java/reef-common/src/main/java/org/apache/reef/runtime/common/driver/evaluator/AllocatedEvaluatorImpl.java
index 27ad046..25c097b 100644
--- 
a/lang/java/reef-common/src/main/java/org/apache/reef/runtime/common/driver/evaluator/AllocatedEvaluatorImpl.java
+++ 
b/lang/java/reef-common/src/main/java/org/apache/reef/runtime/common/driver/evaluator/AllocatedEvaluatorImpl.java
@@ -61,6 +61,7 @@ public final class AllocatedEvaluatorImpl implements 
AllocatedEvaluator {
    * The set of files to be places on the Evaluator.
    */
   private final Collection<File> files = new HashSet<>();
+
   /**
    * The set of libraries.
    */
@@ -96,14 +97,21 @@ public final class AllocatedEvaluatorImpl implements 
AllocatedEvaluator {
         .set(ContextConfiguration.IDENTIFIER, "RootContext_" + this.getId())
         .build();
     this.submitContextAndTask(contextConfiguration, taskConfiguration);
-
   }
 
+  /**
+   * Submit Task with configuration strings.
+   * This method should be called from bridge and the configuration strings are
+   * serialized at .Net side.
+   * @param taskConfiguration
+   */
   public void submitTask(final String taskConfiguration) {
     final Configuration contextConfiguration = ContextConfiguration.CONF
         .set(ContextConfiguration.IDENTIFIER, "RootContext_" + this.getId())
         .build();
-    this.submitContextAndTask(contextConfiguration, taskConfiguration);
+    final String contextConfigurationString = 
this.configurationSerializer.toString(contextConfiguration);
+    this.launchWithConfigurationString(
+        contextConfigurationString, Optional.<String>empty(), 
Optional.of(taskConfiguration));
   }
 
   @Override
@@ -111,16 +119,37 @@ public final class AllocatedEvaluatorImpl implements 
AllocatedEvaluator {
     return this.evaluatorManager.getEvaluatorDescriptor();
   }
 
-
   @Override
   public void submitContext(final Configuration contextConfiguration) {
-    launchWithTaskString(contextConfiguration, 
Optional.<Configuration>empty(), Optional.<String>empty());
+    launch(contextConfiguration, Optional.<Configuration>empty(), 
Optional.<Configuration>empty());
+  }
+
+  /**
+   * Submit Context with configuration strings.
+   * This method should be called from bridge and the configuration strings are
+   * serialized at .Net side.
+   * @param contextConfiguration
+   */
+  public void submitContext(final String contextConfiguration) {
+    launchWithConfigurationString(contextConfiguration, 
Optional.<String>empty(), Optional.<String>empty());
   }
 
   @Override
   public void submitContextAndService(final Configuration contextConfiguration,
                                       final Configuration 
serviceConfiguration) {
-    launchWithTaskString(contextConfiguration, 
Optional.of(serviceConfiguration), Optional.<String>empty());
+    launch(contextConfiguration, Optional.of(serviceConfiguration), 
Optional.<Configuration>empty());
+  }
+
+  /**
+   * Submit Context and Service with configuration strings.
+   * This method should be called from bridge and the configuration strings are
+   * serialized at .Net side.
+   * @param contextConfiguration
+   * @param serviceConfiguration
+   */
+  public void submitContextAndService(final String contextConfiguration,
+                                      final String serviceConfiguration) {
+    launchWithConfigurationString(contextConfiguration, 
Optional.of(serviceConfiguration), Optional.<String>empty());
   }
 
   @Override
@@ -129,12 +158,18 @@ public final class AllocatedEvaluatorImpl implements 
AllocatedEvaluator {
     launch(contextConfiguration, Optional.<Configuration>empty(), 
Optional.of(taskConfiguration));
   }
 
-  public void submitContextAndTask(final Configuration contextConfiguration,
+  /**
+   * Submit Context and Task with configuration strings.
+   * This method should be called from bridge and the configuration strings are
+   * serialized at .Net side.
+   * @param contextConfiguration
+   * @param taskConfiguration
+   */
+  public void submitContextAndTask(final String contextConfiguration,
                                    final String taskConfiguration) {
-    launchWithTaskString(contextConfiguration, 
Optional.<Configuration>empty(), Optional.of(taskConfiguration));
+    this.launchWithConfigurationString(contextConfiguration, 
Optional.<String>empty(), Optional.of(taskConfiguration));
   }
 
-
   @Override
   public void submitContextAndServiceAndTask(final Configuration 
contextConfiguration,
                                              final Configuration 
serviceConfiguration,
@@ -142,10 +177,19 @@ public final class AllocatedEvaluatorImpl implements 
AllocatedEvaluator {
     launch(contextConfiguration, Optional.of(serviceConfiguration), 
Optional.of(taskConfiguration));
   }
 
-  public void submitContextAndServiceAndTask(final Configuration 
contextConfiguration,
-                                             final Configuration 
serviceConfiguration,
+  /**
+   * Submit Context and Service with configuration strings.
+   * This method should be called from bridge and the configuration strings are
+   * serialized at .Net side
+   * @param contextConfiguration
+   * @param serviceConfiguration
+   * @param taskConfiguration
+   */
+  public void submitContextAndServiceAndTask(final String contextConfiguration,
+                                             final String serviceConfiguration,
                                              final String taskConfiguration) {
-    launchWithTaskString(contextConfiguration, 
Optional.of(serviceConfiguration), Optional.of(taskConfiguration));
+    launchWithConfigurationString(
+        contextConfiguration, Optional.of(serviceConfiguration), 
Optional.of(taskConfiguration));
   }
 
   @Override
@@ -166,13 +210,25 @@ public final class AllocatedEvaluatorImpl implements 
AllocatedEvaluator {
   private void launch(final Configuration contextConfiguration,
                       final Optional<Configuration> serviceConfiguration,
                       final Optional<Configuration> taskConfiguration) {
-    launchWithTaskString(contextConfiguration, serviceConfiguration,
-        
Optional.of(this.configurationSerializer.toString(taskConfiguration.get())));
+    try (final LoggingScope lb = 
loggingScopeFactory.evaluatorLaunch(this.getId())) {
+      final Configuration evaluatorConfiguration =
+          makeEvaluatorConfiguration(contextConfiguration, 
serviceConfiguration, taskConfiguration);
+
+      resourceBuildAndLaunch(evaluatorConfiguration);
+    }
   }
 
-  private void launchWithTaskString(final Configuration contextConfiguration,
-                      final Optional<Configuration> serviceConfiguration,
-                      final Optional<String> taskConfiguration) {
+  /**
+   * Submit Context, Service and Task with configuration strings.
+   * This method should be called from bridge and the configuration strings are
+   * serialized at .Net side
+   * @param contextConfiguration
+   * @param serviceConfiguration
+   * @param taskConfiguration
+   */
+  private void launchWithConfigurationString(final String contextConfiguration,
+                                    final Optional<String> 
serviceConfiguration,
+                                    final Optional<String> taskConfiguration) {
     try (final LoggingScope lb = 
loggingScopeFactory.evaluatorLaunch(this.getId())) {
       final Configuration evaluatorConfiguration =
           makeEvaluatorConfiguration(contextConfiguration, 
serviceConfiguration, taskConfiguration);
@@ -194,11 +250,47 @@ public final class AllocatedEvaluatorImpl implements 
AllocatedEvaluator {
     this.evaluatorManager.onResourceLaunch(rbuilder.build());
   }
 
+  /**
+   * Make configuration for evaluator.
+   * @param contextConfiguration
+   * @param serviceConfiguration
+   * @param taskConfiguration
+   * @return Configuration
+   */
   private Configuration makeEvaluatorConfiguration(final Configuration 
contextConfiguration,
                                                    final 
Optional<Configuration> serviceConfiguration,
-                                                   final Optional<String> 
taskConfiguration) {
+                                                   final 
Optional<Configuration> taskConfiguration) {
 
     final String contextConfigurationString = 
this.configurationSerializer.toString(contextConfiguration);
+
+    final Optional<String> taskConfigurationString;
+    if (taskConfiguration.isPresent()) {
+      taskConfigurationString = 
Optional.of(this.configurationSerializer.toString(taskConfiguration.get()));
+    } else {
+      taskConfigurationString = Optional.<String>empty();
+    }
+
+    final Optional<Configuration> mergedServiceConfiguration = 
makeRootServiceConfiguration(serviceConfiguration);
+    if (mergedServiceConfiguration.isPresent()) {
+      final String serviceConfigurationString = 
this.configurationSerializer.toString(mergedServiceConfiguration.get());
+      return makeEvaluatorConfiguration(
+          contextConfigurationString, Optional.of(serviceConfigurationString), 
taskConfigurationString);
+    } else {
+      return makeEvaluatorConfiguration(contextConfigurationString,  
Optional.<String>empty(), taskConfigurationString);
+    }
+  }
+
+  /**
+   * Make configuration for Evaluator.
+   * @param contextConfiguration
+   * @param serviceConfiguration
+   * @param taskConfiguration
+   * @return Configuration
+   */
+  private Configuration makeEvaluatorConfiguration(final String 
contextConfiguration,
+                                                   final Optional<String> 
serviceConfiguration,
+                                                   final Optional<String> 
taskConfiguration) {
+
     final ConfigurationModule evaluatorConfigModule;
     if (this.evaluatorManager.getEvaluatorDescriptor().getProcess() instanceof 
CLRProcess) {
       evaluatorConfigModule = EvaluatorConfiguration.CONFCLR;
@@ -209,21 +301,18 @@ public final class AllocatedEvaluatorImpl implements 
AllocatedEvaluator {
         .set(EvaluatorConfiguration.APPLICATION_IDENTIFIER, this.jobIdentifier)
         .set(EvaluatorConfiguration.DRIVER_REMOTE_IDENTIFIER, this.remoteID)
         .set(EvaluatorConfiguration.EVALUATOR_IDENTIFIER, this.getId())
-        .set(EvaluatorConfiguration.ROOT_CONTEXT_CONFIGURATION, 
contextConfigurationString);
+        .set(EvaluatorConfiguration.ROOT_CONTEXT_CONFIGURATION, 
contextConfiguration);
 
     // Add the (optional) service configuration
-    final Optional<Configuration> mergedServiceConfiguration = 
makeRootServiceConfiguration(serviceConfiguration);
-    if (mergedServiceConfiguration.isPresent()) {
-      final String serviceConfigurationString = 
this.configurationSerializer.toString(mergedServiceConfiguration.get());
+    if (serviceConfiguration.isPresent()) {
       evaluatorConfigurationModule = evaluatorConfigurationModule
-          .set(EvaluatorConfiguration.ROOT_SERVICE_CONFIGURATION, 
serviceConfigurationString);
+          .set(EvaluatorConfiguration.ROOT_SERVICE_CONFIGURATION, 
serviceConfiguration.get());
     }
 
     // Add the (optional) task configuration
     if (taskConfiguration.isPresent()) {
-      final String taskConfigurationString = taskConfiguration.get();
       evaluatorConfigurationModule = evaluatorConfigurationModule
-          .set(EvaluatorConfiguration.TASK_CONFIGURATION, 
taskConfigurationString);
+          .set(EvaluatorConfiguration.TASK_CONFIGURATION, 
taskConfiguration.get());
     }
 
     // Create the evaluator configuration.

Reply via email to