Repository: reef Updated Branches: refs/heads/master 1680fe31d -> 9e0181653
[REEF-1267] Implement IActiveContext.SubmitContextAndService This addressed the issue by * Implements SubmitContextAndService on ActiveContext. * Adds a LocalRuntime test to make sure that the SubmitContextAndService call works. JIRA: [REEF-1267](https://issues.apache.org/jira/browse/REEF-1267) This closes #899 Project: http://git-wip-us.apache.org/repos/asf/reef/repo Commit: http://git-wip-us.apache.org/repos/asf/reef/commit/9e018165 Tree: http://git-wip-us.apache.org/repos/asf/reef/tree/9e018165 Diff: http://git-wip-us.apache.org/repos/asf/reef/diff/9e018165 Branch: refs/heads/master Commit: 9e01816530b3d6aef5453da6f7838138d071e5d5 Parents: 1680fe3 Author: Andrew Chung <[email protected]> Authored: Wed Mar 23 13:45:08 2016 -0700 Committer: Julia Wang <[email protected]> Committed: Thu Mar 24 13:21:46 2016 -0700 ---------------------------------------------------------------------- .../ActiveContextClr2Java.cpp | 18 +- lang/cs/Org.Apache.REEF.Bridge/Clr2JavaImpl.h | 1 + .../Bridge/Clr2java/IActiveContextClr2Java.cs | 2 + .../Bridge/Events/ActiveContext.cs | 5 +- .../Functional/Bridge/TestCloseTask.cs | 1 + .../Functional/Bridge/TestContextStack.cs | 278 +++++++++++++++---- .../reef/javabridge/ActiveContextBridge.java | 5 +- .../common/driver/context/EvaluatorContext.java | 43 ++- 8 files changed, 270 insertions(+), 83 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/reef/blob/9e018165/lang/cs/Org.Apache.REEF.Bridge/ActiveContextClr2Java.cpp ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Bridge/ActiveContextClr2Java.cpp b/lang/cs/Org.Apache.REEF.Bridge/ActiveContextClr2Java.cpp index 51ff432..b3e8685 100644 --- a/lang/cs/Org.Apache.REEF.Bridge/ActiveContextClr2Java.cpp +++ b/lang/cs/Org.Apache.REEF.Bridge/ActiveContextClr2Java.cpp @@ -84,20 +84,28 @@ namespace Org { } void ActiveContextClr2Java::SubmitContext(String^ contextConfigStr) { - ManagedLog::LOGGER->LogStart("ActiveContextClr2Java::SubmitContext"); + SubmitContextAndService(contextConfigStr, nullptr); + } + + void ActiveContextClr2Java::SubmitContextAndService(String^ contextConfigStr, String^ serviceConfigStr) { JNIEnv *env = RetrieveEnv(_jvm); jclass jclassActiveContext = env->GetObjectClass(_jobjectActiveContext); - jmethodID jmidSubmitContext = env->GetMethodID(jclassActiveContext, "submitContextString", "(Ljava/lang/String;)V"); + jmethodID jmidSubmitContext = + env->GetMethodID(jclassActiveContext, "submitContextStringAndServiceString", "(Ljava/lang/String;Ljava/lang/String;)V"); if (jmidSubmitContext == NULL) { - ManagedLog::LOGGER->Log("jmidSubmitContext is NULL"); + ManagedLog::LOGGER->Log("jmidSubmitContextStringAndServiceString is NULL"); return; } + + const jstring serviceConfigJavaStr = + serviceConfigStr == nullptr ? NULL : JavaStringFromManagedString(env, serviceConfigStr); + env->CallObjectMethod( _jobjectActiveContext, jmidSubmitContext, - JavaStringFromManagedString(env, contextConfigStr)); - ManagedLog::LOGGER->LogStop("ActiveContextClr2Java::SubmitContext"); + JavaStringFromManagedString(env, contextConfigStr), + serviceConfigJavaStr); } void ActiveContextClr2Java::OnError(String^ message) { http://git-wip-us.apache.org/repos/asf/reef/blob/9e018165/lang/cs/Org.Apache.REEF.Bridge/Clr2JavaImpl.h ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Bridge/Clr2JavaImpl.h b/lang/cs/Org.Apache.REEF.Bridge/Clr2JavaImpl.h index 381df15..3254640 100644 --- a/lang/cs/Org.Apache.REEF.Bridge/Clr2JavaImpl.h +++ b/lang/cs/Org.Apache.REEF.Bridge/Clr2JavaImpl.h @@ -85,6 +85,7 @@ namespace Org { !ActiveContextClr2Java(); virtual void SubmitTask(String^ taskConfigStr); virtual void SubmitContext(String^ contextConfigStr); + virtual void SubmitContextAndService(String^ contextConfigStr, String^ serviceConfigStr); virtual void Close(); virtual void OnError(String^ message); virtual String^ GetParentId(); http://git-wip-us.apache.org/repos/asf/reef/blob/9e018165/lang/cs/Org.Apache.REEF.Driver/Bridge/Clr2java/IActiveContextClr2Java.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Driver/Bridge/Clr2java/IActiveContextClr2Java.cs b/lang/cs/Org.Apache.REEF.Driver/Bridge/Clr2java/IActiveContextClr2Java.cs index 119b110..a3ebafe 100644 --- a/lang/cs/Org.Apache.REEF.Driver/Bridge/Clr2java/IActiveContextClr2Java.cs +++ b/lang/cs/Org.Apache.REEF.Driver/Bridge/Clr2java/IActiveContextClr2Java.cs @@ -26,6 +26,8 @@ namespace Org.Apache.REEF.Driver.Bridge.Clr2java void SubmitTask(string taskConfigStr); void SubmitContext(string contextConfigStr); + + void SubmitContextAndService(string contextConfigStr, string serviceConfigStr); void Close(); http://git-wip-us.apache.org/repos/asf/reef/blob/9e018165/lang/cs/Org.Apache.REEF.Driver/Bridge/Events/ActiveContext.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Driver/Bridge/Events/ActiveContext.cs b/lang/cs/Org.Apache.REEF.Driver/Bridge/Events/ActiveContext.cs index 52c62e9..1d94004 100644 --- a/lang/cs/Org.Apache.REEF.Driver/Bridge/Events/ActiveContext.cs +++ b/lang/cs/Org.Apache.REEF.Driver/Bridge/Events/ActiveContext.cs @@ -15,7 +15,6 @@ // specific language governing permissions and limitations // under the License. -using System; using System.Runtime.Serialization; using Org.Apache.REEF.Driver.Bridge.Clr2java; using Org.Apache.REEF.Driver.Context; @@ -87,7 +86,9 @@ namespace Org.Apache.REEF.Driver.Bridge.Events public void SubmitContextAndService(IConfiguration contextConfiguration, IConfiguration serviceConfiguration) { - throw new NotImplementedException(); + var contextConfigString = _serializer.ToString(contextConfiguration); + var serviceConfigString = _serializer.ToString(serviceConfiguration); + Clr2Java.SubmitContextAndService(contextConfigString, serviceConfigString); } public void SendMessage(byte[] message) http://git-wip-us.apache.org/repos/asf/reef/blob/9e018165/lang/cs/Org.Apache.REEF.Tests/Functional/Bridge/TestCloseTask.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Tests/Functional/Bridge/TestCloseTask.cs b/lang/cs/Org.Apache.REEF.Tests/Functional/Bridge/TestCloseTask.cs index 3bf553b..aeb0917 100644 --- a/lang/cs/Org.Apache.REEF.Tests/Functional/Bridge/TestCloseTask.cs +++ b/lang/cs/Org.Apache.REEF.Tests/Functional/Bridge/TestCloseTask.cs @@ -42,6 +42,7 @@ namespace Org.Apache.REEF.Tests.Functional.Bridge /// <summary> /// This test is to close a running task from driver /// </summary> + [Collection("FunctionalTests")] public sealed class TestCloseTask : ReefFunctionalTest { private static readonly Logger Logger = Logger.GetLogger(typeof(TestCloseTask)); http://git-wip-us.apache.org/repos/asf/reef/blob/9e018165/lang/cs/Org.Apache.REEF.Tests/Functional/Bridge/TestContextStack.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Tests/Functional/Bridge/TestContextStack.cs b/lang/cs/Org.Apache.REEF.Tests/Functional/Bridge/TestContextStack.cs index f756a36..e21065c 100644 --- a/lang/cs/Org.Apache.REEF.Tests/Functional/Bridge/TestContextStack.cs +++ b/lang/cs/Org.Apache.REEF.Tests/Functional/Bridge/TestContextStack.cs @@ -16,6 +16,8 @@ // under the License. using System; +using Org.Apache.REEF.Common.Events; +using Org.Apache.REEF.Common.Services; using Org.Apache.REEF.Common.Tasks; using Org.Apache.REEF.Driver; using Org.Apache.REEF.Driver.Context; @@ -55,55 +57,140 @@ namespace Org.Apache.REEF.Tests.Functional.Bridge { string testFolder = DefaultRuntimeFolder + Guid.NewGuid().ToString("N").Substring(0, 4); CleanUp(testFolder); - TestRun(DriverConfigurations(), typeof(ContextStackHandlers), 1, "testContextStack", "local", testFolder); + TestRun(DriverConfigurations(GenericType<ActiveContextSubmitContextHandler>.Class), + typeof(ContextStackHandlers), 1, "testContextStack", "local", testFolder); ValidateSuccessForLocalRuntime(2, testFolder: testFolder); ValidateMessageSuccessfullyLoggedForDriver(TaskValidationMessage, testFolder); ValidateMessageSuccessfullyLoggedForDriver(ClosedContextValidationMessage, testFolder); CleanUp(testFolder); } - public IConfiguration DriverConfigurations() + /// <summary> + /// Does a simple test of whether a context can be submitted on top of another context + /// using SubmitContextAndService. + /// </summary> + [Fact] + public void TestContextStackingWithServiceOnLocalRuntime() { - var helloDriverConfiguration = DriverConfiguration.ConfigurationModule - .Set(DriverConfiguration.OnDriverStarted, GenericType<ContextStackHandlers>.Class) - .Set(DriverConfiguration.OnEvaluatorAllocated, GenericType<ContextStackHandlers>.Class) - .Set(DriverConfiguration.OnContextActive, GenericType<ContextStackHandlers>.Class) - .Set(DriverConfiguration.OnTaskMessage, GenericType<HelloTaskMessageHandler>.Class) - .Set(DriverConfiguration.OnTaskCompleted, GenericType<ContextStackHandlers>.Class) - .Set(DriverConfiguration.OnContextClosed, GenericType<ContextStackHandlers>.Class) - .Build(); - - return TangFactory.GetTang().NewConfigurationBuilder(helloDriverConfiguration).Build(); + string testFolder = DefaultRuntimeFolder + Guid.NewGuid().ToString("N").Substring(0, 4); + CleanUp(testFolder); + TestRun(DriverConfigurations(GenericType<ActiveContextSubmitContextAndServiceHandler>.Class), + typeof(ContextStackHandlers), 1, "testContextAndServiceStack", "local", testFolder); + ValidateSuccessForLocalRuntime(2, testFolder: testFolder); + ValidateMessageSuccessfullyLoggedForDriver(TaskValidationMessage, testFolder); + ValidateMessageSuccessfullyLoggedForDriver(ClosedContextValidationMessage, testFolder); + CleanUp(testFolder); } - private sealed class ContextStackHandlers : - IObserver<IDriverStarted>, - IObserver<IAllocatedEvaluator>, - IObserver<IActiveContext>, - IObserver<ICompletedTask>, - IObserver<IClosedContext> + public IConfiguration DriverConfigurations<T>(GenericType<T> activeContextHandlerType) where T : IObserver<IActiveContext> { - private readonly IEvaluatorRequestor _requestor; - private IAllocatedEvaluator _evaluator; - private bool _contextTwoClosed = false; + return TangFactory.GetTang().NewConfigurationBuilder( + DriverConfiguration.ConfigurationModule + .Set(DriverConfiguration.OnDriverStarted, GenericType<ContextStackHandlers>.Class) + .Set(DriverConfiguration.OnEvaluatorAllocated, GenericType<ContextStackHandlers>.Class) + .Set(DriverConfiguration.OnContextActive, activeContextHandlerType) + .Set(DriverConfiguration.OnTaskMessage, GenericType<HelloTaskMessageHandler>.Class) + .Set(DriverConfiguration.OnTaskCompleted, GenericType<ContextStackHandlers>.Class) + .Set(DriverConfiguration.OnContextClosed, GenericType<ContextStackHandlers>.Class) + .Build()) + .Build(); + } + /// <summary> + /// ActiveContext Handler that stacks 2 contexts and submits a Task on the second context. + /// </summary> + private sealed class ActiveContextSubmitContextHandler : IObserver<IActiveContext> + { [Inject] - private ContextStackHandlers(IEvaluatorRequestor evaluatorRequestor) + private ActiveContextSubmitContextHandler() { - _requestor = evaluatorRequestor; } - public void OnNext(IDriverStarted value) + public void OnNext(IActiveContext value) { - _requestor.Submit(_requestor.NewBuilder().Build()); + Logger.Log(Level.Verbose, "ContextId: " + value.Id); + switch (value.Id) + { + case ContextOneId: + var contextConfig = + Common.Context.ContextConfiguration.ConfigurationModule.Set( + Common.Context.ContextConfiguration.Identifier, ContextTwoId) + .Build(); + var stackingContextConfig = + TangFactory.GetTang() + .NewConfigurationBuilder() + .BindImplementation(GenericType<IInjectableInterface>.Class, + GenericType<InjectableInterfaceImpl>.Class) + .Build(); + + Assert.False(value.ParentId.IsPresent()); + + value.SubmitContext(Configurations.Merge(stackingContextConfig, contextConfig)); + break; + case ContextTwoId: + Assert.True(value.ParentId.IsPresent()); + Assert.Equal(value.ParentId.Value, ContextOneId); + + value.SubmitTask( + TaskConfiguration.ConfigurationModule.Set(TaskConfiguration.Identifier, "contextStackTestTask") + .Set(TaskConfiguration.Task, GenericType<TestContextStackTask>.Class) + .Build()); + break; + default: + throw new Exception("Unexpected ContextId: " + value.Id); + } } - public void OnNext(IAllocatedEvaluator value) + public void OnError(Exception error) + { + throw new NotImplementedException(); + } + + public void OnCompleted() + { + throw new NotImplementedException(); + } + } + + /// <summary> + /// Context Start Handler that invokes Start on the injected TestService. + /// </summary> + private sealed class TestContextStackContextStartHandler : IObserver<IContextStart> + { + private readonly TestService _service; + + [Inject] + private TestContextStackContextStartHandler(TestService service) + { + _service = service; + } + + public void OnNext(IContextStart value) + { + _service.Start(); + } + + public void OnError(Exception error) + { + throw new NotImplementedException(); + } + + public void OnCompleted() + { + throw new NotImplementedException(); + } + } + + /// <summary> + /// ActiveContext Handler that stacks 2 contexts. + /// Primarily used to test out the functionality of SubmitContextAndService. + /// The ActiveContext Handler starts the TestService with a ContextStartHandler on the second Context. + /// </summary> + private sealed class ActiveContextSubmitContextAndServiceHandler : IObserver<IActiveContext> + { + [Inject] + private ActiveContextSubmitContextAndServiceHandler() { - value.SubmitContext(Common.Context.ContextConfiguration.ConfigurationModule - .Set(Common.Context.ContextConfiguration.Identifier, ContextOneId) - .Build()); - _evaluator = value; } public void OnNext(IActiveContext value) @@ -113,9 +200,11 @@ namespace Org.Apache.REEF.Tests.Functional.Bridge { case ContextOneId: var contextConfig = - Common.Context.ContextConfiguration.ConfigurationModule.Set( - Common.Context.ContextConfiguration.Identifier, ContextTwoId) + Common.Context.ContextConfiguration.ConfigurationModule + .Set(Common.Context.ContextConfiguration.Identifier, ContextTwoId) + .Set(Common.Context.ContextConfiguration.OnContextStart, GenericType<TestContextStackContextStartHandler>.Class) .Build(); + var stackingContextConfig = TangFactory.GetTang() .NewConfigurationBuilder() @@ -125,15 +214,22 @@ namespace Org.Apache.REEF.Tests.Functional.Bridge Assert.False(value.ParentId.IsPresent()); - value.SubmitContext(Configurations.Merge(stackingContextConfig, contextConfig)); + var stackingContextServiceConfig = + ServiceConfiguration.ConfigurationModule + .Set(ServiceConfiguration.Services, GenericType<TestService>.Class) + .Build(); + + value.SubmitContextAndService( + Configurations.Merge(stackingContextConfig, contextConfig), stackingContextServiceConfig); + break; case ContextTwoId: Assert.True(value.ParentId.IsPresent()); Assert.Equal(value.ParentId.Value, ContextOneId); value.SubmitTask( - TaskConfiguration.ConfigurationModule.Set(TaskConfiguration.Identifier, "contextStackTestTask") - .Set(TaskConfiguration.Task, GenericType<TestContextStackTask>.Class) + TaskConfiguration.ConfigurationModule.Set(TaskConfiguration.Identifier, "contextServiceStackTestTask") + .Set(TaskConfiguration.Task, GenericType<TestContextAndServiceStackTask>.Class) .Build()); break; default: @@ -141,6 +237,68 @@ namespace Org.Apache.REEF.Tests.Functional.Bridge } } + public void OnError(Exception error) + { + throw new NotImplementedException(); + } + + public void OnCompleted() + { + throw new NotImplementedException(); + } + } + + /// <summary> + /// A simple Service class. + /// </summary> + private sealed class TestService + { + [Inject] + private TestService() + { + Started = false; + } + + public void Start() + { + Started = true; + } + + /// <summary> + /// Returns whether the Start function has been called or not. + /// </summary> + public bool Started { get; private set; } + } + + /// <summary> + /// Basic handlers used to verify that Contexts are indeed stacked. + /// </summary> + private sealed class ContextStackHandlers : + IObserver<IDriverStarted>, + IObserver<IAllocatedEvaluator>, + IObserver<ICompletedTask>, + IObserver<IClosedContext> + { + private readonly IEvaluatorRequestor _requestor; + + [Inject] + private ContextStackHandlers(IEvaluatorRequestor evaluatorRequestor) + { + _requestor = evaluatorRequestor; + } + + public void OnNext(IDriverStarted value) + { + _requestor.Submit(_requestor.NewBuilder().Build()); + } + + public void OnNext(IAllocatedEvaluator value) + { + value.SubmitContext(Common.Context.ContextConfiguration.ConfigurationModule + .Set(Common.Context.ContextConfiguration.Identifier, ContextOneId) + .Build()); + } + public void OnNext(ICompletedTask value) { Logger.Log(Level.Info, TaskValidationMessage); @@ -151,20 +309,10 @@ namespace Org.Apache.REEF.Tests.Functional.Bridge { Logger.Log(Level.Info, ClosedContextValidationMessage); - if (_contextTwoClosed == false) - { - Assert.Equal(value.Id, ContextTwoId); - Assert.True(value.ParentId.IsPresent()); - Assert.Equal(value.ParentId.Value, ContextOneId); - Assert.Equal(value.ParentContext.Id, ContextOneId); - _contextTwoClosed = true; - } - else - { - Assert.Equal(value.Id, ContextOneId); - Assert.False(value.ParentId.IsPresent()); - Assert.Equal(value.ParentContext, null); - } + Assert.Equal(value.Id, ContextTwoId); + Assert.True(value.ParentId.IsPresent()); + Assert.Equal(value.ParentId.Value, ContextOneId); + Assert.Equal(value.ParentContext.Id, ContextOneId); value.ParentContext.Dispose(); } @@ -203,10 +351,42 @@ namespace Org.Apache.REEF.Tests.Functional.Bridge } } + /// <summary> + /// A Task to ensure that an object configured in the second context configuration + /// is properly injected. + /// </summary> + private sealed class TestContextAndServiceStackTask : ITask + { + [Inject] + private TestContextAndServiceStackTask(IInjectableInterface injectableInterface, TestService service) + { + Assert.NotNull(injectableInterface); + Assert.True(injectableInterface is InjectableInterfaceImpl); + Assert.NotNull(service); + Assert.True(service.Started); + } + + public void Dispose() + { + } + + public byte[] Call(byte[] memento) + { + return null; + } + } + + /// <summary> + /// Empty interface to check whether Context configurations are + /// set correctly or not on context stacking. + /// </summary> private interface IInjectableInterface { } + /// <summary> + /// An implementation of <see cref="IInjectableInterface"/>. + /// </summary> private sealed class InjectableInterfaceImpl : IInjectableInterface { [Inject] http://git-wip-us.apache.org/repos/asf/reef/blob/9e018165/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 3fb82f2..7298a7a 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 @@ -79,12 +79,13 @@ public final class ActiveContextBridge extends NativeBridge implements Identifia ((EvaluatorContext)jactiveContext).submitTask(taskConfigurationString); } - public void submitContextString(final String contextConfigurationString) { + public void submitContextStringAndServiceString(final String contextConfigurationString, + final String serviceConfigurationString) { if (StringUtils.isEmpty(contextConfigurationString)) { throw new RuntimeException("empty contextConfigurationString provided."); } - ((EvaluatorContext)jactiveContext).submitContext(contextConfigurationString); + ((EvaluatorContext)jactiveContext).submitContextAndService(contextConfigurationString, serviceConfigurationString); } public String getEvaluatorDescriptorString() { http://git-wip-us.apache.org/repos/asf/reef/blob/9e018165/lang/java/reef-common/src/main/java/org/apache/reef/runtime/common/driver/context/EvaluatorContext.java ---------------------------------------------------------------------- diff --git a/lang/java/reef-common/src/main/java/org/apache/reef/runtime/common/driver/context/EvaluatorContext.java b/lang/java/reef-common/src/main/java/org/apache/reef/runtime/common/driver/context/EvaluatorContext.java index dbca918..5525b0c 100644 --- a/lang/java/reef-common/src/main/java/org/apache/reef/runtime/common/driver/context/EvaluatorContext.java +++ b/lang/java/reef-common/src/main/java/org/apache/reef/runtime/common/driver/context/EvaluatorContext.java @@ -154,44 +154,37 @@ public final class EvaluatorContext implements ActiveContext { } public synchronized void submitContext(final String contextConf) { - if (this.isClosed) { - throw new RuntimeException("Active context already closed"); - } - - LOG.log(Level.FINEST, "Submit context: RunningEvaluator id[{0}] for context id[{1}]", - new Object[]{getEvaluatorId(), getId()}); - - final EvaluatorRuntimeProtocol.ContextControlProto contextControlProto = - EvaluatorRuntimeProtocol.ContextControlProto.newBuilder() - .setAddContext( - EvaluatorRuntimeProtocol.AddContextProto.newBuilder() - .setParentContextId(getId()) - .setContextConfiguration(contextConf) - .build()) - .build(); - - this.contextControlHandler.send(contextControlProto); + submitContextAndService(contextConf, Optional.<String>empty()); } @Override public synchronized void submitContextAndService( final Configuration contextConfiguration, final Configuration serviceConfiguration) { + submitContextAndService( + this.configurationSerializer.toString(contextConfiguration), + this.configurationSerializer.toString(serviceConfiguration)); + } + + public synchronized void submitContextAndService(final String contextConf, final String serviceConf) { + submitContextAndService(contextConf, Optional.ofNullable(serviceConf)); + } + public synchronized void submitContextAndService(final String contextConf, final Optional<String> serviceConf) { if (this.isClosed) { throw new RuntimeException("Active context already closed"); } - LOG.log(Level.FINEST, "Submit new context: RunningEvaluator id[{0}] for context id[{1}]", - new Object[]{getEvaluatorId(), getId()}); + EvaluatorRuntimeProtocol.AddContextProto.Builder contextBuilder = + EvaluatorRuntimeProtocol.AddContextProto.newBuilder() + .setParentContextId(getId()).setContextConfiguration(contextConf); + + if (serviceConf.isPresent()) { + contextBuilder = contextBuilder.setServiceConfiguration(serviceConf.get()); + } final EvaluatorRuntimeProtocol.ContextControlProto contextControlProto = EvaluatorRuntimeProtocol.ContextControlProto.newBuilder() - .setAddContext( - EvaluatorRuntimeProtocol.AddContextProto.newBuilder() - .setParentContextId(getId()) - .setContextConfiguration(this.configurationSerializer.toString(contextConfiguration)) - .setServiceConfiguration(this.configurationSerializer.toString(serviceConfiguration)) - .build()) + .setAddContext(contextBuilder.build()) .build(); this.contextControlHandler.send(contextControlProto);
